Docker Docker Compose 从入门到精通:构建高效容器化应用的终极指南

测试-鹏哥 · August 06, 2025 · 463 hits

在现代软件开发中,应用往往由多个服务组成,如 Web 服务器、数据库、缓存等。管理这些服务的部署和配置变得越来越复杂。Docker Compose 作为一个强大的工具,能够帮助我们轻松定义和运行多容器 Docker 应用。本文将深入探讨 Docker Compose 的核心概念、高级特性和最佳实践,帮助您构建高效的容器化应用。
什么是 Docker Compose?
Docker Compose 是 Docker 官方提供的一个工具,用于定义和运行多容器 Docker 应用程序。通过一个 YAML 文件(docker-compose.yml),您可以配置应用程序的所有服务,然后使用单个命令创建和启动所有服务。
可以把 Docker 比作"单个房间",那么 Docker Compose 就是"整栋房子的建筑图纸";如果 Docker 容器是"单个演员",那么 Docker Compose 就是"整部戏的导演脚本"。
核心概念
在深入了解 Docker Compose 之前,我们需要理解几个核心概念:
服务(Service)
一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
网络(Network)
Docker Compose 会自动为项目创建一个默认网络,使服务间可以相互通信。
数据卷(Volume)
用于持久化数据,即使容器被删除,数据依然存在。
Docker Compose 基本结构
一个典型的 docker-compose.yml 文件结构如下:

version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "80:80"
depends_on:
- db
- redis
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf

db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql_data:/var/lib/mysql

redis:
image: redis:alpine

volumes:
mysql_data:

关键字段说明
version:指定 Compose 文件格式版本
services:定义应用中的各个服务
image:指定服务使用的镜像
build:指定构建镜像的 Dockerfile 路径
ports:映射端口
environment:设置环境变量
volumes:挂载数据卷
depends_on:定义服务依赖关系

Docker Compose 高级特性

  1. 网络配置 Docker Compose 默认会为项目创建一个网络,但您也可以自定义网络配置:

version: "3.8"
services:
web:
image: nginx
networks:
- frontend
- backend

db:
image: mysql
networks:
- backend

networks:
frontend:
driver: bridge
backend:
driver: bridge

  1. 数据卷管理 数据卷是持久化数据的重要方式,支持多种类型:

version: "3.8"
services:
db:
image: mysql
volumes:
# 命名卷
- mysql_data:/var/lib/mysql
# 绑定挂载
- ./data:/data
# 临时文件系统
- type: tmpfs
target: /tmp

volumes:
mysql_data:

  1. 环境变量管理 使用环境变量可以实现配置的灵活管理:

version: "3.8"
services:
web:
image: nginx
environment:
- ENV=production
- DATABASE_URL=${DATABASE_URL}
env_file:
- .env

  1. 健康检查 通过健康检查确保服务正常运行:

version: "3.8"
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
实际应用案例
让我们通过一个完整的项目案例来演示 Docker Compose 的强大功能。以下是一个典型的 Web 应用配置:

version: "3.8"

services:
vuefront:
image: nginx:alpine
container_name: itp-vuefront
ports:
- "8080:80"
volumes:
- ./front_end_pc/nginx.conf:/etc/nginx/nginx.conf
- ./front_end_pc/dist:/usr/share/nginx/html
depends_on:
- django-app
restart: unless-stopped
networks:
- itp-network
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:80/"]
interval: 60s
timeout: 10s
retries: 5
start_period: 300s

django-app:
build:
context: ./ITP
dockerfile: Dockerfile
container_name: itp-django-end
ports:
- "8000:8000"
environment:
- DJANGO_SETTINGS_MODULE=ITP.settings.dev
- ALLOWED_HOSTS=*
- CELERY_BROKER_URL=redis://redis:6379/6
volumes:
- ./static:/data/static
- ./media:/data/media
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
networks:
- itp-network
command: >
sh -c "
python manage.py collectstatic --noinput &&
python manage.py migrate &&
gunicorn ITP.wsgi:application --bind 0.0.0.0:8000
"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:8000/"]
interval: 30s
timeout: 10s
retries: 5
start_period: 300s

mysql:
image: mysql:5.7
container_name: itp-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: itp_db
MYSQL_USER: itp_user
MYSQL_PASSWORD: userpassword
volumes:
- mysql_data:/var/lib/mysql
restart: unless-stopped
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 5s
retries: 10
networks:
- itp-network

redis:
image: redis:alpine
container_name: itp-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 10
networks:
- itp-network

celery-worker:
build:
context: ./ITP
dockerfile: Dockerfile
container_name: itp-celery-worker
command: celery -A ITP.celery_app worker --loglevel=info
environment:
- CELERY_BROKER_URL=redis://redis:6379/6
depends_on:
- redis
- mysql
restart: unless-stopped
networks:
- itp-network
volumes:
- ./media:/data/media
- ./ITP:/app

volumes:
mysql_data:
redis_data:

networks:
itp-network:
driver: bridge
Docker Compose 最佳实践

  1. 使用多环境配置 通过多个 Compose 文件管理不同环境:

开发环境

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

生产环境

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

  1. 合理使用 depends_on 注意区分依赖关系和健康状态:

depends_on:
db:
condition: service_healthy

  1. 资源限制 为容器设置资源限制,避免资源争抢:

services:
web:
image: nginx
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M

  1. 日志管理 配置日志驱动和选项:

services:
web:
image: nginx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
常用命令

命令 说明
docker-compose up 创建并启动容器
docker-compose down 停止并删除容器
docker-compose logs 查看日志
docker-compose ps 查看运行状态
docker-compose exec 在容器中执行命令
docker-compose build 构建或重新构建服务
与 CI/CD 集成
Docker Compose 可以很好地集成到 CI/CD 流程中:

.gitlab-ci.yml 示例

stages:

  • build
  • test
  • deploy

build:
stage: build
script:
- docker-compose build

test:
stage: test
script:
- docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d
- docker-compose exec web pytest

deploy:
stage: deploy
script:
- docker-compose down
- docker-compose up -d
总结
Docker Compose 是简化多容器应用部署和管理的强大工具。通过本文的学习,您应该掌握了:
Docker Compose 的核心概念和基本结构
网络配置、数据卷管理等高级特性
实际应用案例和最佳实践
与 CI/CD 流程的集成方法
合理使用 Docker Compose 可以极大地提高开发效率,简化部署流程,确保环境一致性。无论是在开发、测试还是生产环境中,Docker Compose 都是一个不可或缺的工具。
在实际使用中,建议根据项目需求灵活配置,遵循最佳实践,持续优化您的容器化应用架构。
大家可以拿 ITP 项目练手

项目地址:

https://gitee.com/hp631012651/itp

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up