Docker Compose
约 7533 字大约 25 分钟
2025-10-11
简介
Docker Compose 是 Docker 官方的开源项目,用于快速编排和管理多个 Docker 容器,其功能类似于 OpenStack 中的 Heat。
- 定位:定义和运行多容器 Docker 应用。
- 前身:源于开源项目 Fig。
- 源码地址:https://github.com/docker/compose
解决的核心问题 虽然单个容器可以通过 Dockerfile 来定义,但在实际项目中(例如一个 Web 应用),通常需要多个容器(如 Web 服务器、数据库、负载均衡器等)协同工作。Docker Compose 正是为了简化这种多容器应用的定义和管理而生。
核心概念
- 服务:代表一个应用的容器实例,基于同一个镜像可以运行多个容器实例。
- 项目:由一组关联的应用容器构成的完整业务单元,通过
docker-compose.yml文件定义。
工作方式与优势 用户通过一个单一的 docker-compose.yml 配置文件(YAML 格式),即可定义整个应用栈的所有服务。Compose 通过 Docker API 来管理这些容器的生命周期,其默认管理对象是“项目”,提供了一套简单的子命令来统一管理项目中的所有容器。
技术实现 Compose 由 Python 编写,通过调用 Docker 服务提供的 API 实现对容器的管理。因此,任何支持 Docker API 的平台,都可以使用 Compose 进行编排。
核心总结
可以将 Docker Compose 的核心价值总结为以下几点:
- “一键式”多容器应用管理:通过一个命令(如
docker-compose up)就能启动、停止或重建整个由多个服务组成的应用环境。 - 声明式配置:使用易于理解和编写的
YAML文件来定义复杂的多容器架构,配置即代码,易于版本控制和共享。 - 服务编排:自动化处理容器间的依赖关系、网络连接和数据卷挂载,解决了手动管理多个关联容器的繁琐问题。
- 提高开发效率:极大简化了本地开发、测试和 CI/CD 流程中多容器环境的搭建与管理,实现了环境的一致性。
简而言之,Docker Compose 是一个用于定义和运行多容器 Docker 应用的自动化工具,它通过一个配置文件和一套简单命令,将用户从繁琐的容器联动配置工作中解放出来。
区别
| 特性 | Docker Compose | Docker Swarm | Kubernetes (k8s) |
|---|---|---|---|
| 核心定位 | 单机编排 | 内置集群 | 企业级容器编排 |
| 适用场景 | 开发、测试、单机部署 | 中小型生产集群 | 大规模、高可用的生产环境 |
| 节点管理 | 仅限单台机器 | 多台机器组成集群 | 强大的多集群、联邦集群管理 |
| 高可用 | 无 | 有(服务副本、故障转移) | 企业级高可用(自愈、滚动更新) |
| 伸缩性 | 手动修改配置重启 | 命令式动态伸缩(docker service scale) | 声明式自动伸缩(HPA) |
| 网络 | 自定义桥接网络 | Overlay网络(跨主机通信) | 更复杂的CNI网络插件 |
| 服务发现 | 通过容器名 | 内置Swarm DNS | 强大的Service和Ingress机制 |
| 学习曲线 | 低 | 中 | 高 |
Compose vs Swarm
本质区别:编排维度
- Compose:是一个定义和运行的工具。它关注的是“如何把一组容器正确地启动并连接起来”。它的核心是
docker-compose.yml文件。 - Swarm:是一个调度和管理的平台。它关注的是“如何把我的服务部署到一个由多台机器组成的集群中,并保证它一直运行”。它的核心是
docker service命令。
一个绝妙的组合:Compose + Swarm
实际上,Compose 和 Swarm 可以很好地协同工作。您可以用 docker-compose.yml 文件来定义 Swarm 中的堆栈。
# 使用 Compose 文件在 Swarm 集群中部署一个“堆栈”
docker stack deploy -c docker-compose.yml my_app_stack这就像是:
- Compose 文件是蓝图(定义了服务的架构)。
- Swarm 是施工队和物业管理系统(负责在集群的各个机器上创建并维护服务状态)。
一个简单的场景对比
假设我们要部署一个包含 Web 应用和数据库的服务。
使用 Docker Compose:
- 在
docker-compose.yml中定义web和db服务。 - 运行
docker-compose up。 - 结果:在当前机器上启动了 1 个
web容器和 1 个db容器。这台机器挂了,整个服务就挂了。
使用 Docker Swarm:
- 将三台机器组建成一个 Swarm 集群。
- 运行
docker service create --name web --replicas 3 my-web-app。 - 结果:Swarm 调度器会在集群中的 1-3 台机器上运行 3 个
web容器实例。如果一台机器宕机,上面的实例会自动在别的健康节点上重建。
使用 Kubernetes:
- 编写一个包含
Deployment和Service的 YAML 文件。 - 使用
kubectl apply部署。 - 结果:Kubernetes 不仅能在节点故障时自愈,还能根据 CPU 负载自动扩容缩容,并提供精细的流量管理、安全策略和存储配置。
总结
- Docker Compose 是 “单机上的多容器一键启动和串联工具”。它完美解决了开发和测试环境中多容器应用的依赖和配置问题,简单直接。
- Docker Swarm 是 “轻量级集群管理工具”,提供了基础的生产级别高可用和伸缩能力。
- Kubernetes 是 “全面的容器编排平台”,功能最强大,但也最复杂,适用于大规模、要求苛刻的生产环境。
对于绝大多数个人项目和小型应用,Docker Compose 已经足够强大和实用。当您需要将服务部署到多台服务器并确保其高可用时,才需要考虑 Swarm 或 Kubernetes。
Compose V2
| 特性维度 | Docker Compose V1 (Python) | Docker Compose V2 (Go) |
|---|---|---|
| 开发语言 | Python | Go |
| 安装方式 | 主要通过 pip 安装 | 作为 Docker CLI 插件,内置于 Docker Desktop |
| 命令形式 | docker-compose (带短横线) | docker compose (空格,无短横线) |
| 当前状态 | 已不再受官方支持 | 当前主流和推荐版本 |
版本更迭的缘由
Docker 官方团队做出这一重大变更,主要出于以下几方面的考量:
- 提升性能与效率:Go 语言编译后生成的是静态二进制文件,部署和运行更加高效,无需像 Python 版本那样依赖解释器和一系列库文件。这在启动速度和资源消耗上带来了积极影响。
- 增强可维护性:Docker 生态系统的其他核心组件(如 Docker Engine 和 Docker CLI)主要也是用 Go 语言编写的。将 Compose 也改用 Go,有利于统一技术栈,降低开发和维护的复杂度,促进不同组件间的集成。
- 改善交付与部署:作为静态二进制文件的 Go 版本 Compose,可以更方便地打包和分发。这尤其体现在它与 Docker Desktop 的深度集成上,安装 Docker 时就会自动附带 Compose 插件,大大简化了用户的安装配置步骤。
建议
- 拥抱新版本:对于新项目,请直接使用 Docker Compose V2 (Go 版本)。它不仅是未来,也带来了更好的性能和体验。
- 注意命令变化:最直观的变化就是从原来的命令
docker-compose切换到了现在的docker compose(去掉了中间的短横线)。如果您在脚本或文档中大量使用了旧命令,需要花些时间更新它们。 - 检查现有环境:您可以通过在终端运行
docker compose version来检查当前使用的版本。如果您的环境已经更新,这个命令会输出 Go 版本的 Docker Compose 信息。
总的来说,这次语言转向是 Docker 官方为了提升工具性能和维护性的一次战略性重构,目前的 Go 版本已经成为绝对的主流。
核心命令
docker compose up -d # 启动所有服务
docker compose down # 停止并删除容器
docker compose ps # 查看服务状态
docker compose logs # 查看日志安装与卸载
官方二进制包(通用)
下载可执行文件
官方地址:https://github.com/docker/compose/releases/latest
以 Linux x86_64 为例:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose授权执行权限
sudo chmod +x /usr/local/bin/docker-compose验证安装
docker-compose version作为 Docker 插件(推荐)
从 Docker 20.10+ 开始,Compose v2 已集成为官方插件。
一键安装(Linux)
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) \
-o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose验证:
docker compose version使用包管理器
Ubuntu / Debian
sudo apt-get update
sudo apt-get install docker-compose-plugin验证:
docker compose versionmacOS(使用 Docker Desktop)
直接安装 Docker Desktop for Mac 即可,Compose v2 已自带。
也可用 Homebrew:
brew install docker-compose
Windows
安装 Docker Desktop for Windows 即可。
Compose 插件自动包含在 Docker CLI 中。
验证:
docker compose version
卸载方法
sudo rm /usr/local/bin/docker-compose
# 或者
rm ~/.docker/cli-plugins/docker-compose使用
术语
在使用 Docker Compose 时,有两个核心概念需要了解:
- 服务(Service):指一个应用容器的定义,可以包含多个运行相同镜像的实例,用于实现负载均衡或水平扩展。
- 项目(Project):由一组相互关联的服务(容器)组成的完整业务单元,通常对应一个应用系统或开发环境。
换句话说,一个 项目 由多个 服务 组成,而每个服务又可能包含多个容器实例。 Docker Compose 正是以「项目」为管理单位,对其所有服务进行统一的构建、启动、停止和维护。
场景
场景示例:使用 Docker Compose 构建一个简单的 Node.js + Redis Web 项目
最常见的项目类型是 Web 网站,通常由多个服务组成,例如:
- Web 应用服务:负责业务逻辑与 HTTP 响应。
- 缓存服务(Redis):用于存储计数或共享数据。
接下来,我们使用 Node.js + Express + Redis 构建一个能够统计页面访问次数的简单网站。
创建项目目录
mkdir node-redis-demo
cd node-redis-demo编写 Web 应用(app.js)
在项目目录中新建 app.js 文件,内容如下:
import express from 'express';
import { createClient } from 'redis';
const app = express();
// 创建 Redis 客户端(Compose 会自动通过服务名解析)
const redis = createClient({ url: 'redis://redis:6379' });
redis.on('error', err => console.error('Redis 连接错误:', err));
await redis.connect();
app.get('/', async (req, res) => {
const count = await redis.incr('hits');
res.send(`Hello World! 该页面已被访问 ${count} 次。\n`);
});
app.listen(3000, () => {
console.log('服务已启动:http://localhost:3000');
});说明:
express提供 HTTP 服务;redis用于存储访问次数;host填写 Compose 服务名redis,Compose 会自动进行服务发现。
创建 package.json
在项目目录中创建 package.json 文件:
{
"name": "node-redis-demo",
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.19.2",
"redis": "^4.6.14"
}
}编写 Dockerfile
在项目目录下创建 Dockerfile 文件:
# 使用官方 Node.js 轻量镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /app
# 复制项目文件
COPY package*.json ./
RUN npm install --production
COPY . .
# 启动应用
CMD ["npm", "start"]创建 docker-compose.yml
在项目根目录下创建 docker-compose.yml 文件:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- redis
redis:
image: "redis:alpine"说明:
web服务:使用当前目录的 Dockerfile 构建 Node 应用;redis服务:直接使用官方 Redis 镜像;depends_on:保证 Redis 在 Web 服务启动前被创建。
启动项目
执行以下命令:
docker-compose up启动后访问浏览器:
http://localhost:3000每刷新一次页面,访问计数就会自动加 1。
总结
| 文件 | 作用 |
|---|---|
app.js | Node.js Web 应用逻辑 |
package.json | 依赖与启动脚本定义 |
Dockerfile | 定义 Web 服务镜像构建规则 |
docker-compose.yml | 定义项目的服务结构与依赖关系 |
总结:
- Compose 以「项目」为管理单位;
- 项目由多个「服务」组成;
- 服务之间通过服务名自动网络互联;
- 一条命令即可完成项目的构建与运行。
命令说明
命令对象与格式
在使用 Docker Compose 时,绝大多数命令的作用对象既可以是整个 项目(Project),也可以针对其中的某个 服务(Service) 或具体 容器(Container)。
如果命令中未指定具体的服务或容器,Compose 会默认将操作作用于整个项目,即所有服务都会受到该命令的影响。
例如,docker-compose up 会启动项目中定义的全部服务,而不仅仅是单个容器。
要查看某个命令的详细用法,可以使用以下任一方式:
docker-compose [COMMAND] --help或
docker-compose help [COMMAND]这两种形式等价,都会输出该命令的语法、参数和使用示例。
Docker Compose 命令的通用格式如下:
docker-compose [-f <file>...] [options] [COMMAND] [ARGS...]参数说明:
| 参数 | 说明 |
|---|---|
-f <file> | 指定要使用的 Compose 文件(默认是 docker-compose.yml)。可以指定多个。 |
[options] | 命令级别的全局选项,如 --project-name、--env-file 等。 |
[COMMAND] | 具体要执行的操作,如 up、down、logs、build 等。 |
[ARGS...] | 针对某个命令的附加参数,例如指定服务名。 |
总结
- Compose 命令可作用于 项目 / 服务 / 容器 三个层级;
- 未指定对象时默认作用于整个项目;
- 通过
--help可以查看每个命令的详细说明; - 命令格式统一、简洁,方便组合使用。
命令选项
-f, --file FILE指定使用的 Compose 模板文件,默认为docker-compose.yml,可以多次指定。-p, --project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。--verbose输出更多调试信息。-v, --version打印版本并退出。
命令使用说明
Docker Compose 是一个全栈应用管理工具,它不仅能通过 docker compose up 一键拉起多个容器组合成完整业务,还能通过 docker compose build 一键构建业务所需的所有自定义镜像。它将镜像构建配置和运行时配置统一管理,实现了从开发、构建到部署的完整生命周期标准化,让多服务应用的编排变得高效而统一。
build
格式为 docker-compose build [options] [SERVICE...]。
构建(重新构建)项目中的服务容器。
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。
选项包括:
--force-rm删除构建过程中的临时容器。--no-cache构建镜像过程中不使用 cache(这将加长构建过程)。--pull始终尝试通过 pull 来获取更新版本的镜像。
config
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
down
此命令将会停止 up 命令所启动的容器,并移除网络。
exec
进入指定的容器。
help
获得一个命令的帮助。
images
列出 Compose 文件中包含的镜像。
kill
格式为 docker-compose kill [options] [SERVICE...]。
通过发送 SIGKILL 信号来强制停止服务容器。
支持通过 -s 参数来指定发送的信号,例如通过如下指令发送 SIGINT 信号。
docker-compose kill -s SIGINTlogs
格式为 docker-compose logs [options] [SERVICE...]。
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
该命令在调试问题的时候十分有用。
pause
格式为 docker-compose pause [SERVICE...]。
暂停一个服务容器。
port
格式为 docker-compose port [options] SERVICE PRIVATE_PORT。
打印某个容器端口所映射的公共端口。
选项:
--protocol=proto指定端口协议,tcp(默认值)或者 udp。--index=index如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
ps
格式为 docker-compose ps [options] [SERVICE...]。
列出项目中目前的所有容器。
选项:
-q只打印容器的 ID 信息。
pull
格式为 docker-compose pull [options] [SERVICE...]。
拉取服务依赖的镜像。
选项:
--ignore-pull-failures忽略拉取镜像过程中的错误。
push
推送服务依赖的镜像到 Docker 镜像仓库。
restart
格式为 docker-compose restart [options] [SERVICE...]。
重启项目中的服务。
选项:
-t, --timeout TIMEOUT指定重启前停止容器的超时(默认为 10 秒)。
rm
格式为 docker-compose rm [options] [SERVICE...]。
删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
选项:
-f, --force强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v删除容器所挂载的数据卷。
run
格式为 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]。
在指定服务上执行一个命令。
例如:
docker-compose run ubuntu ping docker.com将会启动一个 ubuntu 服务容器,并执行 ping docker.com 命令。
默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照配置自动创建。
两个不同点:
- 给定命令将会覆盖原有的自动运行命令;
- 不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 --no-deps 选项,例如
docker-compose run --no-deps web python manage.py shell将不会启动 web 容器所关联的其它容器。
选项:
-d后台运行容器。--name NAME为容器指定一个名字。--entrypoint CMD覆盖默认的容器启动指令。-e KEY=VAL设置环境变量值,可多次使用选项来设置多个环境变量。-u, --user=""指定运行容器的用户名或者 uid。--no-deps不自动启动关联的服务容器。--rm运行命令后自动删除容器,d模式下将忽略。-p, --publish=[]映射容器端口到本地主机。--service-ports配置服务端口并映射到本地主机。-T不分配伪 tty,意味着依赖 tty 的指令将无法运行。
scale
格式为 docker-compose scale [options] [SERVICE=NUM...]。
设置指定服务运行的容器个数。
通过 service=num 的参数来设置数量。例如:
docker-compose scale web=3 db=2将启动 3 个容器运行 web 服务,2 个容器运行 db 服务。
一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器;反之,将停止容器。
选项:
-t, --timeout TIMEOUT停止容器时候的超时(默认为 10 秒)。
start
格式为 docker-compose start [SERVICE...]。
启动已经存在的服务容器。
stop
格式为 docker-compose stop [options] [SERVICE...]。
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
选项:
-t, --timeout TIMEOUT停止容器时候的超时(默认为 10 秒)。
top
查看各个服务容器内运行的进程。
unpause
格式为 docker-compose unpause [SERVICE...]。
恢复处于暂停状态中的服务。
up
格式为 docker-compose up [options] [SERVICE...]。
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
选项:
-d在后台运行服务容器。--no-color不使用颜色来区分不同的服务的控制台输出。--no-deps不启动服务所链接的容器。--force-recreate强制重新创建容器,不能与--no-recreate同时使用。--no-recreate如果容器已经存在了,则不重新创建,不能与--force-recreate同时使用。--no-build不自动构建缺失的服务镜像。-t, --timeout TIMEOUT停止容器时候的超时(默认为 10 秒)。
version
格式为 docker-compose version。
打印版本信息。
模板文件
Docker Compose 的核心在于编写模板文件,其默认名称为 docker-compose.yml,采用 YAML 格式。尽管文件中涉及的指令关键字较多,但请不必担心,因为它们中的大部分都与 docker run 命令的相关参数含义相似,理解起来并不困难。
一个基本的服务定义必须通过 image 指令指定镜像,或使用 build 指令(需配合 Dockerfile)来自动构建镜像。
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"一个重要提示是:如果使用 build 指令,那么在 Dockerfile 中已设置的选项(如 CMD、EXPOSE、VOLUME、ENV 等)会被自动继承,无需在 docker-compose.yml 中再次声明。
build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:
webapp:
build: ./dir你也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定构建镜像时的变量。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1使用 cache_from 指定构建镜像的缓存
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14cap_add, cap_drop
指定容器的内核能力(capacity)分配。
例如,让容器拥有所有能力可以指定为:
cap_add:
- ALL去掉 NET_ADMIN 能力可以指定为:
cap_drop:
- NET_ADMINcommand
覆盖容器启动后默认执行的命令。
command: echo "hello world"configs
仅用于 Swarm mode
cgroup_parent
指定父 cgroup 组,意味着将继承该组的资源限制。
例如,创建了一个 cgroup 组名称为 cgroups_1。
cgroup_parent: cgroups_1container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
container_name: docker-web-container注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
deploy
仅用于 Swarm mode
devices
指定设备映射关系。
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres注意:web 服务不会等待 redis db 「完全启动」之后才启动。
dns
自定义 DNS 服务器。可以是一个值,也可以是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114dns_search
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.comtmpfs
挂载一个 tmpfs 文件系统到容器。
tmpfs: /run
tmpfs:
- /run
- /tmpenv_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set development environment
PROG_ENV=developmentenvironment
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
如果变量名称或者值中用到 true|false,yes|no 等表达 布尔含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFFexpose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数
expose:
- "3000"
- "8000"external_links
注意:不建议使用该指令。
链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的外部容器。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresqlextra_hosts
类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。
8.8.8.8 googledns
52.1.157.61 dockerhubhealthcheck
通过命令检查容器是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fdlabels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"links
注意:不推荐使用该指令。
logging
配置日志选项。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"目前支持三种日志驱动类型。
driver: "json-file"
driver: "syslog"
driver: "none"options 配置日志驱动的相关参数。
options:
max-size: "200k"
max-file: "10"network_mode
设置网络模式。使用和 docker run 的 --network 参数一样的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"networks
配置容器连接的网络。
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:pid
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
pid: "host"ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
secrets
存储敏感数据,例如 mysql 服务密码。
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: truesecurity_opt
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
security_opt:
- label:user:USER
- label:role:ROLEstop_signal
设置另一个信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1sysctls
配置容器内核参数。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0ulimits
指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro如果路径为数据卷名称,必须在文件中配置数据卷。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:其它指令
此外,还有包括 domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir 等指令,基本跟 docker run 中对应参数的功能一致。
指定服务容器启动后执行的入口文件。
entrypoint: /code/entrypoint.sh指定容器中运行应用的用户名。
user: nginx指定容器中工作目录。
working_dir: /code指定容器中搜索域名、主机名、mac 地址等。
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A允许容器中运行一些特权命令。
privileged: true指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
restart: always以只读模式挂载容器的 root 文件系统,意味着不能对容器内容进行修改。
read_only: true打开标准输入,可以接受外部输入。
stdin_open: true模拟一个伪终端。
tty: true读取变量
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。
例如,下面的 Compose 文件将从运行它的环境中读取变量 ${MONGO_VERSION} 的值,并写入执行的指令中。
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"如果执行 MONGO_VERSION=3.2 docker-compose up 则会启动一个 mongo:3.2 镜像的容器;如果执行 MONGO_VERSION=2.8 docker-compose up 则会启动一个 mongo:2.8 镜像的容器。
若当前目录存在 .env 文件,执行 docker-compose 命令时将从该文件中读取变量。
在当前目录新建 .env 文件并写入以下内容。
# 支持 # 号注释
MONGO_VERSION=3.6执行 docker-compose up 则会启动一个 mongo:3.6 镜像的容器。