引言
Docker Compose是容器编排的利器。本文介绍Docker Compose的实战应用。
一、基础语法
1.1 docker-compose.yml结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| version: '3.8'
services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html networks: - frontend depends_on: - api
api: build: ./api environment: - DB_HOST=db - DB_PORT=3306 networks: - frontend - backend
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: mydb volumes: - db-data:/var/lib/mysql networks: - backend
networks: frontend: backend:
volumes: db-data:
|
二、常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker-compose up -d
docker-compose down
docker-compose ps
docker-compose logs -f web
docker-compose restart web
docker-compose build
docker-compose exec web sh
|
三、实战示例
3.1 Spring Boot + MySQL + Redis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| version: '3.8'
services: app: build: . ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb SPRING_REDIS_HOST: redis depends_on: - db - redis networks: - app-network
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: mydb volumes: - mysql-data:/var/lib/mysql networks: - app-network
redis: image: redis:7-alpine volumes: - redis-data:/data networks: - app-network
networks: app-network:
volumes: mysql-data: redis-data:
|
3.2 前后端分离项目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| version: '3.8'
services: frontend: build: ./frontend ports: - "80:80" depends_on: - backend networks: - app-network
backend: build: ./backend ports: - "8080:8080" environment: DB_HOST: postgres REDIS_HOST: redis depends_on: - postgres - redis networks: - app-network
postgres: image: postgres:15-alpine environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres-data:/var/lib/postgresql/data networks: - app-network
redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis-data:/data networks: - app-network
networks: app-network:
volumes: postgres-data: redis-data:
|
3.3 ELK日志系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| version: '3.8'
services: elasticsearch: image: elasticsearch:8.9.0 environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - es-data:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - elk
logstash: image: logstash:8.9.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - "5044:5044" depends_on: - elasticsearch networks: - elk
kibana: image: kibana:8.9.0 ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch networks: - elk
networks: elk:
volumes: es-data:
|
四、高级特性
4.1 环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| DB_PASSWORD=secret123 REDIS_PORT=6379
services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} redis: image: redis:alpine ports: - "${REDIS_PORT}:6379"
|
4.2 健康检查
1 2 3 4 5 6 7 8 9
| services: app: image: myapp:latest healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 3s retries: 3 start_period: 40s
|
4.3 资源限制
1 2 3 4 5 6 7 8 9 10 11
| services: app: image: myapp:latest deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M
|
五、最佳实践
1 2 3 4 5 6
| 1. 使用.env文件管理环境变量 2. 使用volumes持久化数据 3. 使用networks隔离服务 4. 使用depends_on控制启动顺序 5. 使用健康检查确保服务可用 6. 使用restart: always自动重启
|
总结
Docker Compose核心:
- 服务编排:简化多容器管理
- 网络隔离:服务间通信
- 数据持久化:volumes管理
- 环境管理:.env文件配置
参考资料