type
status
date
slug
summary
tags
category
icon
password

一、Docker Compose是什么

前面我们学习过 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。这个问题在早期的 Docker 部署时期只能通过 Shell 脚本 + Crontab 计划任务来完成,不但操作复杂,稳定性也没有保障。
Docker Compose 刚好可以满足这样的场景。Docker Compose 是单个宿主机上快速编排多个容器的工具,通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),支持容器的自动启动、自动部署、热更新、热升级等功能,非常适合组合使用多个容器进行开发的场景。docker-compose.yml 示例如下:
这个 docker-compose.yml 文件定义了 web 和 redis 两个服务。

二、Docker Compose使用

1、安装

Compose 支持 Linux、macOS、Windows 10 三大平台。
Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。
Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。
Linux 系统请使用以下介绍的方法安装。
查看是否安装成功

2、编写配置文件

  • 新建空目录作为 Docker Compose 的根目录。
  • 新建 docker-compose.yml 配置文件,编排服务启动顺序和依赖关系。并把容器需要的所有资源移动到根目录下。

3、启动

在 Docker Compose 根目录下执行明亮启动所有容器。

三、 Docker Compose 配置文件详解

Docker Compose 使用 YAML 文件来定义多服务的应用。文件可以命名为:
  • compose.yaml(官方推荐)
  • compose.yml
  • docker-compose.yaml
  • docker-compose.yml
一个完整的 docker-compose.yml 使用示例如下:
  • 启动一个前端服务 webapp 和一个后端服务 database
  • 为 webapp 配置 front-tier 网络、back-tier 网络和 sercret 验证
  • 为 database 配置持久化卷。
  • webapp 和 database 通过 back-tier 网络进行通讯。
整体架构如下所示:
下面是配置文件常用的一级标签:
  • version :版本,已废弃。Compose 文件格式有 3 个版本,分别为 12.x3.x。目前主流的为 3.x,支持 docker 1.13.0 以上的版本。官方的态度来说,version 字段即将被废弃。如果不加 version 字段启动失败,可以加个 version: "3.9"
  • services :必须字段,定义所有的容器服务。
  • networks:配置容器连接的网络,用于容器间的通讯。
  • volumes:挂载一个目录或者一个已存在的数据卷容器。
  • secrets:存储敏感数据,例如服务密码。
  • 2 services, backed by Docker images: webapp and database
  • 1 secret (HTTPS certificate), injected into the frontend
  • 1 configuration (HTTP), injected into the frontend
  • 1 persistent volume, attached to the backend
  • 2 networks

services

services 标签是使用最频繁的字段,而且是必须字段。用来定义所有的容器服务

build

指定构建镜像的上下文路径。该路径可以使用绝对路径,也可以使用相对路径(根目录为 Compose 文件所在目录),该路径里面必须包含 Dockerfile 文件。
build 字段也可以使用子字段进行更加详细的配置:
  • context:必须字段,上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。

image

指定容器运行的镜像。以下格式都可以:

container_name

指定一个自定义容器名称。如果不指定,容器名称默认以 Compose 文件所在目录名称为前缀。
由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。

volumes

卷挂载路径设置。设置格式有:
  • 宿主机路径:容器路径
  • 宿主机路径:容器路径:访问模式
例如:

command

覆盖容器启动后默认执行的命令。

entrypoint

覆盖容器默认的 entrypoint。
也可以是以下格式:

depends_on

设置依赖关系。
  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。 注意:web 服务不会等待 redis db 完全启动 之后才启动。

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

ports

映射端口到宿主机上,格式为 宿主机端口:容器端口 或者仅仅指定容器的端口(宿主将会随机选择端口)。
当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

healthcheck

用于检测 docker 服务是否健康运行。

network_mode

设置网络模式。

restart

  • no:是默认的重启策略,在任何情况下都不会重启容器。
  • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

volumes

挂载一个目录或者一个已存在的数据卷容器,作用是:
  • 重用数据卷。可以将主机路径挂载为单个服务定义的一部分,无需在一级volumes键中定义它。但是想在多个服务中重用一个卷,则需要在一级volumes 中定义一个命名卷。
  • 保护宿主机文件。可以直接使用HOST:CONTAINER这样的格式,或者使用HOST:CONTAINER:ro这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
