一台云服务器、一个 compose 文件,就能把应用、数据库和缓存都跑起来。下面是部署中最容易忽略的几件事。
YAML
services:
db:
image: postgres:17-alpine
env_file: .env
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
retries: 10
restart: unless-stopped
web:
image: registry.example.com/web:1.4.2
env_file: .env
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:3000:3000"
logging:
options:
max-size: "10m"
max-file: "3"
restart: unless-stopped
volumes:
db-data:- 镜像写明版本号,不要用
latest。否则某次重启拉到新版本,出了问题都不知道是哪里变了。 - 端口只绑定 127.0.0.1,由 Nginx 对外提供服务。Docker 发布的端口会绕过 ufw 等防火墙规则,直接写
3000:3000等于把服务暴露在公网上。 - 用 healthcheck 控制启动顺序。
depends_on只等容器启动,不等服务就绪;配合condition: service_healthy才会等数据库真正可用。 - 数据放在卷里。
docker compose down -v会删掉命名卷,执行前想清楚。 - 密码放 .env,并加进
.gitignore,不要写进镜像或提交到仓库。 - 限制日志大小。默认的 json-file 日志驱动不限大小,跑久了能把磁盘写满。
- 更新用 pull + up:
docker compose pull && docker compose up -d,只会重建有变化的服务。 - 旧镜像别急着全删。
docker image prune -a会删掉所有没有容器使用的镜像,包括回滚要用的上一个版本。