Docker Compose 完全指南:从入门到精通
版本说明:本文基于 Docker Compose V2(当前最新版本,2026年)
目录
- 一、什么是 Docker Compose?
- 二、当前版本说明:V2 与 V1 的区别
- 三、安装与环境准备
- 四、Compose 文件格式:Compose 规范
- 五、配置详解
- 5.1 name – 项目名称
- 5.2 services – 服务定义
- 5.3 networks – 网络配置
- 5.4 volumes – 数据卷配置
- 5.5 configs 和 secrets
- 六、完整配置示例
- 七、常用命令大全
- 八、最佳实践与技巧
- 九、常见问题与解决方案
一、什么是 Docker Compose?
1.1 核心概念
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 配置文件(compose.yaml),你可以配置应用程序所需的所有服务(容器)、网络和存储卷,然后用一条命令创建并启动所有服务。
1.2 解决的问题
在没有 Compose 之前,启动一个由多个容器组成的应用(如 Web 服务器、后端 API、数据库、缓存)需要:
docker run -d --name redis redis:alpine
docker run -d --name db -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
docker run -d --name app -p 8080:8080 --link db --link redis myapp:latest
手动管理这些命令不仅繁琐,还容易出错,且难以共享和复现环境。
有了 Compose,你只需要一个配置文件:
services:
app:
image: myapp:latest
ports:
- "8080:8080"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
redis:
image: redis:alpine
然后一条命令搞定一切:
docker compose up -d
1.3 核心优势
| 优势 | 说明 |
|---|---|
| 环境标准化 | 配置文件即文档,团队成员使用相同的配置确保开发、测试、生产环境一致 |
| 开发效率 | 一条命令启动整个应用栈,无需记忆复杂的 docker run 参数 |
| 可移植性 | 配置文件可以轻松在不同的机器和环境中复用 |
| 服务隔离 | 每个应用运行在自己的网络环境中,互不干扰 |
| 生命周期管理 | 统一的命令管理所有服务的启动、停止、重启、日志查看等操作 |
二、当前版本说明:V2 与 V1 的区别
2.1 版本历史
| 版本 | 状态 | 说明 |
|---|---|---|
| Compose V1 | 已弃用 | 2023年7月停止更新,命令格式为 docker-compose(带连字符) |
| Compose V2 | 当前版本 | 作为 Docker CLI 插件集成,命令格式为 docker compose(空格分隔) |
2.2 V1 与 V2 详细对比
| 对比项 | V1(旧版) | V2(当前版本) |
|---|---|---|
| 命令格式 | docker-compose | docker compose |
| 实现语言 | Python | Go |
| 集成方式 | 独立二进制文件 | Docker CLI 内置插件 |
| 启动速度 | 相对较慢 | 显著提升(Go 语言性能优势) |
| BuildKit 支持 | 需手动启用 | 默认启用,构建更快 |
version 字段 | 必需(如 version: '3.8') | 已弃用,建议省略 |
| 文件命名 | docker-compose.yml | 推荐 compose.yaml(两者都支持) |
| 容器命名规则 | 项目_服务_序号(使用下划线) | 项目-服务-序号(使用连字符) |
2.3 如何确认你的版本
# 查看 Compose 版本
docker compose version
# 输出示例
Docker Compose version v2.27.0-desktop.1
⚠️ 重要提示:如果你还在使用 V1 命令
docker-compose,建议尽快迁移到 V2。V1 不再接收安全更新和功能更新。
三、安装与环境准备
3.1 安装 Docker Compose
如果你安装了 Docker Desktop(Windows / macOS)或 Docker Engine 23.0+(Linux),Compose V2 已经默认内置,无需单独安装。
# 验证安装
docker compose version
# 预期输出类似
Docker Compose version v2.27.0
3.2 Linux 系统单独安装(如需)
如果系统较旧,Docker Engine 版本低于 23.0,可以手动安装 Compose 插件:
# 下载最新版本
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
# 添加执行权限
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
# 验证安装
docker compose version
3.3 准备项目目录
建议每个 Compose 项目使用独立的目录:
myapp/
├── compose.yaml # Compose 配置文件
├── .env # 环境变量文件(可选)
├── app/ # 应用代码目录
│ ├── Dockerfile
│ └── src/
└── data/ # 持久化数据目录(可选)
四、Compose 文件格式:Compose 规范
4.1 什么是 Compose 规范?
Compose 规范(Compose Specification)是 Docker Compose 文件格式的官方技术标准。它详细规定了如何用 YAML 语言定义一个多容器应用。
4.2 重要变化:version 字段已弃用
这是当前版本最重要的变化!
过去,Compose 文件必须包含 version 字段:
# 旧写法(虽然还能用,但不推荐)
version: '3.8'
services:
web:
image: nginx
现在,version 字段已被弃用,直接以 services 开头即可:
# 新写法(推荐)
services:
web:
image: nginx
规范已将所有旧版本(2.x 和 3.x)的功能合并统一,成为一个滚动更新的标准。如果文件中存在 version 字段,Compose V2 会忽略它并按最新规范解析。
4.3 文件命名优先级
推荐使用 compose.yaml,但也兼容 docker-compose.yml:
| 文件名 | 优先级 | 说明 |
|---|---|---|
compose.yaml | 最高 | 官方推荐的默认文件名 |
compose.yml | 次高 | .yml 扩展名变体 |
docker-compose.yaml | 较低 | 向后兼容 V1 命名 |
docker-compose.yml | 最低 | 向后兼容 V1 命名 |
4.4 文件基本结构
一个完整的 Compose 文件包含以下5 个顶级元素(仅 services 是必需的):
# 可选:项目名称
name: myapp
# 必需:服务定义
services:
# 服务配置...
# 可选:网络定义
networks:
# 网络配置...
# 可选:数据卷定义
volumes:
# 数据卷配置...
# 可选:配置文件定义
configs:
# 配置文件...
# 可选:敏感信息定义
secrets:
# 密钥配置...
4.5 YAML 语法要点
Compose 文件使用 YAML 格式编写,需注意:
| 规则 | 说明 | 正确 ✅ | 错误 ❌ |
|---|---|---|---|
| 缩进 | 使用空格,不能用 Tab | port: 80 | port: 80 |
| 缩进量 | 建议 2 个空格一级 | services:web: | services:web: |
| 键值对 | 冒号后加空格 | image: nginx | image:nginx |
| 列表 | 使用 - 加空格 | ports:- "80:80" | ports: ["80:80"] |
| 字符串 | 一般无需引号,含特殊字符时需要 | command: npm start | – |
| 布尔值 | true/false、yes/no、on/off | restart: always | – |
五、配置详解
5.1 name – 项目名称
name 定义项目的名称,会影响容器、网络、数据卷的命名前缀。
name: myapp
services:
web:
image: nginx
- 默认值:当前目录名
- 命名格式:
${name}_${service}_${replica}→ 如myapp_web_1 - 环境变量覆盖:可通过
COMPOSE_PROJECT_NAME环境变量覆盖
5.2 services – 服务定义
services 是 Compose 文件的核心,每个服务对应一个容器。
5.2.1 基础配置
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
image | string | 指定使用的镜像 | image: nginx:alpine |
container_name | string | 自定义容器名(固定后无法扩容) | container_name: my-nginx |
build | string / object | 从 Dockerfile 构建镜像 | build: ./app |
command | string / list | 覆盖镜像的默认 CMD | command: npm start |
entrypoint | string / list | 覆盖镜像的默认 ENTRYPOINT | entrypoint: ["/app/entry.sh"] |
working_dir | string | 设置容器内工作目录 | working_dir: /app |
user | string | 运行进程的用户 ID | user: "1000:1000" |
hostname | string | 容器主机名 | hostname: my-host |
restart | string | 重启策略 | restart: always |
重启策略详解:
| 值 | 说明 |
|---|---|
no | 不自动重启(默认) |
always | 无论退出码如何,总是重启 |
on-failure | 仅当退出码非 0 时重启 |
unless-stopped | 除非手动停止,否则总是重启 |
5.2.2 端口与网络
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
ports | list | 端口映射 宿主机:容器 | ports: - "80:80" |
expose | list | 暴露端口给同网络服务 | expose: - "5432" |
networks | list | 连接到的网络 | networks: - frontend |
network_mode | string | 网络模式 | network_mode: host |
dns | list | DNS 服务器 | dns: - 8.8.8.8 |
extra_hosts | list | 添加 hosts 映射 | extra_hosts: - "host:10.0.0.1" |
端口映射格式:
ports:
# 宿主机端口:容器端口
- "80:80"
# 指定协议
- "8080:8080/udp"
# 随机宿主机端口
- "9000"
# 仅绑定到指定 IP
- "127.0.0.1:8080:8080"
# 短语法(不推荐)
- 8080:8080
5.2.3 存储配置
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
volumes | list | 挂载数据卷或主机目录 | volumes: - db_data:/var/lib/mysql |
tmpfs | string / list | 临时文件系统(内存) | tmpfs: /tmp |
Volume 挂载格式:
volumes:
# 命名卷(需在顶层 volumes 声明)
- db-data:/var/lib/mysql
# 主机目录(绝对路径)
- /opt/data:/app/data
# 主机目录(相对路径)
- ./config:/app/config:ro # ro 表示只读
# 语法详解
- [SOURCE]:[TARGET]:[OPTIONS]
5.2.4 环境变量
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
environment | map / list | 直接设置环境变量 | environment: {KEY: value} |
env_file | list | 从文件加载环境变量 | env_file: - .env |
environment 示例:
# Map 格式(推荐)
environment:
NODE_ENV: production
PORT: 8080
# 列表格式
environment:
- NODE_ENV=production
- PORT=8080
env_file 示例:
env_file:
- .env # 基础环境变量
- .env.production # 生产环境覆盖
.env 文件格式:
# 注释
DATABASE_URL=postgresql://user:pass@db:5432/app
API_KEY=abc123
NODE_ENV=development
5.2.5 依赖关系与健康检查
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
depends_on | list / object | 服务依赖(控制启动顺序) | depends_on: - db |
healthcheck | object | 健康检查配置 | healthcheck: {test: ["CMD", "curl", "localhost"]} |
depends_on 详解:
services:
app:
image: myapp
depends_on:
db:
condition: service_healthy # 等待 db 健康后再启动
redis:
condition: service_started # 默认值,仅等待启动
db:
image: postgres
healthcheck:
test: ["CMD", "pg_isready"]
redis:
image: redis
健康检查配置:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"] # 检查命令
interval: 30s # 检查间隔
timeout: 10s # 超时时间
retries: 3 # 失败重试次数
start_period: 40s # 启动预热时间
5.2.6 资源限制
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
cpus | string | CPU 限制(核心数) | cpus: '0.5' |
cpu_shares | int | CPU 相对权重 | cpu_shares: 512 |
mem_limit | string | 内存限制 | mem_limit: 512m |
mem_reservation | string | 内存预留 | mem_reservation: 256m |
deploy.resources | object | Swarm 模式资源限制 | deploy.resources.limits.memory: 512M |
示例:
services:
app:
image: myapp
cpus: '1.5' # 限制使用 1.5 个 CPU 核心
mem_limit: 1g # 限制内存 1 GB
mem_reservation: 512m # 预留 512 MB
5.2.7 日志配置
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
logging.driver | string | 日志驱动 | driver: json-file |
logging.options | map | 日志驱动选项 | options: {max-size: "10m"} |
示例:
services:
app:
image: myapp
logging:
driver: json-file
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 保留 3 个文件
5.2.8 安全与权限
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
cap_add | list | 添加 Linux Capabilities | cap_add: - NET_ADMIN |
cap_drop | list | 删除 Linux Capabilities | cap_drop: - ALL |
privileged | bool | 特权模式(谨慎使用) | privileged: true |
read_only | bool | 只读根文件系统 | read_only: true |
5.2.9 容器生命周期
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
init | bool | 使用 init 进程管理僵尸进程 | init: true |
stop_grace_period | duration | 优雅停止等待时间 | stop_grace_period: 30s |
stop_signal | string | 停止信号 | stop_signal: SIGTERM |
5.3 networks – 网络配置
默认情况下,Compose 会创建一个默认网络(default),所有服务都连接到这个网络,可以通过服务名互相访问。
5.3.1 基本配置
networks:
frontend:
driver: bridge # 网络驱动
driver_opts: # 驱动选项
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
ipam: # IP 地址管理
config:
- subnet: 172.16.1.0/24
internal: true # 是否内部网络(无外网访问)
attachable: true # 是否允许独立容器连接
5.3.2 网络驱动类型
| 驱动 | 说明 | 适用场景 |
|---|---|---|
bridge | 默认驱动,创建隔离网络 | 单机开发环境 |
host | 直接使用宿主机网络栈 | 性能要求高,端口冲突风险 |
overlay | 跨主机网络 | Swarm 集群模式 |
none | 禁用网络 | 不需要网络的服务 |
5.3.3 服务连接网络
services:
web:
image: nginx
networks:
- frontend
# 指定网络别名
- backend:
aliases:
- web-backend
db:
image: postgres
networks:
- backend
networks:
frontend:
backend:
internal: true # 后端网络不暴露外网
5.4 volumes – 数据卷配置
数据卷用于持久化存储数据,容器删除后数据不会丢失。
5.4.1 基本配置
volumes:
db-data:
driver: local
driver_opts:
type: none
device: /mnt/data/db
o: bind
external: false # 是否使用外部已存在的数据卷
name: custom-db-data # 数据卷实际名称
5.4.2 Volume 驱动
| 驱动 | 说明 | 适用场景 |
|---|---|---|
local | 默认驱动,存储在宿主机 | 单机开发 |
nfs | NFS 共享存储 | 多机共享数据 |
cloud | 云存储驱动(需要插件) | 生产环境 |
5.5 configs 和 secrets
这两个配置项主要用于 Docker Swarm 模式,在单机模式下功能有限。
configs – 非敏感配置文件
configs:
app_config:
file: ./config/app.conf
external: false
services:
app:
image: myapp
configs:
- source: app_config
target: /etc/app/config.conf
mode: 0444
secrets – 敏感信息管理
secrets:
db_password:
file: ./secrets/db_password.txt
external: false
services:
app:
image: myapp
secrets:
- source: db_password
target: /run/secrets/db_password
mode: 0400
六、完整配置示例
6.1 基础示例:Web + 数据库 + 缓存
name: myapp
services:
web:
image: nginx:alpine
container_name: myapp-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- frontend
depends_on:
- api
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
api:
build:
context: ./api
dockerfile: Dockerfile
target: production
args:
NODE_ENV: production
ports:
- "3000:3000"
environment:
NODE_ENV: production
DB_HOST: db
DB_PORT: 5432
REDIS_HOST: redis
env_file:
- .env.production
volumes:
- uploads:/app/uploads
networks:
- backend
- frontend
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
memory: 256M
restart: unless-stopped
healthcheck:
test: ["CMD", "node", "health.js"]
interval: 30s
timeout: 5s
retries: 3
user: "1000:1000"
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
env_file:
- .env.db
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init-db:/docker-entrypoint-initdb.d:ro
networks:
- backend
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
deploy:
resources:
limits:
memory: 256M
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- backend
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
volumes:
postgres_data:
redis_data:
uploads:
6.2 开发环境示例
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
- "9229:9229" # Node.js 调试端口
volumes:
- .:/app
- /app/node_modules # 避免覆盖容器内的 node_modules
environment:
NODE_ENV: development
DATABASE_URL: postgresql://postgres:secret@db:5432/dev_db
depends_on:
- db
- redis
command: npm run dev
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: dev_db
POSTGRES_PASSWORD: secret
ports:
- "5432:5432" # 暴露端口供主机连接
volumes:
- dev_db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- dev_redis_data:/data
adminer:
image: adminer:latest
ports:
- "8080:8080"
environment:
ADMINER_DEFAULT_SERVER: db
volumes:
dev_db_data:
dev_redis_data:
七、常用命令大全
7.1 基本命令
| 命令 | 说明 | 示例 |
|---|---|---|
docker compose up | 启动所有服务 | docker compose up |
docker compose up -d | 后台启动 | docker compose up -d |
docker compose down | 停止并删除容器 | docker compose down |
docker compose down -v | 同时删除数据卷 | docker compose down -v |
docker compose stop | 停止服务(不删除) | docker compose stop |
docker compose start | 启动已停止的服务 | docker compose start |
docker compose restart | 重启服务 | docker compose restart |
docker compose pause | 暂停服务 | docker compose pause |
docker compose unpause | 恢复暂停的服务 | docker compose unpause |
7.2 构建与重建
| 命令 | 说明 | 示例 |
|---|---|---|
docker compose build | 构建或重建服务镜像 | docker compose build |
docker compose build --no-cache | 不使用缓存构建 | docker compose build --no-cache |
docker compose up --build | 重新构建并启动 | docker compose up --build |
docker compose build --parallel | 并行构建 | docker compose build --parallel |
7.3 日志与状态
| 命令 | 说明 | 示例 |
|---|---|---|
docker compose ps | 列出所有容器状态 | docker compose ps |
docker compose logs | 查看日志 | docker compose logs |
docker compose logs -f | 实时跟踪日志 | docker compose logs -f web |
docker compose logs --tail=100 | 显示最后100行 | docker compose logs --tail=100 |
docker compose top | 显示容器内进程 | docker compose top |
docker compose port | 显示端口映射 | docker compose port web 80 |
7.4 执行与调试
| 命令 | 说明 | 示例 |
|---|---|---|
docker compose exec | 在运行中的容器执行命令 | docker compose exec web bash |
docker compose run | 运行一次性命令(新容器) | docker compose run web npm test |
docker compose config | 验证并显示配置文件 | docker compose config |
docker compose events | 监听容器事件 | docker compose events |
7.5 扩缩容与维护
| 命令 | 说明 | 示例 |
|---|---|---|
docker compose up --scale | 扩缩容服务副本数 | docker compose up -d --scale web=3 |
docker compose rm | 删除停止的容器 | docker compose rm |
docker compose pull | 拉取最新镜像 | docker compose pull |
docker compose push | 推送构建的镜像 | docker compose push |
7.6 配置文件指定
# 使用非默认名称的配置文件
docker compose -f docker-compose.prod.yml up
# 合并多个配置文件
docker compose -f base.yml -f dev.yml up
# 指定项目名称
docker compose -p myproject up
八、最佳实践与技巧
8.1 配置文件组织
项目目录/
├── compose.yaml # 主配置文件
├── compose.override.yaml # 本地覆盖配置(Git 忽略)
├── compose.prod.yaml # 生产环境配置
└── .env # 环境变量文件
合并配置:
# 开发环境:合并 override
docker compose up
# 生产环境:使用特定文件
docker compose -f compose.yaml -f compose.prod.yaml up
8.2 环境变量使用
# compose.yaml
services:
db:
image: postgres:${POSTGRES_VERSION:-16}
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD?err} # 必须存在
POSTGRES_USER: ${DB_USER:-postgres} # 带默认值
.env 文件:
# .env
POSTGRES_VERSION=16-alpine
DB_PASSWORD=secret123
8.3 构建优化
services:
app:
build:
context: .
dockerfile: Dockerfile
cache_from:
- myapp:latest
- myapp:cache
args:
BUILDKIT_INLINE_CACHE: 1
image: myapp:${TAG:-latest}
8.4 依赖顺序控制
services:
app:
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: on-failure
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 10
restart: on-failure
8.5 安全建议
services:
app:
# 以非 root 用户运行
user: "1000:1000"
# 只读根文件系统
read_only: true
# 添加临时可写目录
tmpfs:
- /tmp
- /run
# 限制能力
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # 仅添加必要的能力
# 安全选项
security_opt:
- no-new-privileges:true
8.6 性能优化
services:
app:
# 资源限制
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '0.5'
memory: 256M
# 使用更快的日志驱动
logging:
driver: local
options:
max-size: 10m
max-file: 3
8.7 调试技巧
# 查看合并后的完整配置
docker compose config
# 仅构建特定服务
docker compose build --no-cache web
# 查看服务依赖关系
docker compose config --images
docker compose config --services
# 进入容器调试
docker compose exec web sh
# 查看容器资源使用
docker stats $(docker compose ps -q)
九、常见问题与解决方案
9.1 容器启动顺序问题
问题:依赖服务未完全就绪就启动主服务
解决方案:
services:
app:
depends_on:
db:
condition: service_healthy # 等待健康检查通过
restart: on-failure
db:
healthcheck:
test: ["CMD", "pg_isready"]
interval: 5s
timeout: 5s
retries: 10
9.2 端口冲突
问题:宿主机端口已被占用
解决方案:
services:
web:
ports:
- "8080:80" # 改为使用其他端口
# 或使用随机端口
- "80" # 系统自动分配
9.3 数据持久化问题
问题:容器重启后数据丢失
解决方案:
services:
db:
volumes:
- db_data:/var/lib/postgresql/data # 使用命名卷
volumes:
db_data: # 声明卷,数据会持久保存
9.4 网络通信问题
问题:服务之间无法通过服务名访问
解决方案:
# 确保服务在同一网络
services:
web:
networks:
- app-network
api:
networks:
- app-network
networks:
app-network:
driver: bridge
9.5 环境变量覆盖问题
问题:环境变量不生效或覆盖顺序混乱
解决方案:
services:
app:
# 优先级:environment > env_file > .env 文件
environment:
- NODE_ENV=production # 最高优先级
env_file:
- .env.common # 较低优先级
- .env.override # 后者覆盖前者
9.6 构建缓存问题
问题:Dockerfile 修改后未生效
解决方案:
# 强制重建镜像
docker compose build --no-cache
# 或指定服务重建
docker compose up -d --build web
9.7 资源不足问题
问题:容器内存或 CPU 不足
解决方案:
services:
app:
# 增加资源限制
deploy:
resources:
limits:
memory: 2G
cpus: '2'
9.8 从 V1 迁移到 V2步骤:
- 验证新命令可用:
docker compose version - 移除文件中的
version字段(可选但推荐) - 更新脚本中的命令为
docker compose - 测试运行:
docker compose up -d - 清理旧容器:
docker-compose down(如仍有旧版本)
注意:容器命名会变化,确保没有硬编码依赖旧名称。
总结
Docker Compose V2 是现代容器化应用开发的必备工具。它通过声明式的 YAML 配置,让多容器应用的部署、管理和共享变得简单可控。
核心要点回顾
| 要点 | 说明 |
|---|---|
| 当前版本 | Compose V2,命令 docker compose |
| 文件格式 | Compose 规范,不再需要 version 字段 |
| 核心结构 | services(必需)、networks、volumes |
| 常用命令 | up -d、down、logs、exec |
| 最佳实践 | 使用健康检查、数据卷持久化、资源限制 |
掌握 Compose 后,你可以轻松管理复杂的微服务架构,在开发、测试、生产环境之间无缝迁移,真正实现“一次编写,到处运行”。
本文档内容基于 Docker Compose V2(2026年),如需最新信息,请参考 Docker 官方文档。