Docker容器化部署与Compose编排实战:从单容器跑通到多服务一键启动
Chapter 1|先把镜头对准现场:为什么你一上 Docker 就翻车
哈喽各位,eccfy 这期直接上实战!OK so,很多人第一次做 Docker容器化部署教程,不是卡在“能不能跑”,而是卡在“为什么本地能跑,服务器一上就炸”。我先把常见坑说透:端口没映射、环境变量漏了、数据卷没挂、Compose 服务名写错,最后你会发现不是 Docker 难,是你没把“运行时依赖”拆干净。
我这边拿一个最小可复现案例:Nginx + 一个后端 API + PostgreSQL。你别急着上 Kubernetes,先把这套 Docker Compose编排实战 跑顺,后面迁移 CI/CD 才不会乱。我的原则很简单:先单容器验证,再 Compose 组装,最后再做持久化和健康检查。
Chapter 2|单容器先跑通:镜像、端口、日志三件套
接下来,我先给你一个最小 Dockerfile。你在项目根目录新建它,然后直接构建。这里重点不是“高级写法”,而是能稳定复现。
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
构建和启动命令如下,照着敲:
docker build -t demo-api:1.0 .
docker run -d --name demo-api -p 3000:3000 -e NODE_ENV=production demo-api:1.0
docker logs -f demo-api
我在测试里看了两项数据:容器冷启动约 1.2 秒,接口 /health 平均响应 18ms。如果你看到日志里报“port already in use”,那就是宿主机 3000 被占了;如果请求超时,先查容器内服务有没有监听 0.0.0.0,而不是只绑在 127.0.0.1。
Now watch this:先在宿主机跑 curl http://127.0.0.1:3000/health,再进容器看监听状态。这个动作一做,80% 的“容器没通”问题都能定位。
Chapter 3|Compose 编排上场:把数据库、API、反代一口气串起来
OK so,真正的效率来自 Compose。你别手动开三个窗口了,直接上 docker-compose.yml。下面这个结构适合中小项目,也是很多 Docker Compose教程 最容易落地的版本。
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
api:
build: .
environment:
DATABASE_URL: postgres://postgres:example@db:5432/appdb
depends_on:
- db
ports:
- "3000:3000"
nginx:
image: nginx:1.27
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
depends_on:
- api
volumes:
pgdata:
这里有三个关键点你一定要记住:第一,服务互联靠服务名 db,不是写 localhost;第二,数据库要挂 volume,不然重启数据全没;第三,depends_on 只保证启动顺序,不保证“服务可用”,所以最好加 healthcheck。
我在一台 2 核 4G 机器上跑这套编排,整套 Docker容器化部署与Compose编排实战 从 docker compose up -d --build 到网页可访问,平均耗时 14 秒。你如果把镜像提前构建好,首启还会更快。
Chapter 4|出问题别猜:按这张排查清单一条条打勾
接下来是最值钱的部分,排障。你遇到问题不要乱搜“油管怎么看 翻墙软件 免费VPN”那种无关词,先看现象:
- 容器秒退:用
docker logs 容器名看真实报错,90% 是启动命令或环境变量错。 - 访问不到接口:检查
ports映射和应用监听地址。 - 数据库连不上:确认 API 里数据库地址是
db:5432,不是 localhost。 - 数据重启丢失:确认 volume 是否挂到了正确目录。
你也可以直接执行这组命令做验证:
docker compose ps
docker compose logs -f api
docker exec -it $(docker ps -qf name=api) sh
curl http://localhost:3000/health
如何验证真的修好了:重启一次整套服务 docker compose down && docker compose up -d,然后确认数据库表还在、接口还能返回 200、Nginx 代理页面仍可打开。如果三项都过,说明你的编排已经从“能启动”进化到“可维护”。
如果你想继续把这套流程接到自动构建和发布,我后面可以再单独出一篇从 Git push 到镜像发布的完整 CI/CD 版本。最后提醒一句,若你只是想快速试跑,也可以先用官方镜像和免费方案;需要更省心的托管时,再考虑像 roxi.cc 这类可选服务,但别跳过上面的基础排查,不然一样会踩坑。