首页 / 容器云原生 / Docker容器化部署实战:用Com

Docker容器化部署实战:用Compose把API、MySQL、Nginx一次跑稳

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

Chapter 1:OK so,先把项目塞进容器里

2020行业萌芽2021快速增长2022竞争加剧2023洗牌整合2024成熟稳定

兄弟们开机!这里是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编排,服务、网络、数据卷一次到位

📋STEP 1环境搭建🚀STEP 2编码实现🔧STEP 3测试验证⚙️STEP 4部署上线

接下来上主菜,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指的是当前容器自己。

  1. 看日志:docker compose logs -f api mysql nginx
  2. 进容器测网络:docker compose exec api sh,再执行nc -vz mysql 3306
  3. 看数据卷:docker volume ls,确认存在项目名加mysql_data的卷
  4. 重启验证: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这类入口继续查。觉得这个实战脚本有用,收藏、评论区丢你的报错截图,我们接着现场拆。

延伸阅读