此内容整理自Docker Compose | 菜鸟教程 (runoob.com),加深自己对此部分内容的印象。
一、Docker Dockerfile
1、Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
2、使用Dockerfile定制镜像
2.1定制nginx镜像:
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件。
(1)FROM:定制的镜像都是基于 FROM 的镜像,上方的例子即后续的操作都是基于nginx。(2)RUN:用于执行后面跟着的命令行命令。有以下两种格式:
shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
#以上执行会创建3层镜像。可简化为:
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
#以&&符号连接命令,只创建1层镜像
2.2开始构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作。
通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。
$ docker build -t nginx:v3 .
#最后的 . 代表本次执行的上下文路径
(1)上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
3、指令详解
Dockerfile 指令 | 说明 | 详细内容 |
---|---|---|
FROM | 指定基础镜像,用于后续的指令构建。 | |
MAINTAINER | 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) | |
LABEL | 添加镜像的元数据,使用键值对的形式。 | LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式, 语法格式如下: LABEL <key>=<value> <key>=<value> <key>=<value> ... |
RUN | 在构建过程中在镜像中执行命令。 | |
CMD | 指定容器创建时的默认命令。(可以被覆盖) | 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被docker run 命令行参数中指定要运行的程序所覆盖。 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。 格式: CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。 |
ENTRYPOINT | 设置容器创建时的主要命令。(不可被覆盖) | 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。 优点:在执行 docker run 的时候可以指定ENTRYPOINT 运行所需的参数。 注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。 格式: ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。 |
EXPOSE | 声明容器运行时监听的特定网络端口。 | 仅仅只是声明端口。 作用:
格式: EXPOSE <端口1> [<端口2>...] |
ENV | 在容器内部设置环境变量。 | 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。 格式: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... |
ADD | 将文件、目录或远程URL复制到镜像中。 | ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
|
COPY | 将文件或目录复制到镜像中。 | 格式: COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。 <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的filepath.Match 规则。 <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。 |
VOLUME | 为容器创建挂载点或声明卷。 | 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 作用:
格式: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。 |
WORKDIR | 设置后续指令的工作目录。 | 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。 docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。 格式: WORKDIR <工作目录路径> |
USER | 指定后续指令的用户上下文。 | 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。 格式: USER <用户名>[:<用户组>] |
ARG | 定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。 | 构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。 构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。 格式: ARG <参数名>[=<默认值>] |
ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器。 | 用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。 格式: ONBUILD <其它指令> |
STOPSIGNAL | 设置发送给容器以退出的系统调用信号。 | |
HEALTHCHECK | 定义周期性检查容器健康状态的命令。 | 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。 格式: HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。 |
SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。 |
二、Docker Compose
1、Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
2、Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境。
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
-
最后,执行 docker-compose up 命令来启动并运行整个应用程序。-d选项为在后台执行。
3、yml配置指令
version | 指定本 yml 依从的 compose 哪个版本制定的。 |
build | 指定为构建镜像上下文路径; version: "3.7" 或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args version: "3.7" dockerfile: Dockerfile-alternate #dockerfile:指定构建镜像的 Dockerfile 文件名。 args: #args:添加构建参数,这是只能在构建过程中访问的环境变量。 buildno: 1 - "com.example.description=Accounting webapp" |
cap_add,cap_drop | 添加或删除容器拥有的宿主机的内核功能。 cap_add: cap_drop: |
cgroup_parent | 为容器指定父 cgroup 组,意味着将继承该组的资源限制。 cgroup_parent: m-executor-abcd |
command | 覆盖容器启动的默认命令。 command: ["bundle", "exec", "thin", "-p", "3000"] |
container_name | 指定自定义容器名称,而不是生成的默认名称。 container_name: my-web-container |
depends_on | 设置依赖关系。 docker-compose up :以依赖性顺序启动服务。 docker-compose up SERVICE :自动包含 SERVICE 的依赖项。 docker-compose stop :按依赖关系顺序停止服务。 version: "3.7" |
deploy | 指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。 |
devices | 指定设备映射列表。 |
dns | 自定义 DNS 服务器,可以是单个值或列表的多个值。 |
dns_search | 自定义 DNS 搜索域。可以是单个值或列表。 |
etrypoint | 覆盖容器默认的 entrypoint。 |
env_file | 从文件添加环境变量。可以是单个值或列表的多个值。 |
environment | 添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。 environment: |
expose | 暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数 expose: |
extra_hosts | 添加主机名映射。 extra_hosts: |
healthcheck | 用于检测 docker 服务是否健康运行。 healthcheck: |
image | 指定容器运行的镜像。 |
logging | 服务的日志记录配置。 driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项 driver: "json-file" driver: "syslog" driver: "none" 仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量max-file和单个文件大小max-size。当达到文件限制上限,会自动删除旧得文件。 logging: syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。 logging: |
network_mode | 设置网络模式。 network_mode: "bridge" |
networks | 配置容器连接的网络,引用顶级 networks 下的条目 。 aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。 services: |
restart |
注:swarm 集群模式,请改用 restart_policy。 |
secrets | 存储敏感数据 version: "3.1" services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret secrets: - my_secret secrets: my_secret: file: ./my_secret.txt |
security_opt | 修改容器默认的 schema 标签。 security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签 |
stop_grace_period | 指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。 stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒 |
stop_signal | 设置停止容器的替代信号。默认情况下使用 SIGTERM 。 |
sysctls | 设置容器中的内核参数,可以使用数组或字典格式。 sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0 |
tmpfs | 在容器内安装一个临时文件系统。可以是单个值或列表的多个值。 |
ulimits | 覆盖容器默认的 ulimit。 ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000 |
volumes | 将主机的数据卷或着文件挂载到容器里。 version: "3.7" |