Docker 部署开源项目教程:从 VPS 初始化到反向代理完整实战

还在为手动安装环境、配置依赖而头疼吗?每当想体验一个优秀的开源项目,光是搭建 LNMP、Python 环境、Node 版本管理就耗掉半天时间,更别提迁移或重装服务器时的噩梦。Docker 容器化技术之所以成为现代部署的标准,正是因为它彻底解决了“在我机器上能跑”的尴尬。本文将从一台干净的 VPS 开始,手把手带你走通 Docker 部署开源项目的全流程——包括 Docker Compose 编排、Nginx Proxy Manager 反向代理、域名解析、HTTPS 自动续期以及数据持久化,并额外补充 AI 工具站、监控面板等真实部署案例。
无论你是建站新手还是想提升运维效率的开发者,读完本文都能获得一套可重复使用的部署模板,节省 80% 的环境配置时间。
准备工作:选购 VPS 与系统初始化
要跑 Docker,一台配置合理的 VPS 是基础。建议选择 2 核 2GB 内存以上 的云服务器,硬盘不低于 40GB,系统推荐 Ubuntu 22.04 或 Debian 12。如果你还没有 VPS,可以参考我们的 便宜 VPS 推荐与选购避坑指南(2026年更新) 挑选适合自己的方案。初次接触的朋友可以先从 Vultr 或 DigitalOcean 开始,它们按小时计费且支持一键重装系统,适合练手。
拿到服务器后,先用 SSH 登录并以 root 用户执行系统更新:
apt update && apt upgrade -y
然后重启服务器以应用内核更新,再安装基本工具(curl、wget、git)。
安装 Docker 和 Docker Compose

官方提供了一键安装脚本,也可以在 Ubuntu/Debian 上通过包管理器安装。推荐使用官方脚本(会提示添加 Docker 官方仓库):
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安装完成后,将当前用户加入 docker 组,避免每次用 sudo:
sudo usermod -aG docker $USER
退出 SSH 重新登录使组生效。
国内用户拉取 Docker Hub 镜像可能较慢,建议配置镜像加速器。详细方法请参考这篇 Docker 镜像加速完全指南。如果你使用某些云服务商提供的 Docker 镜像仓库(如阿里云、腾讯云),注意它们的稳定性与隐私政策。
验证安装:运行 docker --version 和 docker compose version(新版 Docker Engine 已内置 Compose Plugin,无需额外安装 docker-compose 二进制文件)。
项目结构:容器化一个开源项目(以 AI 工具导航站为例)

