引言

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
# .env文件
DB_PASSWORD=secret123
REDIS_PORT=6379

# docker-compose.yml
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核心:

  1. 服务编排:简化多容器管理
  2. 网络隔离:服务间通信
  3. 数据持久化:volumes管理
  4. 环境管理:.env文件配置

参考资料