Docker Compose 入门指南:多容器编排
一、什么是 Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过一个 docker-compose.yml 文件来配置应用程序需要的所有服务、网络和数据卷,然后用一条命令即可启动所有服务。
安装
# 下载二进制文件
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 Desktop 已内置 Docker Compose,无需单独安装。
二、docker-compose.yml 核心语法
基本结构
version: "3.9" # Compose 文件格式版本
services: # 定义服务
web:
image: nginx:1.25-alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app
environment:
- ASPNETCORE_ENVIRONMENT=Production
ports:
- "5000:80"
volumes: # 定义数据卷
data:
networks: # 定义网络
frontend:
backend:
三、常用配置项
1. 服务构建
services:
app:
build:
context: ./app # 构建上下文路径
dockerfile: Dockerfile # 指定 Dockerfile
args: # 构建参数
VERSION: v1
image: myapp:latest # 构建后的镜像名
2. 端口映射
services:
web:
ports:
- "8080:80" # 宿主机端口:容器端口
- "443:443"
- "127.0.0.1:3306:3306" # 限制访问地址
3. 环境变量
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
# 或使用文件
env_file:
- .env
4. 数据卷挂载
services:
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql # 命名卷
- ./config/my.cnf:/etc/mysql/conf.d/my.cnf # 绑定挂载
volumes:
db_data:
5. 健康检查
services:
db:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
6. 重启策略
services:
app:
restart: unless-stopped # no / always / unless-stopped / on-failure
7. 资源限制
services:
app:
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
memory: 256M
四、常用命令
# 启动所有服务(前台)
docker-compose up
# 启动所有服务(后台)
docker-compose up -d
# 构建并启动(重新构建镜像)
docker-compose up -d --build
# 停止并删除所有容器、网络
docker-compose down
# 停止并删除所有容器、网络、数据卷
docker-compose down -v
# 查看运行中的服务
docker-compose ps
# 查看日志
docker-compose logs -f --tail=100
# 进入容器
docker-compose exec app /bin/sh
# 重启某个服务
docker-compose restart app
# 查看配置(解析后输出)
docker-compose config
五、实战示例:.NET Core + MySQL + Nginx
version: "3.9"
services:
# MySQL 数据库
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
# .NET Core 应用
app:
build:
context: .
dockerfile: Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__Default=Server=db;Database=appdb;User=root;Password=rootpass;
depends_on:
db:
condition: service_healthy
ports:
- "5000:80"
restart: unless-stopped
# Nginx 反向代理
nginx:
image: nginx:1.25-alpine
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
depends_on:
- app
restart: unless-stopped
volumes:
db_data:
六、多环境配置
Docker Compose 支持多文件覆盖:
# 基础配置 docker-compose.yml
# 开发覆盖 docker-compose.override.yml(自动加载)
# 生产覆盖 docker-compose.prod.yml
# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
生产环境覆盖示例(docker-compose.prod.yml)
version: "3.9"
services:
app:
environment:
- ASPNETCORE_ENVIRONMENT=Production
deploy:
resources:
limits:
cpus: '2.0'
memory: 1G
restart: always
最佳实践:始终将
docker-compose.yml纳入版本控制,使用.env文件管理敏感信息,用多文件覆盖区分不同环境。