按照官方的解释,Compose 是「用于定义和运行多容器 Docker 应用程序的工具」。简单地说,在你需要运行多个容器来构建一个复杂的应用程序时,Compose 可以轻松配置它们之间的网络连接、数据卷挂载、环境变量等,这比使用 docker run 命令来分别启动每个容器要容易得多。即使只是单纯用来管理多个容器的部署,Compose 也是十分轻便快捷的选择。更关键的是,YAML 格式的 docker-compose.yml 文件可以很清晰地看出每个容器的结构,我认为这对于新手来说十分友好的。除去需要注意 YAML 的格式。
这里我用《AutoBangumi:自动追番,解放双手》中的 docker-compose.yml 进行演示,如下:
version: "3.9"
services:
qBittorrent:
image: johngong/qbittorrent:latest
container_name: qBittorrent
ports:
- 8989:8989 #两者需与下方的QB_WEBUI_PORT一项完全一致
environment:
- PUID=1000
- PGID=1000
- QB_WEBUI_PORT=8989
volumes:
- ./qb:/config
- ./Downloads:/Downloads
restart: unless-stopped
AutoBangumi:
image: estrellaxd/auto_bangumi:latest
container_name: AutoBangumi
ports:
- 7892:7892
depends_on:
- qBittorrent
volumes:
- ./autoBangumi:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- AB_DOWNLOADER_HOST=qBittorrent:8989
- AB_DOWNLOADER_USERNAME=admin #默认用户名
- AB_DOWNLOADER_PASSWORD=adminadmin #默认密码
- AB_INTERVAL_TIME=7200
- AB_RENAME_FREQ=20
- AB_METHOD=Advance
- AB_GROUP_TAG=True
- AB_NOT_CONTAIN=720|繁体|CHT|JPTC|繁日|\d+-\d+|BIG5|内嵌
- AB_DOWNLOAD_PATH=/Downloads/Bangumi
- AB_RSS= #填入你的RSS订阅链接
- AB_DEBUG_MODE=False
- AB_EP_COMPLETE=False
- AB_WEBUI_PORT=7892
- AB_RENAME=True
- AB_ENABLE_TMDB=True
- AB_LANGUAGE=zh
restart: unless-stopped
在这个例子中,文件的结构及配置都比较简单,主要由以下几部分组成:
- version:定义 Compose 文件版本,版本号与 Docker 引擎相关,为固定格式
- services:一个
docker-compose.yml文件中包含的所有服务,为固定格式 - image:从指定的镜像中启动容器,可以是存储仓库、标签或本地的
Dockerfile文件 - container_name:容器名称,需唯一
- ports:端口映射,即 Docker CLI 的
-p,左侧是本地端口(容器没有严格要求的话可以任意修改),右侧是容器内部的端口 - depends_on:服务之间的依赖关系。在这个例子中,运行
docker compose up -d命令后,只有qBittorrent成功启动,AutoBangumi才会启动 - volumes:挂载一个新的或已存在的目录,即 Docker CLI 的
-v,左侧是本地路径,右侧是容器内部的路径 - environment:容器所需的环境变量,即 Docker CLI 的
-e - restart:重启策略,一般使用
always或unless-stopped,即 Docker CLI 的--restart
像 AutoBangumi 这么长的环境变量,无论是用群晖 Docker 面板还是 Docker CLI,调整配置都是极其繁琐复杂的过程,更别说需要先手动停止容器,才能进行变量的删改工作。而 Compose 可以直接在 docker-compose.yml 文件即时修改任何配置项,最后只要使用 docker compose up -d 命令,就可自动完成停止容器、重新上线容器的步骤。
再举个例子,假如需要更换某个容器的版本号,使用群晖 Docker 面板的话,只能手动选择镜像下载,再新建容器,环境变量都要重新填写,无法在原有的容器基础上进行版本号的修改,而 Compose 只要直接修改一个版本号,再 docker compose up -d 就好。
另外,在同时配置多个容器的情况下,只修改某个容器,并不会影响到其他容器的运行,这也是 Compose 的优点之一。