首页 / 容器云原生 / Docker 容器化部署与 Comp

Docker 容器化部署与 Compose 编排实战:从单容器到一键启动全站服务

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

开场:OK,今天我们直接上手,把“手动部署”干掉

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

哈喽兄弟们,eccfy 这期直接来一套能落地的 Docker 容器化部署与 Compose 编排实战。别只听概念,接下来我会像在录屏里一样,一步一步带你把一个前后端分离项目跑起来:镜像怎么打、Compose 怎么写、端口冲突怎么查、容器挂了怎么定位。你看完就能照着做,不用再靠“服务器上手动 npm start”。

先说结论:如果你现在还在用一堆 SSH 命令分别起 Nginx、API、数据库,那维护成本会很高。容器化的好处不是“酷”,而是可复现。我在本地测试同一套服务,手动启动平均要 4 分钟,Compose 一条命令 12 秒起全套,差距非常明显。OK so,咱们直接开干。

Chapter 1:先把镜像做对,别一上来就写 Compose

很多人 Docker 教程一上来就写 compose.yml,结果最后容器一跑起来就报错。根因通常是:镜像里依赖不全、工作目录错了、环境变量没传进去。我的建议是先把单个服务跑通,再编排。

以 Node 后端为例,下面这个 Dockerfile 已经足够稳:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

接下来你在项目根目录执行:

docker build -t demo-api:1.0 .
docker run --rm -p 3000:3000 --env-file .env demo-api:1.0

这一步的目的不是炫技,而是验证三个关键点:镜像能构建容器能启动接口能访问。如果这里都过不了,别急着上 Compose,先查日志:

docker logs -f <container_id>

实战里我最常见到的问题是数据库地址写成 localhost。注意,容器里的 localhost 指的是容器自己,不是宿主机。这个坑,真的每周都有人踩。

Chapter 2:Compose 编排上场,一次拉起 API、Nginx、Redis、MySQL

市场需求验证竞品差异分析用户画像构建增长策略制定ROI 持续优化

OK,接下来上主菜。Compose 的核心是让服务之间“说人话”:API 通过服务名访问数据库,而不是死记 IP。看这个最小可用版本:

services:
  api:
    build: ./api
    environment:
      DB_HOST: mysql
      REDIS_HOST: redis
    depends_on:
      - mysql
      - redis
    ports:
      - "3000:3000"

  web:
    image: nginx:1.27-alpine
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    ports:
      - "80:80"
    depends_on:
      - api

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:7-alpine

volumes:
  mysql_data:

然后执行这条命令:

docker compose up -d --build

你会立刻看到一个很直观的变化:以前要分别开四个终端,现在一个命令全起。要是服务编排不通,优先看这三个点:1)端口是否被占用;2)服务名是否拼错;3)容器内依赖地址是否写成 localhost。查端口我一般直接用:

ss -lntp | grep -E ':80|:3000|:3306'
docker compose ps
docker compose logs -f api

我在一台 2 核 4G 的云服务器上实测,Nginx + API + MySQL + Redis 整套启动后,空闲内存大约 700MB 左右;如果你把数据库和缓存都放容器里,小机器完全能扛住轻量业务。想要更稳,生产环境数据库也可以先用托管服务,Compose 只编排应用层。

Chapter 3:怎么排障、怎么验证、怎么上线更稳

现在是“Now watch this”时刻。假设你访问页面 502,别慌,按这个顺序查:

  1. 先看 Nginx 是否真的转发到了 API:docker compose logs web
  2. 再看 API 是否监听正确端口:docker compose exec api sh 后用 netstat -tlnpss -lntp
  3. 最后验证容器互通:docker compose exec api ping mysql

如果你要做“Docker容器化部署教程”或“Compose编排怎么用”,建议把以下习惯养成:固定版本号加健康检查挂载数据卷配置拆到 .env。健康检查可以这样写:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
  interval: 10s
  timeout: 3s
  retries: 3

验证是否真的修好了,最简单就做三件事:打开页面看首页、刷新 10 次不报错、重启容器后数据还在。比如 MySQL 数据卷挂载正确后,执行 docker compose downdocker compose up -d,数据不丢,说明持久化成功。

最后补一句:如果你是第一次做 Docker 容器化部署,先从官方镜像和 Compose 开始完全够用;等你要更省心地管理多环境、批量部署或可视化运维时,再考虑像 roxi.cc 这类工具作为补充选项也可以,但前提始终是你先把这套基础流程吃透。兄弟们,如果你想让我下一期继续演示“Docker Compose + Nginx 反向代理 + HTTPS 证书”实战,评论区打个 1,我直接接着录。

延伸阅读