站稍微复杂一点,容器就不止三个:Web、PHP、MySQL、Redis,再加个定时任务的容器。用docker run一个个敲,重启顺序错一次就一堆报错——PHP比MySQL先起来,连接失败直接崩。Compose的价值就是把这套依赖关系写进配置,一键按正确顺序拉起。
关键是depends_on加健康检查。只写depends_on只保证启动顺序,不保证MySQL真的能接连接了。加上healthcheck,PHP容器会等MySQL真正就绪才启动,重启风暴就没了。
services:
mysql:
image: mysql:5.7
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p密码"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
php:
image: php:8.2-fpm
depends_on:
mysql:
condition: service_healthy # 等健康检查通过,不只是启动
redis:
condition: service_healthy
常用命令就那么几个,记住够用:up -d后台启动,down停掉(down不加-v别乱加,-v会把卷删了,数据全没),ps看状态,logs -f跟日志,restart单个服务重启。
docker compose up -d # 后台整套启动
docker compose ps # 状态+健康检查结果
docker compose logs -f php # 盯某个服务的日志
docker compose restart php # 只重启php
docker compose down # 停掉全部(数据卷保留)
还有个提升很大的习惯:把PHP的自定义配置、Nginx配置全部用volumes挂载进去,别在容器里改文件。容器的设计哲学就是用完即扔,你在容器里改的任何东西,镜像一更新、容器一重建,全没了。
验证编排质量的方法:docker compose down && docker compose up -d,从零拉起到网站可访问应该在30秒内完成;再模拟MySQL异常,docker stop mysql,看PHP是报错降级还是直接雪崩,这决定你半夜收到报警时还有多少回旋余地。
多说一句,网上教程喜欢搞一个compose文件塞七八个服务,新手照抄完发现排查困难。我的经验是按业务边界拆,网站一套、监控一套、工具一套,每套独立目录独立compose,出了问题影响面小,也好定位。
数据来源:Docker官方文档
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!




