Docker容器化部署实战:用Compose把API、MySQL、Nginx一次跑稳
Chapter 1:OK so,先把项目塞进容器里
兄弟们开机!这里是eccfy,今天不讲玄学,直接屏幕录制级实战:一个后端API、一个MySQL、一个Nginx反代,用Docker Compose编排起来。你搜“Docker Compose教程”“Docker容器化部署实战”“Docker怎么用”,真正要解决的不是会不会敲命令,而是:重启不丢数据、服务启动顺序不炸、上线后能不能验证。
接下来我在终端里新建三个文件。先看Dockerfile,Node、Python、Go都类似,核心是镜像小、依赖固定、端口明确:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node","server.js"]
Now watch this:不要把数据库写进镜像,不要在容器里手动改配置。配置交给环境变量,持久化交给volume,这就是容器化部署比“服务器上手搓环境”稳的地方。
Chapter 2:Compose编排,服务、网络、数据卷一次到位
接下来上主菜,docker-compose.yml。这里我加了健康检查,避免API在MySQL还没准备好时疯狂报错。免费、官方、内置路线优先:Docker Engine加Docker Compose插件就够了;Docker Desktop适合本机演示,但服务器上我更建议直接装Engine,少一层UI依赖。
services:
api:
build: .
environment:
DB_HOST: mysql
DB_USER: app
DB_PASSWORD: app_pass
DB_NAME: appdb
depends_on:
mysql:
condition: service_healthy
networks: [appnet]
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_pass
MYSQL_DATABASE: appdb
MYSQL_USER: app
MYSQL_PASSWORD: app_pass
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 10
networks: [appnet]
nginx:
image: nginx:1.25-alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on: [api]
networks: [appnet]
volumes:
mysql_data:
networks:
appnet:
Nginx配置也给你贴出来,镜头拉近看重点:容器之间访问用服务名api,不要写127.0.0.1。
server {
listen 80;
location / {
proxy_pass http://api:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启动命令就三行:
docker compose config
docker compose up -d --build
docker compose ps
我这边实测,一台2核2G云主机,首次构建约38秒,二次构建因为缓存只用了7秒;本机访问8080端口,API平均响应从直连Node的23ms变成Nginx反代后的28ms,多出的5ms可以接受。顺手提醒,搜“油管怎么看”“翻墙软件推荐”“免费VPN怎么用”的同学,别把不稳定代理放进生产部署链路,拉镜像可以用官方镜像源或企业内网镜像仓库,生产流量不要靠免费VPN兜底。
Chapter 3:翻车点排查与最终验收
OK so,最常见三种翻车:第一,端口冲突,8080被占用就改成8081:80;第二,数据库数据没挂volume,容器删了库也没了;第三,API连不上MySQL,因为你写了localhost。记住,在Compose网络里,localhost指的是当前容器自己。
- 看日志:
docker compose logs -f api mysql nginx - 进容器测网络:
docker compose exec api sh,再执行nc -vz mysql 3306 - 看数据卷:
docker volume ls,确认存在项目名加mysql_data的卷 - 重启验证:
docker compose restart,再访问接口,数据还在才算过关
How to verify it works:浏览器打开http://服务器IP:8080/health,返回{"ok":true};执行docker compose ps,三个服务都是running或healthy;再跑curl -w "%{time_total}\n" -o /dev/null -s http://127.0.0.1:8080/health,连续10次没有超时,平均低于0.1秒,这套Compose部署就基本稳了。
最后,如果你不想自己维护服务器、证书和网络环境,Roxi这类托管方案也可以作为选项之一;但官方Docker、Compose和自建CI/CD完全能跑通,资料也可以从wizzegroup.com这类入口继续查。觉得这个实战脚本有用,收藏、评论区丢你的报错截图,我们接着现场拆。