如下实例,web 服务使用命名卷 (mydata),以及为单个服务定义的绑定安装(dbservice下的第一个路径volumes)。db服务还使用名为dbdatadbservice下的第二个路径volumes)的命名卷,使用了旧字符串格式定义它以安装命名卷。命名卷必须列在顶级volumes键下。

简短语法

简短语法使用通用[SOURCE:]TARGET[:MODE]格式,其中 SOURCE可以是主机路径或卷名。TARGET是安装卷的容器路径。标准模式ro用于只读和rw读写(默认)。
您可以在主机上挂载一个相对路径,该路径相对于正在使用的 Compose 配置文件的目录展开。相对路径应始终以.或开头..

长语法

  • type: 安装类型, bindtmpfsnpipe
  • source: 安装源、主机上用于绑定安装的路径或在顶级volumes 中定义的卷的名称 。不适用于 tmpfs 挂载。
  • target:安装卷的容器中的路径
  • read_only: 将卷设置为只读的标志
  • bind: 配置额外的绑定选项

networks

默认情况下,Compose 会创建一个默认网络,services 服务的所有容器都加入默认网络,并且可以被该网络上的其他容器访问。我们可以创建通过 networks 自定义更复杂的网络,在相同网络下的容器可以进行通讯。例如
一级配置networks 创建了自定义的网络 。这里配置了两个frontendbackend ,且自定义了网络类型。每一个services下,proxy , app , db都定义了networks配置。
  1. proxy 只加入到 frontend网络。
  1. db 只加入到backend网络。
  1. app同时加入到 frontendbackend
  1. dbproxy不能通讯,因为不在一个网络中。
  1. app和两个都能通讯,因为app在两个网络中都有配置。
  1. dbproxy要通讯,只能通过app这个应用来连接。

secrets

简短语法

简短的语法仅指定机密名称。以下示例授予redis服务对my_secretmy_other_secret机密的访问权限。./my_secret.txt文件的内容被设置为 my_secret,my_other_secret被定义为外部机密,这意味着它已经在Docker中定义,无论是通过运行docker secret create命令还是通过另一个堆栈部署,都不会重新创建。如果外部机密不存在,堆栈部署将失败并显示secret not found错误。

长语法

  • source:定义机密标识符。
  • target:要挂载在/run/secrets/服务的任务容器中的文件的名称,默认是 source。
  • uidgid/run/secrets/在服务的任务容器中拥有文件的数字 UID 或 GID 。
  • mode:要挂载在/run/secrets/ 服务的任务容器中的文件的权限,以八进制表示法。例如,0444 代表可读。
下面的示例表示将my_secret 命名为redis_secret,模式为0440(组可读),和用户组为103。该redis服务无权访问该my_other_secret机密。

三、Docker Compose 命令

docker-compose 命令需要在 Compose 文件所在目录下执行的,基本格式:
options说明
  • f, –file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • p, –project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
  • –verbose 输出更多调试信息。
  • v, –version 打印版本并退出。
详细参考 这里

启动服务

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过该命令来启动一个项目。options说明:
  • d 在后台运行服务容器。
  • –no-color 不使用颜色来区分不同的服务的控制台输出。
  • –no-deps 不启动服务所链接的容器。
  • –force-recreate 强制重新创建容器,不能与 –no-recreate 同时使用。
  • –no-recreate 如果容器已经存在了,则不重新创建,不能与 –force-recreate 同时使用。
  • –no-build 不自动构建缺失的服务镜像。
  • t, –timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
默认情况,启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl-C 停止命令时,所有容器将会停止。一般推荐生产环境下使用后台运行,使用下面命令。
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用下面命令。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。
如果用户只想重新部署某个服务,可以使用下面命令来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。

列出所有服务

重新构建服务

停止服务

查看服务日志

启动已存在的服务

停止已运行的服务

重启服务

参考

Docker系列:安装常用软件Docker系列:Dockerfile
mcbilla
mcbilla
一个普通的干饭人🍚
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉欢迎来到飙戈的博客🎉
-- 感谢您的支持 ---
👏欢迎学习交流👏