Docker 容器化部署与 Compose 编排实战:本地一条命令跑起 Nginx + API + 数据库
开场:OK,今天直接把“能跑”变成“稳定跑”
哈喽兄弟们,eccfy 这边直接上实战!你现在看到的不是“Docker 是什么”的科普,而是我在终端里把一个 Web 项目从单容器,升级成 Nginx + API + PostgreSQL 的 Compose 编排。接下来我们一步一步做,边配边验,像录屏直播一样,直接看效果。
这篇适合你正在搜 Docker 容器化部署教程、Docker Compose怎么用、Compose多容器部署 的时候看。目标很明确:你读完后,能自己把服务拆开、连网、挂卷、启动、排障。
第一章:先把目录和镜像策略定下来,别一上来就写 compose
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 本身,而是三类低级问题:端口冲突、服务名写错、数据库没等起来就连接。
怎么测它真好了?你可以做三步:
- 访问
http://localhost,确认能返回 API 页面或 JSON。 - 删除 API 容器:
docker compose restart api,看服务能否自动恢复。 - 重启后查数据库数据是否还在,验证卷真的生效。
我这里做过一个小案例:同一台笔记本上,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 自动发布,我直接接着做下一集。