什么是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:
|
运行:
访问 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:
|
运行:
访问 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
|
运行:
访问:
- 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 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
| docker-compose up -d --scale web=3
|
技巧2:只启动特定服务
1 2
| docker-compose up nginx docker-compose up -d 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反向代理配置详解。