Docker Compose是用于定义和运行多容器Docker应用的工具。通过YAML文件配置应用服务,一条命令即可启动所有服务。
# Linux
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自带Compose V2
docker compose version
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-network
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data:
# 启动所有服务
docker-compose up
# 后台启动
docker-compose up -d
# 停止服务
docker-compose stop
# 停止并删除容器
docker-compose down
# 停止并删除容器、网络、数据卷
docker-compose down -v
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
# 实时查看日志
docker-compose logs -f
# 重启服务
docker-compose restart
# 构建镜像
docker-compose build
# 构建并启动
docker-compose up --build
version: '3.8'
services:
# Nginx反向代理
nginx:
image: nginx:alpine
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/html:/usr/share/nginx/html:ro
depends_on:
- app
networks:
- frontend
restart: unless-stopped
# Python应用
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: my-app
environment:
- DB_HOST=db
- DB_PORT=3306
- DB_USER=root
- DB_PASSWORD=123456
- REDIS_HOST=redis
depends_on:
- db
- redis
networks:
- frontend
- backend
restart: unless-stopped
# MySQL数据库
db:
image: mysql:8.0
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- mysql-data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- backend
restart: unless-stopped
# Redis缓存
redis:
image: redis:alpine
container_name: my-redis
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- backend
restart: unless-stopped
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes:
mysql-data:
redis-data:
depends_on: 定义服务启动顺序restart: 重启策略(no/always/on-failure/unless-stopped)networks: 服务间网络隔离volumes: 数据持久化# compose.yml
services:
app:
image: myapp
env_file:
- .env
- .env.production
environment:
- NODE_ENV=production
- API_KEY=${API_KEY}
# .env文件
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=secret
API_KEY=your-api-key
services:
app:
build:
context: ./app
dockerfile: Dockerfile.prod
args:
- VERSION=1.0
- BUILD_DATE=2024-01-01
target: production
image: myapp:latest
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
# 启动多个实例
docker-compose up -d --scale app=3
# compose.yml配置
services:
app:
image: myapp
deploy:
replicas: 3
# docker-compose.yml (基础配置)
services:
app:
image: myapp
environment:
- ENV=production
# docker-compose.override.yml (开发环境覆盖)
services:
app:
volumes:
- ./app:/app
environment:
- ENV=development
- DEBUG=true
# 使用特定配置文件
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
# 只启动特定服务
docker-compose up nginx db
# 在服务中执行命令
docker-compose exec app python manage.py migrate
# 查看服务配置
docker-compose config
# 验证配置文件
docker-compose config --quiet
# 拉取所有镜像
docker-compose pull
# 删除停止的容器
docker-compose rm