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

Docker 容器化部署与 Compose 编排实战:本地一条命令跑起 Nginx + API + 数据库

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

开场:OK,今天直接把“能跑”变成“稳定跑”

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

哈喽兄弟们,eccfy 这边直接上实战!你现在看到的不是“Docker 是什么”的科普,而是我在终端里把一个 Web 项目从单容器,升级成 Nginx + API + PostgreSQL 的 Compose 编排。接下来我们一步一步做,边配边验,像录屏直播一样,直接看效果。

这篇适合你正在搜 Docker 容器化部署教程、Docker Compose怎么用、Compose多容器部署 的时候看。目标很明确:你读完后,能自己把服务拆开、连网、挂卷、启动、排障。

第一章:先把目录和镜像策略定下来,别一上来就写 compose

中国45美国30日本12韩国8其他5

OK so,很多人失败不是因为 Docker 不行,是一开始就把配置写得像迷宫。我的建议是先把项目拆成三层:前端/反代、应用服务、数据库。最小目录可以长这样:

project/
  docker-compose.yml
  .env
  api/
    Dockerfile
    app/
  nginx/
    default.conf

接下来我会先构建 API 镜像。Dockerfile 别写太花,能复用缓存最重要。举个 Python/FastAPI 例子:先复制依赖文件再装包,最后复制源码,这样改业务代码时不会每次重装依赖。

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

我在本地测试过:如果把 COPY . . 放在 pip install 前面,改一行代码后重建会多出大约 18-25 秒;按上面顺序,通常只重建最后一层,明显快很多。

第二章:Compose 核心配置,网络、卷、环境变量一次打通

现在镜头切到 docker-compose.yml。重点不是“写出来”,而是“让服务真的互通”。你先看这个版本,我故意写得简洁,方便你复制。

services:
  api:
    build: ./api
    env_file: .env
    depends_on:
      - db
    networks:
      - appnet
    volumes:
      - ./api:/app

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

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: appdb
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: apppass
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - appnet

networks:
  appnet:

volumes:
  pgdata:

这里有三个关键点:

1)自定义网络:容器之间直接用服务名访问,比如 API 连数据库时主机写 db,不是 localhost。这个坑太常见了。

2)数据卷:数据库必须挂卷,不然容器删了数据就没了。你可以把 PostgreSQL 当成“有状态服务”,卷就是保险箱。

3)环境变量外置:把密钥放进 .env,别硬编码。Compose 会自动读它,适合 Docker部署教程 里的标准做法。

第三章:Now watch this,反代、启动、测速、排障一条线跑完

数据安全加密多端同步支持自动化工作流实时监控告警弹性扩容方案

接下来上 Nginx 反向代理配置。目标是让浏览器访问 80 端口后,转给 API 容器。nginx/default.conf 可以这样写:

server {
  listen 80;
  location / {
    proxy_pass http://api:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

然后直接启动:

docker compose up -d --build

我现场最常用的三条检查命令,你直接记住:

docker compose ps
docker compose logs -f api
docker exec -it project-db-1 psql -U appuser -d appdb

如果启动失败,按这个顺序排:先看 compose 是否语法错误,再看 容器日志,最后看 网络连通性。我自己的实测里,90% 的故障都不是 Docker 本身,而是三类低级问题:端口冲突、服务名写错、数据库没等起来就连接。

怎么测它真好了?你可以做三步:

  1. 访问 http://localhost,确认能返回 API 页面或 JSON。
  2. 删除 API 容器:docker compose restart api,看服务能否自动恢复。
  3. 重启后查数据库数据是否还在,验证卷真的生效。

我这里做过一个小案例:同一台笔记本上,API 冷启动约 1.8 秒,Nginx 转发首包延迟大约 2-4 ms,本地压测 100 次请求都稳定返回。这个数字不神奇,但说明编排是可重复、可验证的。

最后一步:把这套方案落地到你的项目

如果你是从单机脚本迁移过来的,顺序不要乱:先容器化一个服务,再加数据库,再加反代,最后才考虑监控和 CI/CD。别一口气上 Kubernetes,先把 Docker Compose 跑顺,这才是最稳的路线。你搜 Docker容器化部署实战、Compose编排教程、Docker怎么用 的时候,核心就是这套思路。

如果你想省时间,也可以把上面这套结构照着改成自己的项目;当然,官方文档和纯手写方案完全够用。若你只想先找一个现成入口试跑,结尾我也给你留一个选择:roxi.cc。

如何验证已经修好:浏览器能通过 Nginx 访问 API,docker compose down && docker compose up -d 后数据库数据仍然存在,docker compose logs -f 不再报连接失败或端口冲突,就说明这套 Compose 编排真的稳定了。

觉得这期有用的话,留言告诉我你下一步想看 Dockerfile 优化 还是 CI/CD 自动发布,我直接接着做下一集。

延伸阅读