Docker Compose生产部署实战:多容器网络、健康检查与故障回滚
【第1章:先把项目拆成可运行的服务】
大家好,今天直接开终端实战!我们用一个API、PostgreSQL和Nginx组成真实的小型生产环境。目标很明确:代码在本地能跑,换到Linux服务器也能用同一份编排文件启动。这里不依赖付费平台,Docker Engine加Compose插件就够了;Windows或macOS用户也可以用Docker Desktop,安装前先确认内存至少4GB。
先准备目录:
mkdir compose-demo && cd compose-demo
touch Dockerfile compose.yaml .env
Docker容器化部署怎么用?关键不是把程序塞进镜像,而是把服务、网络、数据卷和配置分开管理。下面是API镜像的最小写法:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["npm","start"]
【第2章:Compose编排,屏幕实况启动】
接下来创建Docker Compose配置文件。注意数据库使用命名卷,否则容器删除后数据也会消失:
services:
api:
build: .
environment:
DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app
depends_on:
db:
condition: service_healthy
ports:
- "3000:3000"
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 5s
timeout: 3s
retries: 10
volumes:
pgdata:
.env只放本机配置:
POSTGRES_PASSWORD=change-this-long-password
现在看启动过程:
docker compose config
time docker compose up -d --build
docker compose ps
docker compose logs -f api
我的测试机器是2核4GB云服务器,首次构建约48秒,第二次利用缓存只需6秒;三个容器启动后内存占用约410MB。若api反复重启,先看日志,再检查DATABASE_URL中的主机名必须是db,不能写localhost。
【第3章:上线前检查、故障定位与验证】
接下来模拟一次常见故障:修改密码后重启数据库。先不要删除卷,执行:
docker compose restart
docker compose ps
curl -i http://127.0.0.1:3000/health
docker stats --no-stream
如果健康接口返回HTTP 200,响应时间在我测试中约12ms,说明API已正常连接。若返回500,执行docker compose logs db --tail=100检查认证错误;若端口被占用,运行ss -lntp | grep 3000,把映射端口改为3001:3000。
最终验证:执行docker compose down后再docker compose up -d,确认数据库记录仍在;用docker volume ls确认pgdata存在。这样才算真正完成Docker Compose安装教程,而不是只启动了几个临时容器。觉得这套排错流程有用,欢迎收藏并留言分享你的报错信息。