在现代应用开发中,微服务架构已成为主流,一个应用往往由多个相互关联的服务组成。手动管理这些服务的启动、停止和互联变得异常复杂。Docker Compose 应运而生,它通过一个简单的 YAML 文件就能定义和运行多容器 Docker 应用,极大地简化了容器化应用的管理工作。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的 YAML 文件来配置应用的所有服务,然后通过一条命令就能创建并启动所有服务。
#技术分享| 特性 | Docker CLI | Docker Compose | | ---
| 单容器管理 | ✅ 优秀 | ⚠️ 支持但非主要用途 | | 多容器管理 | ❌ 复杂,需要脚本 | ✅ 优秀,原生支持 | | 配置方式 | 命令行参数 | YAML 声明式文件 | | 依赖管理 | 手动处理 | 自动处理服务依赖 | | 环境复现 | 困难 | 简单且一致 |
Linux 系统安装 :
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
Windows/macOS 安装 :Docker Desktop 已经包含了 Docker Compose,无需单独安装。
docker compose version
docker-compose --version sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
简化多容器管理 :一条命令管理所有服务
环境一致性 :确保开发、测试、生产环境一致
快速搭建开发环境 :新成员只需一条命令即可获得完整环境
服务依赖管理 :自动处理服务启动顺序
配置即代码 :版本控制所有环境配置
本地开发环境搭建
自动化测试环境
单主机小型部署
CI/CD 流水线中的测试阶段
演示和教学环境
Service :一个容器化的应用/服务
Project :由多个服务组成的完整应用
Compose File :定义服务、网络、卷的 YAML 文件
典型的 Docker Compose 项目结构:
my-app/ ├── docker-compose.yml # 主配置文件├── .env # 环境变量文件├── backend/ # 后端服务目录│ ├── Dockerfile │ └── src/ ├── frontend/ # 前端服务目录│ ├── Dockerfile │ └── src/ └── database/ # 数据库初始化脚本└── init.sql
version: '3.8'services: web: build: . ports: - "5000:5000"redis: image: "redis:alpine"networks: app-network: driver: bridgevolumes: db-data: driver: local
基本配置 :
services: webapp: image: nginx:latest container_name: my-nginx restart: unless-stopped depends_on: - db - redis
构建配置 :
services: app: build: context: ./dir dockerfile: Dockerfile args: buildno: 1 user: someuser
网络配置 :
services: web: networks: - frontend - backendnetworks: frontend: driver: bridge ipam: config: - subnet: 172.16.238.0/24 backend: driver: bridge
数据卷配置 :
services: db: volumes: - db-data:/var/lib/mysql - ./logs:/app/logs - /etc/localtime:/etc/localtime:rovolumes: db-data: driver: local driver_opts: type: nfs o: addr=192.168.1.1,rw device: ":/path/to/nfs"
环境变量配置 :
services: web: environment: - DATABASE_HOST=db - REDIS_HOST=redis - DEBUG=false env_file: - ./common.env - ./apps/web.env
docker-compose up -d docker-compose up -d web redis docker-compose down docker-compose ps docker-compose logs docker-compose logs -f web docker-compose restart web docker-compose pause web docker-compose unpause web
docker-compose exec web bash docker-compose exec db mysql -u root -p docker-compose run --rm web python manage.py migratedocker-compose configdocker-compose images docker-compose build --no-cachedocker-compose up --scale web=3 --scale worker=2
wordpress-site/ ├── docker-compose.yml ├── .env ├── mysql/ │ └── init.sql └── wordpress/ └── wp-config.php
version: '3.8'services: db: image: mysql:8.0 container_name: wordpress_db restart: always environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - db_data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - wordpress_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 5
wordpress: image: wordpress:6.3 container_name: wordpress_app restart: always depends_on: db: condition: service_healthy environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: ${DB_USER} WORDPRESS_DB_PASSWORD: ${DB_PASSWORD} WORDPRESS_DB_NAME: ${DB_NAME} volumes: - wp_data:/var/www/html - ./wordpress/wp-config.php:/var/www/html/wp-config.php ports: - "80:80" networks: - wordpress_network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80"] interval: 30s timeout: 10s retries: 5
phpmyadmin: image: phpmyadmin:latest container_name: wordpress_phpmyadmin restart: always depends_on: - db environment: PMA_HOST: db PMA_PORT: 3306 PMA_USER: ${DB_USER} PMA_PASSWORD: ${DB_PASSWORD} ports: - "8080:80" networks: - wordpress_network
volumes: db_data: driver: local wp_data: driver: localnetworks: wordpress_network: driver: bridge ipam: config: - subnet: 172.20.0.0/16# 数据库配置DB_ROOT_PASSWORD=secure_root_password_123 DB_NAME=wordpress_db DB_USER=wordpress_user DB_PASSWORD=secure_password_456# WordPress 配置WP_DEBUG=false WP_HOME=http://localhost
cd wordpress-site docker-compose up -d docker-compose ps docker-compose logs -f docker-compose down docker-compose down -v docker run --rm -v wordpress-site_db_data:/source -v $(pwd):/backup alpine tar czf /backup/db-backup-$(date +%Y%m%d).tar.gz -C /source . docker-compose up -d --scale wordpress=3
version: '3.8'x-common-variables: &common-variables SPRING_PROFILES_ACTIVE: docker EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: http://discovery:8761/eurekaservices: discovery: image: springcloud/eureka-server:latest container_name: eureka-discovery ports: - "8761:8761" networks: - microservices-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8761"] interval: 30sgateway: build: ./api-gateway container_name: api-gateway ports: - "8080:8080" environment: <<: *common-variables depends_on: - discovery networks: - microservices-net restart: on-failureuser-service: build: ./user-service container_name: user-service environment: <<: *common-variables DATABASE_URL: jdbc:postgresql://user-db:5432/userdb depends_on: - discovery - user-db networks: - microservices-net deploy: replicas: 2order-service: build: ./order-service container_name: order-service environment: <<: *common-variables DATABASE_URL: jdbc:postgresql://order-db:5432/orderdb depends_on: - discovery - order-db networks: - microservices-netuser-db: image: postgres:13 container_name: user-database environment: POSTGRES_DB: userdb POSTGRES_USER: user POSTGRES_PASSWORD: password123 volumes: - user-data:/var/lib/postgresql/data - ./init/user-db-init.sql:/docker-entrypoint-initdb.d/init.sql networks: - microservices-netorder-db: image: postgres:13 container_name: order-database environment: POSTGRES_DB: orderdb POSTGRES_USER: order POSTGRES_PASSWORD: password123 volumes: - order-data:/var/lib/postgresql/data networks: - microservices-netzipkin: image: openzipkin/zipkin:latest container_name: zipkin ports: - "9411:9411" networks: - microservices-netadminer: image: adminer:latest container_name: adminer ports: - "8081:8080" networks: - microservices-netvolumes: user-data: driver: local order-data: driver: localnetworks: microservices-net: driver: bridge ipam: config: - subnet: 172.25.0.0/16
docker-compose up -d --builddocker-compose up -d --build gateway user-servicedocker-compose logs -f gateway docker-compose up -d --scale user-service=3docker-compose run --rm user-service ./migrate.shdocker-compose ps docker-compose top docker-compose exec user-service bash docker-compose build user-service docker-compose up -d --no-deps user-service
使用多个 Compose 文件 :
docker-compose.ymldocker-compose.override.ymldocker-compose.prod.ymldocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
环境特定的配置 :
version: '3.8'services: web: volumes: - ./src:/app/src ports: - "9229:9229" environment: - NODE_ENV=development - DEBUG=truedb: ports: - "5432:5432"
services: web: deploy: resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 256Mhealthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s
services: database: read_only: true security_opt: - no-new-privileges:true tmpfs: - /tmp:rw,size:64Mapp: user: "1000:1000" cap_drop: - ALL cap_add: - NET_BIND_SERVICE
docker-compose network ls docker-compose exec web nslookup database docker-compose port web 80
docker-compose logs --tail=100 webdocker-compose up -d --force-recreate webdocker-compose config --services
docker-compose downsudo lsof -i :8080docker-compose down -v docker volume prune
Docker Compose 是一个极其强劲的工具,它通过声明式的 YAML 配置文件简化了多容器应用的管理。通过本文的学习,你应该能够:
理解 Docker Compose 的核心概念 和价值主张
掌握 Compose 文件的语法和结构 ,能够编写复杂的配置
使用各种 Compose 命令 来管理应用生命周期
部署实际项目 ,如 WordPress 和微服务架构
遵循最佳实践 ,确保配置的可维护性和安全性
记住,Docker Compose 特别适合开发、测试和单机部署场景。对于生产环境的多机部署,提议思考 Docker Swarm 或 Kubernetes 等编排工具。
通过不断实践和探索,你将能够充分利用 Docker Compose 的强劲功能,显著提高开发效率和部署可靠性。
 ¥14.90
 
                ¥14.90
            steam PC中文正版游戏 女巫来了 国区激活码CDKEY Witch It 躲猫猫 捉迷藏游戏 多人线上玩家对战 休闲游戏
 ¥22.00
 
                ¥22.00
            PC正版Uplay 纪元1800 Anno1800标准/黄金版/完整版/ 第一第二第三年第四年季票国区激活码代购
 ¥55.00
 
                ¥55.00
            PC中文 steam游戏 正版游戏 Devil May Cry 5 鬼泣5 DMC5国区激活码国区CDK
 ¥17.80
 
                ¥17.80
            PC中文正版 steam平台 国区 游戏 狙击精英4 Sniper Elite 4 豪华版 季票 全DLC 激活码 CDkey
 ¥28.80
 
                ¥28.80
            PC中文正版 steam平台 国区 游戏 拳皇13 格斗之王十三 THE KING OF FIGHTERS XIII STEAM EDITION 激活码
 ¥11.50
 
                ¥11.50
            PC中文正版steam游戏 了不起的修仙模拟器 1 竹林深处 武当仙踪 激活码KEY