使用Docker Compose定义和运行多容器Docker应用程序,简化容器编排和管理。
Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件配置应用服务,然后使用单个命令创建并启动所有服务。
使用Compose基本上是一个三步过程:
Dockerfile定义应用环境docker-compose.yml定义服务docker compose up启动应用Docker Compose已经包含在Docker Desktop for Windows和Mac中。对于Linux系统,需要单独安装。
# 下载最新版本的Docker Compose
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 Compose V2开始,命令从docker-compose改为docker compose(作为Docker CLI插件)。
大多数现代Docker安装已经包含了Compose V2。
# 检查Compose版本
docker compose version
# 或者使用旧版本命令
docker-compose --version
Compose文件通常命名为docker-compose.yml或docker-compose.yaml,放置在项目根目录。
虽然.yml和.yaml都可以使用,但建议使用.yml以获得更好的兼容性。
version: '3.8' # Compose文件版本
services: # 定义服务
web: # 服务名称
build: . # 构建配置
ports:
- "5000:5000"
database: # 另一个服务
image: postgres:13
environment:
POSTGRES_PASSWORD: example
networks: # 定义网络
app-network:
driver: bridge
volumes: # 定义数据卷
db-data:
build - 构建镜像
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
image - 使用现有镜像
services:
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: mysecretpassword
ports - 端口映射
services:
web:
ports:
- "80:80" # host:container
- "443:443"
- "8080:80" # 映射到不同主机端口
environment - 环境变量
services:
app:
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/mydb
env_file:
- .env
- .env.local
volumes - 数据卷
services:
database:
volumes:
- db-data:/var/lib/postgresql/data # 命名卷
- ./data:/app/data # 绑定挂载
- /etc/localtime:/etc/localtime:ro # 只读挂载
volumes:
db-data:
networks - 网络配置
services:
web:
networks:
- frontend
- backend
api:
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
depends_on - 服务依赖
services:
web:
depends_on:
- database
- redis
database:
image: postgres:13
redis:
image: redis:6-alpine
version: '3.8'
services:
# Web应用服务
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://user:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
volumes:
- .:/app
networks:
- app-network
# 数据库服务
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
# Redis服务
redis:
image: redis:6-alpine
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- app-network
# Nginx反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web
networks:
- app-network
volumes:
postgres-data:
redis-data:
networks:
app-network:
driver: bridge
| 命令 | 描述 | 示例 |
|---|---|---|
docker compose up |
创建并启动所有服务 | docker compose up -d |
docker compose down |
停止并移除所有容器、网络 | docker compose down -v |
docker compose ps |
查看运行中的服务状态 | docker compose ps |
docker compose logs |
查看服务日志 | docker compose logs -f web |
docker compose build |
构建或重新构建服务 | docker compose build --no-cache |
docker compose exec |
在运行中的容器中执行命令 | docker compose exec db psql -U user |
docker compose restart |
重启服务 | docker compose restart web |
docker compose config |
验证并查看Compose文件 | docker compose config |
docker compose pull |
拉取服务镜像 | docker compose pull |
docker compose top |
显示运行的进程 | docker compose top |
为每个需要构建镜像的服务创建Dockerfile
定义服务、网络、数据卷等配置
运行docker compose up启动所有服务
使用Compose命令管理应用生命周期
可以为不同环境(开发、测试、生产)创建多个Compose文件:
version: '3.8'
services:
web:
build: .
environment:
- DATABASE_URL=postgres://db:5432/app
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: app
version: '3.8'
services:
web:
ports:
- "8000:8000"
volumes:
- .:/app
environment:
- DEBUG=true
db:
ports:
- "5432:5432"
version: '3.8'
services:
web:
ports:
- "80:8000"
environment:
- DEBUG=false
db:
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
# 开发环境(默认使用docker-compose.yml和docker-compose.override.yml)
docker compose up
# 生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
使用Compose快速搭建包含数据库、缓存、消息队列的完整开发环境。
version: '3.8'
services:
web:
build: .
ports: ["3000:3000"]
volumes: [".:/app"]
environment:
- DB_HOST=db
- REDIS_HOST=redis
depends_on: [db, redis]
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: devpass
ports: ["5432:5432"]
redis:
image: redis:alpine
ports: ["6379:6379"]
编排多个相互依赖的微服务。
version: '3.8'
services:
gateway:
build: ./gateway
ports: ["80:8080"]
depends_on: [users, orders, products]
users:
build: ./users-service
environment:
- DB_URL=postgres://db:5432/users
orders:
build: ./orders-service
environment:
- DB_URL=postgres://db:5432/orders
products:
build: ./products-service
environment:
- DB_URL=postgres://db:5432/products
db:
image: postgres:13
environment:
POSTGRES_MULTIPLE_DATABASES: users,orders,products
为CI/CD流水线创建隔离的测试环境。
version: '3.8'
services:
tests:
build: .
command: pytest
depends_on:
db:
condition: service_healthy
environment:
- TEST_DATABASE_URL=postgres://test:test@db:5432/test
db:
image: postgres:13
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: test
healthcheck:
test: ["CMD-SHELL", "pg_isready -U test"]
interval: 5s
timeout: 5s
retries: 5
将docker-compose.yml文件纳入版本控制,确保团队所有成员使用相同的配置。
使用.env文件管理敏感信息,避免在Compose文件中硬编码密码和密钥。
# .env 文件
DB_PASSWORD=mysecretpassword
API_KEY=abcdef123456
为需要持久化的数据使用命名卷,开发环境可以使用绑定挂载方便代码热重载。
为服务配置健康检查,确保服务依赖关系正确工作。
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
为生产环境服务设置资源限制,防止单个服务消耗过多资源。
services:
web:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
问题描述: 服务启动时依赖的服务还没有准备好。
解决方案:
depends_on定义服务依赖关系condition: service_healthy
services:
web:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
问题描述: 启动服务时出现端口已被占用的错误。
解决方案:
# 使用自定义项目名称避免冲突
docker compose -p myproject up
# 查看端口占用
netstat -tulpn | grep :80
问题描述: 在Compose文件中设置的环境变量没有生效。
解决方案:
.env文件位置和格式docker compose config验证配置
# 验证Compose配置
docker compose config
# 查看服务环境变量
docker compose exec web env
恭喜!您已经掌握了Docker Compose的核心知识。现在可以轻松定义和管理多容器应用程序,提高开发和部署效率。