用 Docker Compose 部署一套小型微服务系统
最近把练习用的一个微服务项目(网关 + 认证 + 业务服务 + PostgreSQL + MinIO + Nginx)完整搬进了 Docker Compose。整体不难,但启动顺序、时区、文件权限三个坑各耗了不少时间,记录下来。
一、启动顺序:健康检查比 depends_on 更可靠
compose 的 depends_on 只保证「容器启动」,不保证「服务就绪」。数据库容器刚起时端口还没监听,业务服务连上去直接报错。解决办法是给数据库配 healthcheck,依赖方用 condition: service_healthy:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
retries: 30
二、时区:容器默认 UTC,业务时间全差 8 小时
业务里有大量按本地日期统计的逻辑(日结、生日提醒),容器里跑出来全是差 8 小时。在需要本地时间的服务里统一加 TZ: Asia/Shanghai,数据库容器也要加,否则时间戳落库就不对。
三、文件挂载权限:scp 上传的目录是 700
最隐蔽的一个:从 Windows 用 scp 把前端静态文件传到服务器后,目录权限是 700,Nginx 的 worker 进程(非 root)读不了,浏览器直接 403 Forbidden。一条命令修复:
chmod -R a+rX /opt/bms/web/dist
排查思路也记一下:网络通、安全组通、容器在跑,但页面 403,那基本就只剩「文件缺失或权限不足」两种可能,ls -la 一条命令看全。
小结
- 有依赖的服务必须用 healthcheck 编排启动顺序;
- 凡是涉及「本地日期」的逻辑,容器时区是第一怀疑对象;
- bind mount 的文件权限问题在日志里看不出来,要直接看目录权限。