
Docker Compose 是一个用于定义和运行多容器 Docker 应用 的工具。通过一个 docker-compose.yml 配置文件来声明多个容器(如应用、数据库等),然后用一条命令启动或停止整个应用栈。
一、Docker Compose
在没有 Docker Compose 之前,如果要用 Docker 跑一个完整的应用(比如一个 Python Web 应用 + MySQL 数据库),需要手动执行一连串 docker run 命令:
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
docker run -d --name redis redis:7.0
docker run -d --name app -p 8080:8080 myapp:latest
而 Docker Compose 通过一个声明式的配置文件,把上面所有问题都解决了。
二、文件:docker-compose.yml
docker-compose.yml 是 Compose 的配置文件,采用 YAML 格式。它定义了应用的服务(services) 、网络(networks) 和数据卷(volumes)。
示例
version: '3.8'
services:
# ========== MySQL 数据库服务 ==========
mysql:
image: mysql:8.0
container_name: myapp_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
MYSQL_USER: app_user
MYSQL_PASSWORD: app_pass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app_network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
# ========== Python 应用服务 ==========
app:
build:
context: .
dockerfile: Dockerfile
container_name: myapp_python
restart: always
ports:
- "8080:8080"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=app_user
- DB_PASSWORD=app_pass
- DB_NAME=myapp
volumes:
- ./app:/app
- /app/__pycache__ # 排除缓存
depends_on:
mysql:
condition: service_healthy
networks:
- app_network
command: python app.py
# ========== Redis 缓存服务 ==========
redis:
image: redis:7.0-alpine
container_name: myapp_redis
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- app_network
# ========== 数据卷声明 ==========
volumes:
mysql_data:
redis_data:
# ========== 网络声明 ==========
networks:
app_network:
driver: bridge
三、配置项
1. services:服务的定义
每个服务代表一个容器。
| 字段 | 说明 | 示例 |
|---|---|---|
image |
使用现成的镜像 | image: mysql:8.0 |
build |
从 Dockerfile 构建镜像 | build: . |
container_name |
指定容器名称 | container_name: myapp_mysql |
restart |
重启策略 | restart: always |
ports |
端口映射 | ports: - "8080:8080" |
environment / env_file |
环境变量 | environment: DB_HOST=mysql |
volumes |
挂载数据卷 | volumes: - mysql_data:/var/lib/mysql |
networks |
加入的网络 | networks: - app_network |
depends_on |
依赖关系 | depends_on: - mysql |
command |
覆盖默认命令 | command: python app.py |
healthcheck |
健康检查 | healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] |
2. volumes:数据卷声明
volumes:
mysql_data: # 命名卷,由 Docker 管理
redis_data:
# 也可以指定外部卷
# external_data:
# external: true
3. networks:网络声明
networks:
app_network:
driver: bridge
# 也可以使用 overlay 网络(Swarm 模式)
# overlay_network:
# driver: overlay
四、常用命令
基础命令
| 命令 | 作用 |
|---|---|
docker-compose up -d |
启动所有服务(-d 后台运行) |
docker-compose down |
停止并删除所有容器 |
docker-compose ps |
查看服务状态 |
docker-compose logs |
查看日志 |
docker-compose logs -f app |
实时查看 app 服务的日志 |
docker-compose stop |
停止服务(不删除容器) |
docker-compose start |
启动已停止的服务 |
docker-compose restart |
重启服务 |
构建与管理
# 构建镜像
docker-compose build
# 构建时不使用缓存
docker-compose build --no-cache
# 拉取所有服务的镜像
docker-compose pull
# 进入某个服务容器执行命令
docker-compose exec app bash
# 查看某个服务的端口映射
docker-compose port app 8080
扩展命令
# 启动指定服务
docker-compose up -d mysql redis
# 以特定配置文件启动
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 指定项目名称(默认是目录名)
docker-compose -p myproject up -d
五、进阶配置
1. 环境变量文件(.env)
# .env 文件
DB_PASSWORD=123456
APP_PORT=8080
# docker-compose.yml
services:
app:
ports:
- "${APP_PORT}:8080"
environment:
- DB_PASSWORD=${DB_PASSWORD}
2. 多环境配置
# docker-compose.override.yml(默认会被自动加载)
services:
app:
environment:
- DEBUG=true
# docker-compose.prod.yml(生产环境用)
services:
app:
environment:
- DEBUG=false
restart: always
# 使用生产配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
3. 服务依赖与条件(depends_on)
services:
app:
depends_on:
mysql:
condition: service_healthy # 等待健康检查通过
redis:
condition: service_started # 等待启动即可
4. 资源限制
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M