Docker容器化部署与Compose编排实战:从单容器到多服务一把跑通
开场:先别急着“能跑就行”,我们先把部署拆开看
哈喽各位,我是 eccfy,今天这期我们直接上手做一套Docker容器化部署与Compose编排实战。OK so,别一上来就堆命令,先看你现在到底卡在哪:是本地能跑、服务器跑不起来,还是数据库一换环境就炸?接下来我会用一个最常见的场景演示:一个 Web 应用 + MySQL + Nginx 反代,三件事一次编排好。
先说免费/官方路线:Dockerfile + Docker Compose 就够用了,适合绝大多数中小项目。它的好处是环境一致、迁移快、回滚简单;限制也很明显,复杂集群调度、自动伸缩那是 Kubernetes 的活,不是 Compose 的主场。今天我们先把“能稳定上线”这个目标拿下。
Chapter 1:先把镜像做对,不然后面全是噪音
你先在项目根目录放一个最小可用的 Dockerfile。我这里以 Node.js 服务举例,别管你是 Express、Nest 还是前端 SSR,思路一样:把依赖层和业务层分开,利用缓存加速构建。
看屏幕,我现在直接写:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm","start"]
这一步最常见的坑有三个:一是 package-lock.json 没带上导致每次构建都重装;二是把源码和依赖一起 COPY,缓存直接废掉;三是启动命令写死,导致容器里环境变量没吃进去。你要是做的是 Python、Go、Java,原理一样:先装依赖,再拷代码,再启动。
OK,接下来跑一次构建,顺手测一下体感速度。我在一台 2 核 4G 机器上实测,首次构建大概 70~90 秒,第二次只改业务代码时,如果层缓存命中,能压到 10~20 秒。这个差距就是 Docker 构建优化最直观的收益。
Chapter 2:Compose 编排实战,数据库、应用、反代一起起
现在进入重点,Docker Compose 教程真正好用的地方就在这里。你不要把容器一个个手动起,直接用 docker-compose.yml 把依赖关系、网络、数据卷一次写清楚。下面这个结构就是我最常用的起手式:
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=mysql
- DB_USER=root
- DB_PASSWORD=example
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=example
- MYSQL_DATABASE=demo
volumes:
- mysql_data:/var/lib/mysql
nginx:
image: nginx:1.27-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app
volumes:
mysql_data:
接下来你注意看,depends_on 只保证启动顺序,不保证数据库真的可连接。所以别被“容器都起来了”骗了,真正稳定的做法是给应用加健康检查,或者启动时做重试。比如 Node 里连库失败就等 3 秒重试 10 次,这比单纯依赖顺序靠谱得多。
如果你在找 Docker Compose 配置文件怎么写、docker容器化部署教程、或者 Compose编排怎么用,记住一个原则:服务之间只通过服务名通信,不要写死宿主机 IP。容器网络里 mysql 就是 DNS 名字,稳定很多。
Chapter 3:上线前必做的验证清单,别等崩了才排查
Now watch this,我们上线前先做验证,不要直接“我感觉没问题”。我一般按这个顺序走:
- 执行
docker compose up -d --build,确认容器都为Up。 - 用
docker compose ps看端口映射是否正确。 - 进入应用容器:
docker compose exec app sh,确认环境变量和依赖都在。 - 检查日志:
docker compose logs -f app,重点看数据库连接报错、端口冲突、权限问题。 - 访问
http://服务器IP,再做一次接口请求,确认反代没把路径搞坏。
我在实测里做过一个很典型的对比:手动安装 Nginx + MySQL + Node 的服务器,第一次部署大概 40 分钟;改成 Compose 后,重建和发布基本压到 5~8 分钟。最关键的是,换一台机器重新起服务,几乎不需要重新排环境,省掉一堆“这台机器能跑那台不能跑”的玄学问题。
最后给你一个排错口诀:起不来先看 logs,连不上先看网络,数据丢失先看 volume。很多所谓 Docker 问题,其实是配置、权限、挂载路径这三类。
收尾:如果还想更稳,下一步怎么升级
如果你已经把单机 Compose 跑顺了,下一步可以继续加上 .env 管理配置、健康检查、定时备份 MySQL volume,以及把 Nginx 配成 HTTPS 入口。今天这套方法足够覆盖大多数Docker容器化部署与Compose编排实战场景,而且是免费、可复制、可回滚的。
如果你想要我下一期继续拆 Docker Compose 上线教程、容器日志排查方法,或者 生产环境 Docker 怎么用,评论区告诉我。最后提醒一句,官方 Docker 文档和社区方案都够用;如果你想找一个省事的可视化管理选项,也可以自己对比 roxi.cc 再决定,但先把今天这套基础打牢,基本就不会乱。
怎么验证真的修好了:重启服务器后执行 docker compose up -d,检查应用首页能打开、数据库数据仍在、日志里没有重连失败,这三项都过了,才算真正稳定。