Docker Compose多容器编排
大约 6 分钟Docker指南DockerDocker Compose
Docker Compose多容器编排
什么是Docker Compose
Docker Compose是Docker官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。它允许用户通过一个单独的YAML文件来定义和运行多个Docker容器应用,简化了多容器应用的管理。
Docker Compose的优势
- 简化配置:通过YAML文件定义服务,避免重复的命令行参数
- 批量管理:可以一次性启动、停止、重建多个服务
- 环境隔离:不同的项目可以在不同的环境中运行
- 可扩展性:支持服务的水平扩展
- 版本控制:YAML文件可以纳入版本控制
Docker Compose安装
Linux系统安装
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装
docker-compose --version
Windows和Mac系统
Docker Desktop已经内置了Docker Compose,无需单独安装。
Docker Compose核心概念
1. 服务(Service)
服务是运行相同镜像的一个或多个容器实例。在docker-compose.yml文件中定义服务的配置。
2. 项目(Project)
项目是所有服务的集合,通常对应一个完整的应用。项目名称默认为当前目录名称。
3. 卷(Volume)
用于持久化数据和在服务之间共享数据。
4. 网络(Network)
用于服务之间的通信。
Docker Compose配置文件
基本结构
version: "3.8"
services:
service1:
# 服务配置
service2:
# 服务配置
volumes:
# 卷配置
networks:
# 网络配置
服务配置详解
version: "3.8"
services:
web:
# 镜像
image: nginx:alpine
# 构建配置(与image二选一)
build:
context: .
dockerfile: Dockerfile
args:
- BUILD_ARG=value
# 端口映射
ports:
- "8080:80"
- "443:443"
# 环境变量
environment:
- ENV_VAR=value
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
# 依赖服务
depends_on:
- db
- redis
# 数据卷
volumes:
- ./html:/usr/share/nginx/html
- web-data:/var/www
# 网络配置
networks:
- frontend
- backend
# 重启策略
restart: unless-stopped
# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
# 资源限制
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
restart: unless-stopped
volumes:
web-data:
db-data:
networks:
frontend:
backend:
Docker Compose常用命令
1. 启动和停止服务
# 启动所有服务
docker-compose up
# 后台启动所有服务
docker-compose up -d
# 启动指定服务
docker-compose up service1 service2
# 停止所有服务
docker-compose down
# 停止并删除卷
docker-compose down -v
# 停止并删除镜像
docker-compose down --rmi all
2. 服务管理
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 实时查看服务日志
docker-compose logs -f
# 查看特定服务日志
docker-compose logs service_name
# 重启服务
docker-compose restart
# 重启特定服务
docker-compose restart service_name
# 停止服务
docker-compose stop
# 启动已停止的服务
docker-compose start
3. 构建和镜像管理
# 构建服务
docker-compose build
# 构建特定服务
docker-compose build service_name
# 拉取服务镜像
docker-compose pull
# 推送服务镜像
docker-compose push
4. 执行命令
# 在服务中执行命令
docker-compose exec service_name command
# 进入服务容器
docker-compose exec service_name /bin/bash
# 运行一次性命令
docker-compose run service_name command
5. 扩展服务
# 扩展服务实例数量
docker-compose up --scale web=3
实际应用示例
1. Web应用+数据库
version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
depends_on:
- app
networks:
- frontend
app:
build: ./app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
networks:
- frontend
- backend
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
volumes:
db-data:
networks:
frontend:
backend:
2. 微服务架构
version: "3.8"
services:
gateway:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- frontend
user-service:
build: ./user-service
environment:
- DB_HOST=user-db
- DB_PORT=5432
depends_on:
- user-db
networks:
- backend
user-db:
image: postgres:13
environment:
POSTGRES_DB: userdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- user-db-data:/var/lib/postgresql/data
networks:
- backend
order-service:
build: ./order-service
environment:
- DB_HOST=order-db
- DB_PORT=5432
depends_on:
- order-db
networks:
- backend
order-db:
image: postgres:13
environment:
POSTGRES_DB: orderdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- order-db-data:/var/lib/postgresql/data
networks:
- backend
volumes:
user-db-data:
order-db-data:
networks:
frontend:
backend:
3. 开发环境配置
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev
db:
image: postgres:13
environment:
POSTGRES_DB: development
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
db-data:
Docker Compose高级功能
1. 多环境配置
# docker-compose.yml
version: "3.8"
services:
web:
image: nginx:${NGINX_VERSION:-alpine}
ports:
- "${WEB_PORT:-80}:80"
# docker-compose.override.yml (开发环境)
version: "3.8"
services:
web:
volumes:
- .:/usr/share/nginx/html
environment:
- NODE_ENV=development
# docker-compose.prod.yml (生产环境)
version: "3.8"
services:
web:
restart: unless-stopped
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
使用不同环境配置:
# 开发环境
docker-compose up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
2. 服务扩展
version: "3.8"
services:
web:
image: nginx:alpine
deploy:
replicas: 1
ports:
- "80:80"
扩展服务:
# 扩展到3个实例
docker-compose up --scale web=3
3. 自定义网络
version: "3.8"
services:
web:
image: nginx:alpine
networks:
- frontend
- backend
app:
image: node:alpine
networks:
- backend
- database
db:
image: postgres:13
networks:
- database
networks:
frontend:
driver: bridge
backend:
driver: bridge
database:
driver: bridge
Docker Compose最佳实践
1. 配置文件组织
project/
├── docker-compose.yml # 基础配置
├── docker-compose.override.yml # 开发环境覆盖
├── docker-compose.prod.yml # 生产环境配置
├── .env # 环境变量
└── services/
├── web/
│ └── Dockerfile
└── app/
└── Dockerfile
2. 环境变量管理
# .env文件
WEB_PORT=8080
DB_PASSWORD=secretpassword
REDIS_URL=redis://redis:6379
# docker-compose.yml
version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "${WEB_PORT}:80"
environment:
- REDIS_URL=${REDIS_URL}
3. 数据持久化
version: "3.8"
services:
db:
image: postgres:13
volumes:
# 命名卷(推荐)
- db-data:/var/lib/postgresql/data
# 绑定挂载(开发环境)
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
db-data:
4. 健康检查和依赖
version: "3.8"
services:
web:
image: nginx:alpine
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
常用Docker Compose命令总结
命令 | 说明 |
---|---|
docker-compose up | 启动所有服务 |
docker-compose up -d | 后台启动所有服务 |
docker-compose down | 停止并删除所有服务 |
docker-compose ps | 查看服务状态 |
docker-compose logs | 查看服务日志 |
docker-compose exec | 在服务中执行命令 |
docker-compose build | 构建服务镜像 |
docker-compose pull | 拉取服务镜像 |
docker-compose restart | 重启服务 |
docker-compose stop | 停止服务 |
docker-compose start | 启动已停止的服务 |
故障排查技巧
1. 服务启动失败
# 查看服务日志
docker-compose logs service_name
# 查看服务详细信息
docker-compose ps
# 检查配置文件语法
docker-compose config
2. 网络连接问题
# 测试容器间网络连接
docker-compose exec service1 ping service2
# 查看网络配置
docker-compose exec service1 cat /etc/hosts
3. 数据卷问题
# 查看数据卷
docker volume ls | grep project_name
# 检查数据卷内容
docker run --rm -v project_name_volume:/data alpine ls /data
总结
Docker Compose是管理多容器Docker应用的强大工具。通过YAML配置文件,可以轻松定义和运行复杂的多服务应用。掌握Docker Compose的使用方法,可以大大提高开发和部署效率,确保应用环境的一致性。