【分布式】Docker命令与Dockerfile语法

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

注意事项

  1. 支持 TCP 或者 UDP 协议,如果不显式指定协议,默认使用 TCP 协议
  2. 需要同时以 TCP 和 UDP 协议的方式暴露同一个端口时,需要分别指定
  3. EXPOSE 并不会真正将端口发布到宿主机,而是作为一种约定,让镜像使用者在运行容器时,用 -p 分别发布约定端口,或者 -P 发布所有约定端口
  4. 如果没有暴露端口,运行容器是也可以通过 -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"]

注意事项

  1. Dockerfile 中只能有一条 CMD 指令生效,即使指定了多条,也只有最后一条生效
  2. 虽然 Dockerfie 中只有最后一条 CMD 生效,但每一条 CMD 指令会新增一个镜像层,因此只定义一条 CMD 指令,可以使用 && 连接多个命令
  3. exec 方式是通过 JSON 数组的方式解析的,因此要使用双引号,而不是单引号
  4. 与 RUN 指令不同,RUN 指令是在构建镜像的过程中执行,CMD 命令是在容器启动时执行
  5. 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
  1. 如果不显式指定,默认的 STOPSIGNAL 是 SIGTERM
  2. 新建或运行容器时,可以通过 --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 - 未使用退出状态码

注意事项

  1. Dockerfile 中定义了 HEALTHCHECK 指令,启动容器后,状态中会多出健康状态(Health Status)这一项,值为 healthy 或者 unhealthy
  2. 同一 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"]

注意事项

  1. Linux 系统的默认 Shell 是 [“/bin/sh”, “-c”]
  2. Windows 系统的默认 Shell 是 [“cmd”, “/S”, “/C”]
  3. 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

注意事项

  1. 除 FROM, MAINTAINER, ONBUILD 以外的构建指令都可以作为触发指令
  2. 触发指令不会影响定义触发指令的所在的镜像,构建结束后,触发器列表会被保存在当前镜像的元数据中的 ONBUILD 属性中,可以用 docker inspect 命令查看

参考资料

一篇文章带你吃透 Dockerfile - 掘金

Docker基础:Docker 常用命令梳理_#开源_天使不哭_InfoQ写作社区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疼疼蛇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值