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: true3.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 -d3. 服务依赖与条件(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