Docker Compose 多服务编排实战
上次学会了跑单个容器,但这周发现一个现实问题:我的博客需要 Nginx + PHP + MySQL 三个服务,难道要手动启动三个容器?Docker Compose 正是解决这个问题的。
安装 Docker Compose
# 用 apt 安装
sudo apt install docker-compose -y
# 验证
docker-compose --version
写第一个 docker-compose.yml
在项目目录下新建 docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:8.1-fpm
volumes:
- ./html:/var/www/html
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_DATABASE: blog
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动和管理
# 启动所有服务(-d 后台运行)
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 停止
docker-compose down
# 重新构建并启动
docker-compose up -d --build
遇到的坑
1. PHP 连不上 MySQL——原来 Compose 自动创建了网络,要用服务名(db)而不是 localhost 连接。
2. 端口冲突——宿主机 80 端口已被占用时,改成 8080:80 就好。
3. 数据丢失——容器删了数据就没了,一定要用 volumes 持久化。
一个小技巧:.env 文件
密码直接写在 yml 里不安全,可以这样:
# .env 文件(不提交到 git)
DB_PASSWORD=mypassword
# docker-compose.yml
services:
db:
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
Compose 是我觉得 Docker 生态里最实用的工具之一。有了它,管理多容器服务终于像样了。