什么是Docker Compose?

Docker只能管理单个容器,Compose可以同时管理多个容器,通过一个YAML文件定义整个应用栈。

简单理解

  • 单个Docker命令:启动1个容器
  • Compose:启动10个容器,自动配置网络和数据卷

安装Docker Compose

方式1:下载二进制

1
2
3
4
5
6
7
8
# 下载最新版
curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

方式2:pip安装

1
pip install docker-compose

compose.yml 格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3.8'                # 版本号

services: # 服务列表
web: # 服务名
image: nginx # 镜像
ports: # 端口
- "80:80"
volumes: # 数据卷
- ./html:/usr/share/nginx/html

db: # 另一个服务
image: mysql:5.7
environment: # 环境变量
MYSQL_ROOT_PASSWORD: 123456

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 启动所有服务
docker-compose up

# 后台启动
docker-compose up -d

# 停止服务
docker-compose stop

# 重启服务
docker-compose restart

# 查看日志
docker-compose logs
docker-compose logs -f web # 查看特定服务

# 停止并删除
docker-compose down

# 停止、删除、删除数据卷
docker-compose down -v

# 查看运行状态
docker-compose ps

实战示例

示例1:LNMP架构(Linux+Nginx+MySQL+PHP)

创建 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
version: '3.8'

services:
nginx:
image: nginx:1.21
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/usr/share/nginx/html
depends_on:
- php
- mysql

php:
image: php:7.4-fpm
volumes:
- ./www:/usr/share/nginx/html

mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: mydb
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:

运行:

1
docker-compose up -d

访问 http://服务器IP 即可。

示例2:部署WordPress博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.8'

services:
wordpress:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_PASSWORD: 123456
depends_on:
- db

db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- db-data:/var/lib/mysql

volumes:
db-data:

运行:

1
docker-compose up -d

访问 http://服务器IP:8080 配置WordPress。

示例3:监控服务(Grafana+Prometheus)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.8'

services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml

grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin
depends_on:
- prometheus

运行:

1
docker-compose up -d

访问:

  • Prometheus: http://服务器IP:9090
  • Grafana: http://服务器IP:3000(admin/admin)

网络配置

默认网络

Compose自动创建网络,服务之间可以用服务名互相访问。

自定义网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.8'

services:
web:
networks:
- frontend
- backend

db:
networks:
- backend

networks:
frontend:
backend:

外部网络

1
2
3
services:
app:
network_mode: "host" # 使用主机网络

数据卷配置

命名卷

1
2
volumes:
db-data: # 命名卷

目录挂载

1
2
3
volumes:
- ./data:/var/lib/mysql # 挂载本地目录
- /etc/localtime:/etc/localtime:ro # 只读挂载(同步时间)

环境变量

直接定义

1
2
3
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=mydb

从文件读取

创建 .env 文件:

1
2
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=mydb

compose.yml 中引用:

1
2
3
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}

多环境配置

创建多个配置文件:

  • docker-compose.yml - 默认配置
  • docker-compose.prod.yml - 生产环境
  • docker-compose.dev.yml - 开发环境

使用:

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

常用技巧

技巧1:扩展服务

1
2
# 启动3个web服务
docker-compose up -d --scale web=3

技巧2:只启动特定服务

1
2
docker-compose up nginx       # 只启动nginx
docker-compose up -d nginx db # 启动nginx和db

技巧3:查看服务依赖

1
2
docker-compose config --services
docker-compose config

技巧4:重启单个服务

1
docker-compose restart nginx

常见问题

Q: 容器之间无法通信?
A: 检查网络配置,确保在同一网络下,用服务名(不是IP)访问。

Q: 如何查看容器日志?
A: docker-compose logs -f 服务名

Q: 如何修改配置后生效?
A: docker-compose down && docker-compose up -d

Q: compose.yml 和 dockerfile 什么关系?
A: dockerfile构建镜像,compose.yml管理容器。


总结

  • Docker Compose用YAML文件定义多服务
  • docker-compose up -d 启动,down 停止删除
  • 服务之间用服务名互相访问(自动网络)
  • volumes 持久化数据,depends_on 定义依赖
  • environment 设置环境变量,.env 文件统一管理
  • 多环境用 -f 参数指定配置文件
  • logs -f 查看日志,ps 查看状态

下一篇:Nginx反向代理配置详解。