为什么用宝塔 + Docker?

宝塔面板(BT Panel)是国内最流行的服务器管理面板,提供可视化的网站、数据库、FTP 管理。结合 Docker Compose,你可以:

  • 一键部署:不用手动配置环境,docker compose up -d 搞定
  • 隔离运行:每个服务独立容器,互不干扰
  • 方便迁移:docker-compose.yml + 数据目录打包就能换服务器
  • 统一管理:宝塔面板管理 Nginx 反代 + SSL,Docker 管理应用

本文汇总 8 个常用开源服务的 Docker Compose 部署方案,直接复制粘贴即可使用。


前置准备

安装宝塔面板

# CentOS
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install_6.0.sh

# Ubuntu/Debian
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

# 通用
wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install_6.0.sh

安装完成后记录面板地址、用户名、密码。

安装 Docker + Docker Compose

宝塔面板 → 软件商店 → 搜索「Docker 管理器」→ 安装。

或者手动安装:

# 安装 Docker
curl -fsSL https://get.docker.com | bash
systemctl enable docker && systemctl start docker

# 安装 Docker Compose(Docker 20.10+ 已内置 compose 插件)
# 验证
docker compose version

创建统一目录

mkdir -p /opt/docker-services
cd /opt/docker-services

后续所有服务的 docker-compose.yml 都放在这个目录下。


1. Nginx Proxy Manager — 反向代理管理

Docker 服务多了以后,Nginx 反代配置会很乱。Nginx Proxy Manager 提供可视化管理界面。

# /opt/docker-services/nginx-proxy-manager/docker-compose.yml
version: '3.8'
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    ports:
      - "80:80"      # HTTP
      - "443:443"    # HTTPS
      - "81:81"      # 管理界面
    volumes:
      - ./npm/data:/data
      - ./npm/letsencrypt:/etc/letsencrypt
cd /opt/docker-services/nginx-proxy-manager
docker compose up -d

访问 http://服务器IP:81,默认账号:

  • 邮箱:admin@example.com
  • 密码:changeme

⚠️ 注意:如果宝塔已经占用了 80/443 端口,需要先在宝塔中停止 Nginx,或者改用其他端口。推荐方案:宝塔 Nginx 做主反代,把 Docker 服务的端口映射到内网(如 127.0.0.1:8080),宝塔 Nginx 反代到这些端口。


2. Uptime Kuma — 服务监控

美观的自托管监控工具,支持 HTTP/TCP/Ping/DNS 等多种监控方式。

# /opt/docker-services/uptime-kuma/docker-compose.yml
version: '3.8'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma/data:/app/data
cd /opt/docker-services/uptime-kuma
docker compose up -d

访问 http://服务器IP:3001,首次进入创建管理员账号。

推荐配置:

  • 添加你所有的 Docker 服务为监控项
  • 设置通知方式(支持 Telegram/微信/钉钉/邮件/Slack)
  • 开启状态页面(可自定义域名,对外展示服务可用性)

3. Gitea — 轻量 Git 托管

比 GitLab 轻很多(内存占用 ~100MB vs ~2GB),个人和小团队首选。

# /opt/docker-services/gitea/docker-compose.yml
version: '3.8'
services:
  gitea:
    image: gitea/gitea:latest
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__server__ROOT_URL=https://git.yourdomain.com
    ports:
      - "3000:3000"   # Web UI
      - "222:22"      # SSH
    volumes:
      - ./gitea/data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
cd /opt/docker-services/gitea
docker compose up -d

访问 http://服务器IP:3000,首次进入是安装向导。数据库选 SQLite(个人用足够)。

宝塔反代配置:

  1. 宝塔 → 网站 → 添加站点 → git.yourdomain.com
  2. 申请 SSL 证书
  3. 配置文件添加反代:
location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

4. Vaultwarden — 密码管理器

Bitwarden 的轻量服务端实现,Rust 编写,内存占用 ~30MB。

# /opt/docker-services/vaultwarden/docker-compose.yml
version: '3.8'
services:
  vaultwarden:
    image: vaultwarden/server:latest
    restart: unless-stopped
    environment:
      - DOMAIN=https://vault.yourdomain.com
      - SIGNUPS_ALLOWED=false    # 创建完账号后关闭注册
      - WEBSOCKET_ENABLED=true
    ports:
      - "8080:80"
    volumes:
      - ./vaultwarden/data:/data
cd /opt/docker-services/vaultwarden
docker compose up -d

重要安全配置:

  1. 首次访问注册管理员账号
  2. 访问 https://vault.yourdomain.com/admin 设置管理员密码
  3. 设置完成后将 SIGNUPS_ALLOWED 改为 false
  4. 必须配置 HTTPS(密码管理器不允许 HTTP)

5. N8N — 工作流自动化

Zapier 的开源替代品,支持 300+ 应用集成,自托管无限制。

# /opt/docker-services/n8n/docker-compose.yml
version: '3.8'
services:
  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - GENERIC_TIMEZONE=Asia/Shanghai
    ports:
      - "5678:5678"
    volumes:
      - ./n8n/data:/home/node/.n8n
cd /opt/docker-services/n8n
docker compose up -d

