docker-compose
·
一、Docker Compose 是什么?
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过一个 YAML 文件(docker-compose.yml)配置所有服务,实现一键启动、停止和管理整个应用栈。
核心功能
- 多容器编排:管理多个关联容器(如 Web + DB + Cache)。
- 依赖管理:自动处理服务启动顺序。
- 隔离环境:每个项目拥有独立的网络和卷。
- 配置即代码:所有配置版本化,便于协作。
二、核心概念
| 概念 | 说明 |
|---|---|
| Service | 一个容器化的服务(如 web、db),对应 docker-compose.yml 中的一个配置块。 |
| Project | 由一组服务组成的完整应用,默认以所在目录名命名(可通过 -p 指定)。 |
| Network | 自动创建专属网络,服务间通过服务名通信(无需 IP)。 |
| Volume | 持久化数据存储,可在服务间共享。 |
三、docker-compose.yml 文件详解
1. 基本结构
version: '3.8' # 指定 Compose 版本(与 Docker 引擎版本对应)
services: # 定义所有服务
web: # 服务名称
image: nginx:latest # 使用现成镜像
ports:
- "80:80"
db:
build: ./db # 通过 Dockerfile 构建镜像
environment:
POSTGRES_PASSWORD: password
volumes: # 定义数据卷
db-data:
networks: # 定义网络(可选)
app-net:
driver: bridge
2. 常用配置项
| 配置项 | 说明 | 示例 |
|---|---|---|
build |
基于 Dockerfile 构建镜像 | build: ./dir 或 build: context: ./dir dockerfile: Dockerfile.dev |
image |
直接使用现有镜像 | image: redis:alpine |
ports |
端口映射(宿主机:容器) | ports: - "8080:80" |
volumes |
挂载宿主机目录或命名卷 | volumes: - ./data:/app/data |
environment |
设置环境变量 | environment: DEBUG: "1" |
depends_on |
定义服务依赖(启动顺序) | depends_on: - db |
networks |
指定自定义网络 | networks: - app-net |
command |
覆盖容器默认启动命令 | command: python app.py |
restart |
容器退出时的重启策略 | restart: always |
四、常用命令
1. 生命周期管理
| 命令 | 作用 |
|---|---|
docker-compose up -d |
启动所有服务(后台运行) |
docker-compose down |
停止并删除所有容器、网络 |
docker-compose start |
启动已存在的服务 |
docker-compose stop |
停止服务(保留容器) |
docker-compose restart |
重启服务 |
2. 调试与维护
| 命令 | 作用 |
|---|---|
docker-compose ps |
查看运行状态 |
docker-compose logs -f web |
实时查看服务日志 |
docker-compose exec web bash |
进入容器命令行 |
docker-compose build |
重新构建镜像 |
docker-compose config |
验证配置文件语法 |
3. 扩展操作
| 命令 | 作用 |
|---|---|
docker-compose pull |
拉取服务所需镜像 |
docker-compose scale web=3 |
扩展服务实例数量(需无状态服务) |
docker-compose run --rm web cmd |
临时运行一次性命令(如数据库迁移) |
五、实战示例:部署 Django + PostgreSQL
1. 项目结构
myapp/
├── django/
│ ├── Dockerfile # 构建 Django 镜像
│ ├── requirements.txt
│ └── manage.py
├── db/
│ └── init.sql # 数据库初始化脚本
└── docker-compose.yml
2. docker-compose.yml
version: '3.8'
services:
web:
build: ./django
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./django:/app
ports:
- "8000:8000"
depends_on:
- db
environment:
- DB_HOST=db
- DB_NAME=postgres
- DB_USER=postgres
- DB_PASSWORD=postgres
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
postgres_data:
3. 操作流程
# 启动服务
cd myapp
docker-compose up -d
# 执行数据库迁移
docker-compose exec web python manage.py migrate
# 访问应用
curl http://localhost:8000
六、高级技巧
-
环境变量分离:
使用.env文件管理敏感配置:# .env DB_PASSWORD=secret# docker-compose.yml environment: - DB_PASSWORD=${DB_PASSWORD} -
多环境配置:
通过-f指定不同配置文件:docker-compose -f docker-compose.prod.yml up -
健康检查:
确保服务可用后再启动依赖项:healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3
七、常见问题
-
容器启动顺序问题:
depends_on仅控制启动顺序,不保证服务可用性。需结合健康检查或脚本等待依赖服务。 -
卷权限问题:
Linux 下可能出现挂载目录权限错误,可通过:ro(只读)或调整宿主机权限解决。 -
Compose 版本兼容性:
不同 Docker 引擎版本支持的 Compose 文件版本不同(对照表)。
八、总结
- 适用场景:开发环境、CI/CD 流水线、单机部署。
- 优势:简化多容器管理,配置可版本化。
- 局限性:不适合生产集群(需 Swarm/Kubernetes)。
通过掌握 Docker Compose,你可以高效管理复杂的多服务应用,提升开发和部署效率!
更多推荐




所有评论(0)