Docker命令
官网:https://docs.docker.com/
安装命令 (Centos7下安装ce版本)
安装先学卸载,卸载命令
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
设置本地源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装(ce社区版,ee是企业版自选)
yum install docker-ce docker-ce-cli containerd.io
启动并设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
验证Docker
版本
docker -v
然后使用下面的命令可以运行hello-world
程序,因为Docker
中还没有hello-world
程序的镜像,所以会先pull
(下载)下来然后运行。
docker run hello-world
环境信息命令
查看 docker 版本号 包含容器、镜像统计信息
docker -v
显示 docker 的版本信息,包括 docker 客户端 和 docker 服务端基本信息
docker version
查看容器信息内部的详细信息,包括容器、镜像统计、存储、网络、日志、内存、CPU 等信息。
docker info
镜像仓库命令
登录镜像 docker login -u 用户名 -p 密码
docker login -u xxxxx -p xxxxxx
退出镜像
docker logout
检索镜像 docker search
docker search tomcat
远程拉取镜像到本地 docker pull
docker pull mongo:4.2
本地推送镜像的远程仓库 docker push
docker push mytomcat:v1
本地镜像仓库管理
使用 Dockerfile 文件 创建镜像
docker build
列出本地镜像列表
docker images
删除本地镜像,前提是移除了基于该镜像的所有容器
docker rmi
本地镜像打上 tag 标签
docker tag
将指定镜像保存成 tar 压缩文件
docker save -o [保存的目标文件名称] [镜像名称]
docker save -o mytomcat2.5.tar runoob/mytomcat:v2.5
基于 docker save 归档文件中创建镜像docker import
docker import mytomcat2.5.tar runoob/mytomcat2.6
导入使用 docker save 命令导出的镜像
docker load
查看指定镜像的创建历史记录
docker history
容器生命周期管理命令
创建容器
docker create --name tomcattest tomcat:8.5.38
在运行的容器中执行命令
-
docker exec :进入容器内部,执行一个命令
-
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
-
mn :要进入的容器的名称
-
bash:进入容器后执行的命令,bash是一个linux终端交互命令
docker exec -it mongo bash
创建一个新的容器并运行一个命令 docker run
常见参数
-
–name:指定容器名称
-
-p:指定端口映射
-
-d:让容器后台运行
docker run --name tomcat8 -d -p 28080:8080 tomcat:8.5.38
启动一个或多个已经被停止的容器
docker start tomcat:8.5.38
停止一个运行中的容器
docker stop tomcat:8.5.38
重启容器
docker restart tomcat:8.5.38
暂停容器中所有的进程
docker pause tomcat:8.5.38
恢复容器中所有的进程
docker unpause tomcat:8.5.38
杀掉一个运行中的容器
docker kill tomcat:8.5.38
删除容器,运行中的容器 需要加 -f 参数才可以强制删除
docker rm
容器操作相关命令
列出容器信息 (参数-a查看所有容器,包括已经停止的)
docker ps
获取容器/镜像的元数据,可以查看容器、镜像最完整的信息
docker inspect
查看容器中运行的进程信息
docker top mysql8
连接到正在运行中的容器,不建议用。使用 docker exec代替
docker attach #不建议使用
docker exec
阻塞容器运行,直到停止。很少用
docker wait
将文件系统作为一个 tar 归档文件导出到 STDOUT
docker export
列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
docker port mysql8
容器改名
docker rename mysql8 mysql9
查看 docker 进程信息
docker stats
容器 rootfs 文件系统命令
从容器创建一个新镜像
docker commit -a "xiaoming" -m "mytomcat" a404c6c174a2 mytomcat:v1
说明:容器与主机之间的数据拷贝
docker cp tomcat8:/usr/local/tomcat/conf /usr/local/tomcat
docker cp /www/test 96f7f14e99ab:/www/
检查容器里文件结构的更改
docker diff
Docker 数据卷操作
数据卷操作的基本语法
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
挂载数据卷
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中
Dockerfile语法
FROM (引用基础镜像)
指定基础镜像或父级镜像
语法
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
示例
FROM redis
FROM redis:7.0.5
FROM redis@7614ae9453d1
LABEL (类似于注释、Metadata)
为镜像添加元数据
语法
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例
LABEL author="Jason 315" version="1.0.0" description="Dockerfile案例"
LABEL author="Jason 315" \
version="1.0.0" \
description="Dockerfile案例"
ENV(设置环境变量或常量)
语法
ENV <key>=<value> ...
ENV <key> <value>
示例
ENV MY_NAME="Jason315" MY_CAT="Tomcat"
ENV MY_CAT Kitty
WORKDIR (建议用WORKDIR,禁止用RUN cd,尽量使用绝对目录!)
指定后续指令的工作目录,类似于 Linux 中的 cd 命令
语法
WORKDIR /path/to/workdir
示例
WORKDIR /a
WORKDIR b
WORKDIR c
备注
当前工作目录为 /a/b/c
USER(指定默认用户)
指定当前构建阶段以及容器运行时的默认用户,以及可选的用户组
语法
USER <user>[:<group>]
USER <user>[:<GID>]
USER <UID>[:<GID>]
USER <UID>[:<group>]
示例
USER jason315
USER jason315:jasonGroup
VOLUME(挂载数据卷)
创建具有指定名称的挂载数据卷,用于数据持久化(必须使用双引号,而不是单引号)
语法
VOLUME ["volume1", "volume2", ...]
VOLUME volume1 volume2 ...
示例
VOLUME ["/demo/data", "/demo/logs"]
VOLUME /myvol
ADD
将构建上下文中指定目录下的文件(src)复制到镜像文件系统的指定位置(dest)
语法
ADD [--chown=<user>:<group>] [--checksum=<checksum>] <src>... <dest>
# 路径中含有空格的情况,可以使用第二种方式
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
# 处于实验阶段的特性,直接添加 Git 资源到镜像文件系统中
ADD <git ref> <dir>
示例
ADD demo.txt /dest_dir/demo.txt # 将 demo.txt 复制到 /dest_dir 下的 demo.txt
ADD demo* /dest_dir/ # 将以 demo 开头的文件复制到 /dest_dir 下
ADD dem?.txt /dest_dir/ # ? 被一个单字符替换,可以是 demo.txt, 将符合条件的文件复制到 /dest_dir 下
ADD test/ /dest_dir/ # 将 test 文件夹下的所有文件都复制到 /dest_dir/ 下
ADD test/ dest_dir/ # 将 test 文件夹下的所有文件都复制到 <WORKDIR>/dest_dir/ 下
ADD http://example.com/a/url.txt / # 从 URL 下载 url.txt 文件,另存为文件 /a/url.txt,其中文件夹 /a/ 是自动创建的
src 含有特殊字符时的语法
# 假设文件名为 demo[0].txt, 其中含有特殊符号 [ 和 ]
ADD demo[[]0].txt /dest_dir
COPY
功能和语法与 ADD 类似,但是不会自动解压文件,也不能访问网络资源
语法
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
EXPOSE(暴露端口给link到当前容器的容器)
约定容器运行时监听的端口,通常用于容器与外界之间的通信
语法
EXPOSE <port> [<port>/<protocol>...]
示例
EXPOSE 8080
EXPOSE 80/tcp
EXPOSE 80/udp
EXPOSE 9090/tcp 9090/udp
注意事项
- 支持 TCP 或者 UDP 协议,如果不显式指定协议,默认使用 TCP 协议
- 需要同时以 TCP 和 UDP 协议的方式暴露同一个端口时,需要分别指定
- EXPOSE 并不会真正将端口发布到宿主机,而是作为一种约定,让镜像使用者在运行容器时,用 -p 分别发布约定端口,或者 -P 发布所有约定端口
- 如果没有暴露端口,运行容器是也可以通过 -p 的方式映射端口
ports(暴露容器端口到主机的任意端口或指定端口)
#不管是否指定主机端口,使用ports都会将端口暴露给主机
ports:
- "80:80" # 绑定容器的80端口到主机的80端口
- "9000:8080" # 绑定容器的8080端口到主机的9000端口
- "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
和EXPOSE
的区别是,EXPOSE
不会将端口暴露给主机。
RUN(运行命令)
用于在构建镜像过程中执行命令,有两种执行方式
第一种,以 shell 的方式执行
法
RUN <command>
示例
RUN echo "Hello Dockerfile"
在这种方式下,命令是由 Shell 执行的,Linux 系统的默认 Shell 是 /bin/sh -c,Windows 系统的默认 Shell 是 cmd /S /C。可以通过 SHELL 指令修改默认 Shell
第二种,以 exec 的方式执行
语法
RUN ["executable", "param1", "param2"]
示例
RUN ["echo", "Hello Dockerfile"]
RUN ["sh", "-c", "echo $HOME"]
RUN ["/bin/bash", "-c", "echo", "Hello Dockerfile"]
这种方式不会进行某些 Shell 处理,如环境变量替换。如果要进行变量替换等操作,有两种解决方案,其一,以 Shell 方式执行,其二,直接执行 sh 命令。最终的变量替换处理是由 Shell 完成的,而不是 Docker
# 方式一,回到 Shell 执行方式
RUN echo $HOME
# 方式二,直接执行 sh 命令
RUN ["sh", "-c", "echo $HOME"]
CMD (设置容器启动后默认执行的命令和参数)
构建镜像成功后,所创建的容器启动时执行的命令。CMD 指令有 3 种形式
语法
CMD command param1 param2 # shell 方式
CMD ["executable","param1","param2"] # exec 方式,这是推荐的方式
CMD ["param1","param2"] # 作为 ENTRYPOINT 的默认参数,这种方式是 exec 方式的特殊形式
示例
CMD echo "Hello Dockerfile"
CMD ["echo", "Hello Dockerfile"]
FROM ubuntu
CMD ["/usr/bin/wc", "--help"]
注意事项
- Dockerfile 中只能有一条 CMD 指令生效,即使指定了多条,也只有最后一条生效
- 虽然 Dockerfie 中只有最后一条 CMD 生效,但每一条 CMD 指令会新增一个镜像层,因此只定义一条 CMD 指令,可以使用 && 连接多个命令
- exec 方式是通过 JSON 数组的方式解析的,因此要使用双引号,而不是单引号
- 与 RUN 指令不同,RUN 指令是在构建镜像的过程中执行,CMD 命令是在容器启动时执行
- docker run 后的命令行参数会覆盖Dockerfile中 CMD 中的命令
ENTRYPOINT( 设置容器启动时运行的命令,让容器以应用程序或服务的形式运行)
用于配置容器以可执行的方式运行。ENTRYPOINT 指令有 2 种形式
语法
ENTRYPOINT ["executable", "param1", "param2"] # 推荐方式
ENTRYPOINT command param1 param2
示例 1
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
示例 2
FROM ubuntu
ENTRYPOINT exec top -b
其他指令
MAINTAINER(deprecated)
设置镜像的 Author 字段,新版本即将废弃,推荐使用 LABEL 代替
MAINTAINER jason315
ARG
定义构建变量,便于在 Dockerfile 中接收外部参数,这些变量不会持久化到镜像层中
语法
ARG <name>[=<default value>]
示例 1
ARG build_user # 不带默认值的构建变量
ARG build_comment="built by somebody" # 带默认值的构建变量
示例 2
ARG build_user=Jason315
ENV build_user=Jason520
RUN echo $build_user # 此时 build_user 已经被 ENV 指令覆盖为 Jason520
构建镜像时,可以通过 –build-arg 传入构建变量
docker build -t my-img --build-arg build_user=Jason315 .
STOPSIGNAL
设置在 docker stop 时被发送到容器内执行退出的系统调用信号。
语法
STOPSIGNAL signal
示例
STOPSIGNAL SIGTERM
STOPSIGNAL 9
- 如果不显式指定,默认的 STOPSIGNAL 是 SIGTERM
- 新建或运行容器时,可以通过 --stop-signal 覆盖 STOPSIGNAL
HEALTHCHECK
在容器内执行某些命令,用于检查容器的健康状况,确认容器是否还在正常运行
语法
HEALTHCHECK [OPTIONS] CMD command # 在容器内运行命令,检查容器的健康状况
HEALTHCHECK NONE # 禁用任何健康检查,包括从基础镜像继承而来的
CMD 前的可选参数
--interval=DURATION (执行时间间隔,默认值 30s)
--timeout=DURATION (执行单次命令的超时时间,如果超时,会增加失败次数,默认值 30s)
--start-period=DURATION (启动时间,在该时间段内,检查失败不计入总失败次数,默认值 0s)
--retries=N (健康检查失败后的重试次数,默认值 3)
示例
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康检查命令的退出状态码有 3 种情况
- 0: healthy - 容器正常运行中,处于可用状态
- 1: unhealthy - 容器运行状态异常,不可用
- 2:reserved - 未使用退出状态码
注意事项
- Dockerfile 中定义了 HEALTHCHECK 指令,启动容器后,状态中会多出健康状态(Health Status)这一项,值为 healthy 或者 unhealthy
- 同一 Dockerfile 中,只有最后一条 HEALTHCHECK 生效
SHELL
设置以 shell 方式执行的指令的默认 Shell,这些指令包括 RUN, CMD, ENTRYPOINT
语法
SHELL ["executable", "parameters"]
示例 1
FROM ubuntu
SHELL ["/bin/sh", "-c"]
示例 2
FROM microsoft/windowsservercore
SEHLL ["powershell", "-command"]
注意事项
- Linux 系统的默认 Shell 是 [“/bin/sh”, “-c”]
- Windows 系统的默认 Shell 是 [“cmd”, “/S”, “/C”]
- SHELL 指令可多次使用,并影响后续以 shell 方式执行的 RUN, CMD, ENTRYPOINT 指令
ONBUILD
将一个触发指令添加到镜像中,当该镜像作为另一个镜像的基础镜像时执行。简单来说,另一个 Dockerfile 的 FROM 指令使用这个镜像作为父级镜像时触发执行
语法
ONBUILD <INSTRUCTION>
定义 ONBUILD 的 Dockerfile
FROM ubuntu
ONBUILD ["echo", "I'm used as a base image"]
构建父级镜像
docker build -t onbuild-image .
触发 ONBUILD 的 Dockerfile
FROM onbuild-image
RUN ["echo", "I just trigger the ONBUILD instruction"]
查看定义 ONBUILD 所在的镜像暴露的触发器列表
docker inspect -f='{{json .ContainerConfig.OnBuild}}' onbuild-image
注意事项
- 除 FROM, MAINTAINER, ONBUILD 以外的构建指令都可以作为触发指令
- 触发指令不会影响定义触发指令的所在的镜像,构建结束后,触发器列表会被保存在当前镜像的元数据中的 ONBUILD 属性中,可以用 docker inspect 命令查看