启动Docker服务:systemctl start docker
停止Docker服务:systemctl stop docker
重启Docker服务:systemctl restart docker
查看Docker服务状态:systemctl status docker
设置Docker开机自启:systemctl enable docker
关闭Docker开机自启:systemctl disable docker
拉取镜像:docker pull <image_name>
列出本地镜像:docker images [-a:全部 -q:只显示镜像ID]
运行容器:docker run <image_name>
创建新容器,同 run,但不启动: docker create image
列出正在运行的容器:docker ps [-q:只显示容器ID]
列出所有容器(包括已停止的):docker ps -a
修改启动策略:docker update --restart=unless-stopped my-nginx
停止容器:docker stop <container_id>
启动容器:docker start <container_id>
进入容器:docker exec -it <container_id> /bin/bash
删除容器:docker rm <container_id>
删除镜像:docker rmi <image_id>
导入镜像:docker load -i /path/to/images.tar
导出镜像:docker save nginx:latest | gzip > nginx.tar.gz
清空本机docker环境:
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)
no:默认值,不会自动重启on-failure[:max-retries]:只有容器非正常退出(exit code ≠ 0)时才重启,可指定最大重试次数always:无论退出状态如何,总是重启(推荐用于开机自启)unless-stopped:总是重启,除非手动停止容器(最推荐用于自启)docker run <可选参数> image 命令 #启动容器(无镜像会先下载镜像)--name myname 容器名字-c 指定使用cpu的份额-d 以后台方式运行并且返回ID,启动守护进程式容器-i 使用交互方式运行容器,通常与 -t 同时使用-t 为容器重新分配一个伪输入终端。也即启动交互式容器-p 指定容器端口 -p 物理机端口:容器端口 映射端口-P 随机指定端口-v 给容器挂载存储卷docker run -it 镜像名称:标签 /bin/bashdocker run -id 镜像名称:标签,通过这种方式创建的容器,不会直接进入到容器界面,而是在后台运行了容器,如果我们需要进去,则还需要一个命令。docker exec -it 容器名称 /bin/bash 通过这种方式运行的容器,就不会自动退出了。docker tag 镜像名:版本 新镜像名:版本 #复制镜像并且修改名称
docker commit -a "xxx" -c "xxx" 镜像ID 名字:版本 #将容器的状态制作成为一个镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
docker build -f <dockerfile文件名> -t <镜像名字以及标签> /path/to/dockerfile/directory #创建镜像 如果 dockerfile 为 Dockerfile,则不同指定-f
docker logs 容器实例的ID #查看容器日志
docker rename 旧名字 新名字 #给容器重新命名
docker top 容器实例的ID #查看容器内进程
docker ps -a #列出所有容器(不加-a就是在运行的)
docker rm 容器实例的ID #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill 容器实例的ID #杀掉容器
docker history 容器实例的ID #查看docker镜像的变更历史
docker start 容器实例的ID #启动容器
docker restart 容器实例的ID #重启容器
docker stop 容器实例的ID #停止正在运行的容器
docker attach [或 docker exec] 容器实例的ID #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会启动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect 镜像名称:镜像标签 #查看镜像内源数据
docker cp 容器id:容器内路径 目的主机路径 #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
docker export d19aa2235b2b > abcd.tar #将整个容器导出
cat 备份文件 | docker import - 镜像用户/镜像名:镜像版本号 #如果不小心删除了容器(docker rm id),可以导入容器
crlt + P + Q #退出容器但是不终止运行
docker volum ls #查看所有卷的情况。
docker run -it -v 主机目录:容器目录 /bin/bash #挂载数据卷
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied
解决办法:在挂载目录后多加一个 -privileged=true 参数即可(使容器具有类型 root 的权限,慎用,应该修改对应目录的权限)
匿名挂载:docker run -d -P --name=nginxt01 -v /etc/nginx nginx
具名挂载:docker run -d -P --name=nginxt02 -v volumname:/etc/nginx nginx
docker inspect 容器ID #查看容器内详细数据。其中的 Mounts 代表着挂载,type是类型(绑定),source是源(宿主机/home/test01),也就是把什么挂载到哪里。destination(容器内/home)就是挂载的目标路径了。
如何确定是具名挂载还是匿名挂载:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
通过 -v 容器内路径:ro | rw 可以改变读写权限
ro readonly #只读
rw readwrite #可写可读
例:docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx
docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx
Dockerfile是一个包含创建镜像所有命令的文本文件,包含了一条条指令和说明, 每条指令构建一层,,通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建。脚本中的每一个命令,都是一层镜像。
dockerfile 是面向开发的,发布项目做镜像的时候就要编写dockerfile文件。
dockerfile:构建文件,定义了一切的步骤,源代码。
dockerImanges:通过dockerfile构建生成的镜像,最终发布和运行的产品。
docker 容器:容器就是镜像运行起来提供服务的。
FROM <image>:<tag> #基础镜像 。 (centos)
MAINTAINER Jack yu #镜像的作者和邮箱。(已过时,推荐 LABEL)
LABEL "author"="zmy" #添加元数据标签
RUN #镜像构建(docker build 时运行)的时候需要执行的命令。
&& 连接多个命令RUN apt-get update && apt-get install -y python3RUN ["apt-get", "update"]RUN ["apt-get", "install", "-y", "python3"]CMD #类似于 RUN 指令,用于运行程序(docker run 时运行)(只有最后一个会生效,可被替代)
CMD python app.pyCMD ["python", "app.py"]docker run my_image python script.py,RUN 的默认命令会被覆盖ENTRYPOINT #类似于 CMD 指令,配置容器启动时的默认执行命令,
ENTRYPOINT 指令的命令会在容器启动时始终执行,无论在 docker run 命令中是否指定了其他命令。它不会被覆盖,而是作为容器的主要执行命令。docker run 命令中指定了其他命令,这些命令将作为 ENTRYPOINT 指令的参数进行传递。也就是说,ENTRYPOINT 指令中的命令将成为执行时的前缀。#Dockerfile
FROM ubuntu:latest
ENTRYPOINT ["echo", "Hello"]
$ docker build -t my_image .
$ docker run my_image
# 输出 Hello
$ docker run my_image "World"
# 输出 Hello World
EXPOSE 80 #对外开放的端口。启动容器时指定端口映射 docker run -p 8080:80 my_imageENV MY_NAME John Doe #设置环境变量,这些环境变量将在容器运行时可用。通过 docker run 命令的 -e 选项来覆盖环境变量的值 docker run -e MY_NAME="Alice" my_imageADD source destination #将文件、目录或远程URL复制到镜像中。ADD指令还支持自动解压缩COPY #复制指令,将文件拷贝到镜像中。它不支持自动解压缩功能VOLUME ["/app/data", "/app/logs"] #声明挂载卷。docker run -v /host/data:/app/data -v /host/logs:/app/logs my_image 将主机的/host/data和/host/logs目录分别映射到容器中的/app/data和/app/logs挂载点,实现了主机和容器之间的数据共享USER #用于指定执行后续命令的用户和用户组,默认情况下,Docker容器在启动时以root用户身份运行。WORKDIR /app #设置工作目录(类似CD命令)。ARG MY_ENV=production #用于定义构建参数,在构建过程中可以通过 --build-arg 选项进行覆盖 docker build --build-arg MY_ENV=development -t my_image .ONBUILD #触发器,在其他镜像以当前镜像为基础构建镜像时执行。STOPSIGNAL #用于设置在停止容器时要使用的信号,当使用 docker stop 命令停止容器时,Docker会向容器发送一个指定的信号HEALTHCHECK #用于定义容器的健康检查机制。--interval=5s:设置健康检查的间隔时间5s,默认为30秒。--timeout=3s:设置健康检查命令的超时时间3s,默认为30秒。--start-period=10s:设置容器启动后的等待时间10,等待一定时间后开始进行健康检查,默认为0秒。--retries=5:设置健康检查失败后重试的次数5,默认为3次。HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1 每隔5秒运行一次curl命令来检查 http://localhost/ 是否返回正常响应(状态码为200)SHELL #是Dockerfile中的一个特殊指令,用于设置在构建镜像时使用的Shell SHELL ["/bin/bash", "-c"]docker login -u 账户名 #登陆命令
docker out #退出命令
docker push 账户名/镜像ID:版本号 #将镜像推到远程仓库
docker 中的网络具有不同的网络驱动类型,各具特点:
docker network create -d bridge --subnet=192.168.1.0/24 my_bridge 可省略 -ddocker run -d --network host nginxdocker run -d --network none nginxdocker network create -d overlay my_overlaydocker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlandocker 中有一个默认的 bridge 类型的网络,名称也是 bridge,又称 docker0,默认子网:172.17.0.0/16,网关:172.17.0.1,所有未指定网络的容器都连到这里,自定义 bridge:更好的 DNS 解析、网络隔离、可配置子网
自己指定使用的网络 IP
# 方法 1:创建网络时指定子网,运行时指定 IP
docker network create --subnet=192.168.1.0/24 mynet
docker run -d \
--name web \
--network mynet \
--ip 192.168.1.100 \
nginx
# 方法 2:连接已有网络时指定 IP
docker network connect --ip 192.168.1.101 othernet nginx
docker network