理解 Docker Compose 的配置结构是自动化部署的关键。我们以一个常见的 AI 工具导航站为例(比如 One API 或自行开发的前端+后端),创建以下目录结构:
myproject/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── data/
│ ├── db/
│ └── uploads/
└── .env
一个典型的 docker-compose.yml 包含 web 服务、数据库、缓存等组件。以下是一个最小化三件套(前后端 + 数据库)的示例:
version: '3.8'
services:
frontend:
image: nginx:alpine
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./data/uploads:/usr/share/nginx/html/uploads:ro
depends_on:
- backend
backend:
build: ./backend
environment:
- DB_HOST=db
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
depends_on:
- db
db:
image: postgres:15-alpine
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: myapp
将敏感信息填入 .env 文件(注意不要提交到 Git):
DB_USER=myapp
DB_PASSWORD=change_me_strong_password
这种结构的最大好处是:只需一条 docker compose up -d 命令即可启动所有服务。如果你希望了解更多高级编排技巧,可以阅读 Docker Compose实战:用一台VPS部署个人全栈云服务,里面介绍了多项目部署与网络隔离。
配置域名解析与反向代理(Nginx Proxy Manager)
为了让服务通过域名访问并启用 HTTPS,反向代理是不可或缺的一环。Nginx Proxy Manager(NPM) 提供了 Web 管理界面,让你无需手写 Nginx 配置。
首先,在 DNS 管理面板将域名(如 tool.example.com)的 A 记录指向 VPS IP。然后在服务器上用 Docker Compose 部署 NPM:
version: '3.8'
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: always
ports:
- "80:80"
- "443:443"
- "81:81" # 管理后台
volumes:
- ./npm_data:/data
- ./npm_letsencrypt:/etc/letsencrypt
启动后访问 http://你VPS_IP:81,默认登录凭据为 admin@example.com / changeme,首次登录会要求修改密码。
添加代理规则
在 NPM 管理界面依次操作:
- 点击“Add Proxy Host”
- 输入域名(如
tool.example.com) - 转发 IP 填写
前端服务名(例如frontend),端口填写容器内端口(如 80) - 开启 “SSL” 选项卡,选择 “Request a new SSL certificate” 并勾选 “Force SSL”
- 保存后,等待几秒证书自动签发
注意:如果前端和 NPM 在同一台 VPS 上且通过 Docker 通信,请确保它们处于同一 Docker 网络(通常通过 --network 或 docker-compose.yml 中的 networks 指定)。
SSL 证书自动续期
Let's Encrypt 证书有效期 90 天,需要自动续期。Nginx Proxy Manager 内置了自动续期任务,只要 NPM 容器持续运行,续期会自动完成。如果你不希望依赖 NPM,也可以单独使用 acme.sh 或 Certbot 配合 Cron 任务。详细自动化流程可参考 SSL证书自动化管理完整指南。
数据持久化与备份
容器内的数据必须通过 Volume 或 Bind Mount 映射到宿主机,否则容器删除后数据会丢失。以上文的 docker-compose.yml 为例:
- PostgreSQL 数据映射到
./data/db - 上传文件映射到
./data/uploads
建议定期备份这些目录。一个简单的每日备份脚本(配合 Cron 执行):
#!/bin/bash
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d)
tar -czf $BACKUP_DIR/project-$DATE.tar.gz /path/to/project/data
# 可选上传到 S3 或远程服务器
备份验证表
| 备份内容 | 位置 | 频率 | 恢复方法 |
|---|---|---|---|
| 数据库文件 | ./data/db |
每日 | 停止容器,替换目录后重启 |
| 配置文件 | ./nginx/ .env |
每次修改后 | 直接覆盖 |
| 用户上传文件 | ./data/uploads |
每日 | 解压备份到原路径 |
维护升级与常用命令
容器化部署让升级变得安全且可回滚。
更新单个服务
# 拉取最新镜像
docker compose pull service_name
# 重新创建容器
docker compose up -d service_name
查看日志
docker compose logs -f service_name
清理无用资源
docker system prune -a --volumes
pgdump/pgrestore)。
常见错误与排查
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 容器无法启动,端口占用 | 宿主端口已被占用 | netstat -tlnp 查找并停用冲突进程,或修改端口映射 |
| 502 Bad Gateway | 反向代理无法连接到后端容器 | 检查 depends_on 和 healthcheck;确认服务名正确;容器是否在同一网络 |
| 证书签发失败 | DNS 未生效或端口 80 被占用 | 等待 DNS 传播;检查 NPM 是否监听了 80 端口 |
| 容器频繁重启 | 内存不足或应用崩溃 | docker logs 容器名 查看错误;free -h 检查资源;考虑升级 VPS |
对于网络安全配置,请务必阅读 VPS 安全加固完全指南,尤其是打开防火墙(如 UFW)并仅放行必要端口。
部署案例:AI 工具站与监控面板
为了展示 Docker 部署的灵活性,以下推荐几个可以直接用上述流程部署的开源项目:
1. One API(AI 模型聚合平台)
将多个 AI 模型提供商(OpenAI、Claude、Gemini 等)的 API 统一为 OpenAI 兼容接口,并提供额度管理。部署方式与上文范例完全兼容。参考我们的 One API 自托管部署指南。
2. UptimeFlare(免费网站监控)
利用 Cloudflare Workers 和 D1 数据库与 VPS 上的后端配合,搭建全球多节点状态监测面板。部署时只需一个 Node.js 容器加 Nginx 反向代理。详情可看 UptimeFlare 免费网站监控部署指南。
3. 个人网盘(Nextcloud / Filebrowser)
Nextcloud 可配合 PostgreSQL 和 Redis 容器,Filebrowser 更适合轻量文件管理。
4. 自动化工具(n8n / Huginn)
用于连接各种服务,实现工作流自动化的低代码平台。推荐与 NPM 配合使用,配置简单。
总结与行动建议
通过本文,你已学会从零开始用 Docker 部署开源项目,并配置了反向代理、HTTPS 和数据持久化。核心要点总结:
- 使用 Docker Compose 管理多服务,一个 YAML 文件即可定义整个栈。
- Nginx Proxy Manager 极大降低了反向代理和 HTTPS 配置门槛。
- 数据持久化必须通过 Volume 映射,定期备份很重要。
- 升级前先备份,使用
docker compose pull && docker compose up -d无损升级。
现在,你可以挑选一个感兴趣的开源项目(如 One API、UptimeFlare),按照本文的步骤尝试部署。如果遇到问题,优先查看容器日志和常见错误表。
docker-compose.yml,映射数据和配置文件。
如果过程中需要更高级的技巧,比如多项目网络隔离、CI/CD 集成,可以继续关注本站的后续教程。
原创文章,作者:kp51,如若转载,请注明出处:https://www.kepu51.com/instant-messaging/953.html
