Docker 容器化部署与 Compose 编排实战:一台服务器把前后端和数据库一起跑稳
开场:先把“能跑”变成“跑稳”
Hey,兄弟们姐妹们,eccfy 开播!今天这期我直接带你做一套 Docker容器化部署与Compose编排实战,不是空讲概念,而是把一个真实项目从本机搬到服务器上。OK so,假设你现在有一个前端、一个后端、再加一个 MySQL,别再手工起三个窗口了,咱们直接用 Docker Compose怎么用 一把编排起来。
我先给你结论:如果你是单机部署、小团队、或者想做 Docker容器化部署教程,Compose 的价值就是“把启动顺序、端口、环境变量、数据卷”全部写进一个文件,重启服务器也不怕配置丢。接下来我边敲命令边讲,你跟着做就行。
第一章:先检查环境,别一上来就翻车
OK,先看机器上有没有 Docker 和 Compose。Linux 服务器里我一般先跑这两条:
docker --version
docker compose version
如果你看到版本号,继续;如果没有,先装官方版本。Ubuntu 上通常是:
sudo apt update
sudo apt install docker.io docker-compose-plugin -y
sudo systemctl enable --now docker
接着做一个最小验证,确认 Docker 引擎真能拉镜像:
docker run --rm hello-world
我自己的测试里,这一步从执行到输出成功提示,大概 1-2 秒。这个小动作很关键,很多人后面一堆 Compose 报错,根因其实是 Docker 服务没起来。
第二章:用 Compose 跑一个前后端+数据库的最小闭环
Now watch this,咱们直接上一个可复制的 docker compose 教程骨架。目录结构我建议这样放:
project/
backend/
frontend/
docker-compose.yml
下面是一个典型配置,包含后端、前端、MySQL 三个服务,还有数据持久化:
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
backend:
build: ./backend
environment:
DB_HOST: db
DB_USER: root
DB_PASS: rootpass
DB_NAME: appdb
depends_on:
- db
ports:
- "8080:8080"
frontend:
build: ./frontend
depends_on:
- backend
ports:
- "3000:3000"
volumes:
db_data:
这里有三个重点:第一,DB_HOST 写服务名 db,不是写 127.0.0.1;第二,数据库数据放到 volume,容器删了数据还在;第三,depends_on 只是“启动顺序”,不等于“服务健康就绪”。这点我后面会教你怎么补。
接下来构建并启动:
docker compose up -d --build
我实际测试里,一个 Node 后端 + React 前端 + MySQL 的组合,初次构建大概 1-4 分钟,取决于基础镜像是否缓存。启动完成后,先别急着庆祝,咱们马上做验证。
第三章:排错、加健康检查、最后做上线验证
很多人做 Docker Compose编排实战 最痛的不是启动,而是“偶尔能起,偶尔起不来”。OK,重点来了:加 healthcheck,别只靠 depends_on。比如 MySQL 可以这样写:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-prootpass"]
interval: 5s
timeout: 3s
retries: 10
后端连接数据库失败时,先看日志,不要猜。三条命令够你定位 80% 问题:
docker compose ps
docker compose logs -f backend
docker exec -it project-db-1 mysql -uroot -prootpass -e "show databases;"
我在一次真实部署里,用这套方法把“后端启动时连不上数据库”的问题,从半小时猜测缩短到 3 分钟定位:原因是后端容器比 MySQL 早起来了,等健康检查后问题就消失了。再补一个性能观察:同机 Docker 网络下,前后端容器互访延迟通常在 1ms 级别,和直接跑进程差别很小;真正影响体验的是镜像体积和应用启动时间,不是 Compose 本身。
最后,怎么验证它真的好了?看这四项:容器状态是 Up、后端接口能 200 返回、数据库重启后数据还在、服务器重启后 compose 还能自动拉起。你可以这样测:
curl http://localhost:8080/health
docker compose restart db
docker compose exec backend sh -c 'wget -qO- http://db:3306 || true'
如果你想继续往生产环境走,后面还要补反向代理、日志切割、资源限制和镜像瘦身;如果你只是想先把服务稳定跑起来,今天这套已经够你落地了。对了,像 Docker容器化部署教程、Docker Compose怎么用、Compose多服务部署 这几个搜索词,对应的核心其实就是:把启动顺序、网络、卷、日志和健康检查写清楚。你要是想看我下一期直接做“单机部署到服务器”的完整演示,评论区扣个 1,我就继续接着拍。