Back to Blogs
docker
docker-compose
docker-network
docker-swarm

Docker 进阶知识

Soloman
2022-05-19

Docker 进阶知识

1 Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

指令描述
ADD将文件、目录或远程URL复制到镜像中,添加本地或远程文件和目录
ARG定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置
CMDdocker run 时指定容器创建的默认命令(可以被覆盖)
COPY将文件或目录复制到镜像中
ENTRYPOINT指定默认可执行文件,设置容器创建时的主要命令(不可被覆盖)
ENV在容器内部设置环境变量
EXPOSE声明容器运行时监听的特定网络端口
FROM指定基础镜像,用于后续的指令构建。从基础镜像创建新的构建阶段
HEALTHCHECK定义周期性检查容器健康状态的命令
LABEL向镜像添加元数据,使用键值对的形式
MAINTAINER指定镜像的作者(已弃用,推荐使用LABEL指令)
ONBUILD当该镜像被用作另一个构建过程的基础时,才会执行命令
RUNdocker build 时执行构建命令
SHELL设置镜像的默认shell
STOPSIGNAL指定退出容器的系统调用信号
USER设置用户和组ID
VOLUME为容器创建挂载点或声明卷
WORKDIR更改工作目录,设置后续指令的工作目录

常用命令举例:

# 复制指令,从上下文目录中复制文件或者目录到容器里指定路径(路径不存在的话,会自动创建)
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

# ADD在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体使用COPY还是ADD,可以根据是否需要自动解压来决定。

# CMD 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
# CMD 在docker run 时运行,RUN 是在 docker build 时
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

# ENTRYPOINT 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
# 在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

# 设置环境变量,可通过$key访问
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

# 构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
ARG <参数名>[=<默认值>]

# 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

# 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
EXPOSE <端口1> [<端口2>...]

# 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在
WORKDIR <工作目录路径>

# 用于指定执行后续命令的用户和用户组(用户和用户组必须提前已经存在)
USER <用户名>[:<用户组>]

# 用于指定某个程序或者指令来监控 docker 容器服务的运行状态
HEALTHCHECK [选项] CMD <命令> # 设置检查容器健康状况的命令
HEALTHCHECK NONE # 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

# LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式
LABEL <key>=<value> <key>=<value> <key>=<value> ...

2 docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

# 查看帮助
docker compose --help

# 启动使用 Docker Compose 编排的多个容器。它会根据指定的配置文件(默认为 docker-compose.yml)创建并运行多个容器,使它们协同工作
# 启动所有服务
docker compose up

# 在后台启动所有服务
docker compose up -d

# 在后台所有启动服务,指定编排文件
docker compose -f docker-compose.yml up -d

# 用于列出由 Docker Compose 管理的容器的状态。它会显示与配置文件中定义的服务(服务由一个或多个容器组成)相关联的容器的详细信息
# 基本用法
docker compose ps

# 指定配置文件
docker compose -f <file> ps

# 显示详细信息,使用 -a 选项可以显示所有容器的详细信息,包括已停止的容器。默认只显示正在运行的容器
docker compose ps -a

# 停止正在运行的容器,可以通过 docker compose start 再次启动
docker compose stop [OPTIONS] [SERVICE...]

# 停止和移除由 docker compose up 创建的容器、网络和卷。
# 停止由 docker compose up 启动的容器。移除这些容器。移除关联的网络。移除关联的卷。
docker compose down [OPTIONS]

# 查看由 docker compose 启动的服务的日志
docker compose logs [OPTIONS] [SERVICE...]

# 重新启动由 docker compose 启动的服务容器
docker compose restart [OPTIONS] [SERVICE...]

# 删除所有(停止状态的)服务容器
docker compose rm [OPTIONS] [SERVICE...]

3 docker network

Docker网络是Docker容器之间和容器与外部网络之间的通信和连接的一种机制

# 查看网络
docker network ls

# 基础用法
docker network create 网络名称

# 创建网络时是可以添加一系列参数的:
# --driver:驱动程序类型
# --gateway:主子网的IPV4和IPV6的网关
# --subnet:代表网段的CIDR格式的子网
# mynet:自定义网络名称
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet

# 查看网络详细信息
docker network inspect 网络名称 

# 将容器链接到指定的网络
docker network connect 网络名称 容器名称

# 断开某个容器的网络
docker network disconnect 网络名称 容器名称

# 删除所有不再使用网络
docker network prune

# 删除一个或多个网络
docker network rm 网络名称 

3.1 bridge

为每一个容器分配设置 ip ,并将容器连接到 docker0 虚拟网桥上,这也是默认网络模式

3.2 host

容器不会创建自己的网卡配置 ip 等,而是直接使用宿主机的 ip 和端口,外部主机与容器可以直接通信

3.3 overlay

当你需要在不同的Docker主机上运行的容器进行通信,或者当多个应用程序使用Swarm服务一起工作时的最佳选择

3.4 macvlan

给每个容器分配对应的MAC地址,让容器看起来就像真实的物理设备一样

3.5 IPvlan

IPvlan类似于Macvlan,但不为容器分配唯一的MAC地址。当可以分配给容器的MAC地址数量受到限制时,可考虑使用IPvlan

3.6 none

不为Docker容器进行任何网络配置,用于一些无需网络的容器,例如执行本地计算的服务

4 docker swarm mode

具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得Docker 原生的Swarm mode集群具备与Mesos、Kubernetes叫板的实力。更适合中小型企业。

5 Reference

1.Overview of docker compose CLI

2.Docker Compose File

3.Network drivers overview

4.Swarm mode overview