常用工作流示例:

  • GitHub 新 Star → 发 Telegram 通知
  • 定时抓取网页变化 → 发邮件
  • 表单提交 → 自动写入 Notion/飞书表格
  • RSS 更新 → 自动发推特/微博

6. Memos — 碎片化笔记

开源的 flomo 替代品,支持 Markdown、标签、API。

# /opt/docker-services/memos/docker-compose.yml
version: '3.8'
services:
  memos:
    image: neosmemo/memos:latest
    restart: unless-stopped
    ports:
      - "5230:5230"
    volumes:
      - ./memos/data:/var/opt/memos
cd /opt/docker-services/memos
docker compose up -d

7. Stirling-PDF — 本地 PDF 工具箱

24KB 的 GitHub 项目,提供 50+ PDF 操作:合并/拆分/转换/压缩/OCR/水印/加密。

# /opt/docker-services/stirling-pdf/docker-compose.yml
version: '3.8'
services:
  stirling-pdf:
    image: stirlingtools/stirling-pdf:latest
    restart: unless-stopped
    ports:
      - "8090:8080"
    volumes:
      - ./stirling-pdf/trainingData:/usr/share/tessdata
      - ./stirling-pdf/extraConfigs:/configs
cd /opt/docker-services/stirling-pdf
docker compose up -d

访问 http://服务器IP:8090,所有 PDF 操作都在浏览器完成,文件不上传到任何第三方。


8. Portainer — 容器管理面板

Docker 容器多了以后,命令行管理很痛苦。Portainer 提供可视化管理界面。

# /opt/docker-services/portainer/docker-compose.yml
version: '3.8'
services:
  portainer:
    image: portainer/portainer-ce:latest
    restart: unless-stopped
    ports:
      - "9000:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer/data:/data
cd /opt/docker-services/portainer
docker compose up -d

访问 https://服务器IP:9000(注意是 HTTPS),首次创建管理员账号。


统一编排方案(All-in-One)

如果你想一次性启动所有服务:

# /opt/docker-services/docker-compose.yml
version: '3.8'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma/data:/app/data

  gitea:
    image: gitea/gitea:latest
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3
    ports:
      - "3000:3000"
      - "222:22"
    volumes:
      - ./gitea/data:/data

  vaultwarden:
    image: vaultwarden/server:latest
    restart: unless-stopped
    environment:
      - DOMAIN=https://vault.yourdomain.com
      - SIGNUPS_ALLOWED=false
    ports:
      - "8080:80"
    volumes:
      - ./vaultwarden/data:/data

  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    environment:
      - GENERIC_TIMEZONE=Asia/Shanghai
    ports:
      - "5678:5678"
    volumes:
      - ./n8n/data:/home/node/.n8n

  memos:
    image: neosmemo/memos:latest
    restart: unless-stopped
    ports:
      - "5230:5230"
    volumes:
      - ./memos/data:/var/opt/memos

  stirling-pdf:
    image: stirlingtools/stirling-pdf:latest
    restart: unless-stopped
    ports:
      - "8090:8080"
    volumes:
      - ./stirling-pdf/trainingData:/usr/share/tessdata

  portainer:
    image: portainer/portainer-ce:latest
    restart: unless-stopped
    ports:
      - "9000:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer/data:/data
cd /opt/docker-services
docker compose up -d

运维速查

# 查看所有服务状态
docker compose ps

# 查看某个服务日志
docker compose logs -f gitea

# 重启某个服务
docker compose restart n8n

# 更新所有服务(先 pull 再 up)
docker compose pull && docker compose up -d

# 停止所有服务
docker compose down

# 清理无用镜像(释放磁盘)
docker image prune -f

# 查看磁盘占用
docker system df

备份策略

#!/bin/bash
# /opt/docker-services/backup.sh
BACKUP_DIR="/opt/backups/docker-services/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 备份所有数据目录
tar czf $BACKUP_DIR/data.tar.gz \
  uptime-kuma/data \
  gitea/data \
  vaultwarden/data \
  n8n/data \
  memos/data \
  portainer/data

# 保留最近 7 天
find /opt/backups/docker-services/ -maxdepth 1 -mtime +7 -exec rm -rf {} \;

echo "Backup completed: $BACKUP_DIR/data.tar.gz"
# 添加定时任务(每天凌晨 3 点备份)
echo "0 3 * * * /opt/docker-services/backup.sh" | crontab -

常见问题

Q:宝塔 Nginx 和 Docker Nginx 端口冲突怎么办? 不要让 Docker 服务直接占用 80/443。所有 Docker 服务映射到高位端口(3000/5678/8080 等),由宝塔 Nginx 统一反代。

Q:服务器内存不够怎么办? 2GB 内存的服务器跑 4-5 个服务没问题。如果内存紧张,优先保留核心服务(Gitea + Vaultwarden),其他按需启动。

Q:怎么让外部访问 HTTPS? 宝塔面板 → 网站 → 添加站点 → Let's Encrypt 申请免费 SSL 证书 → 开启强制 HTTPS。

Q:Docker 镜像拉取慢怎么办? 配置国内镜像源:/etc/docker/daemon.json 添加 {"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]}。


原文出处