36. Docker 完整部署
本章你将学到
- 为什么用 Docker 跑 Hermes
- 一行命令快速启动
- docker-compose 完整生产配置
- 数据持久化 / 网络 / 日志方案
- 升级 / 回滚 / 备份
- 群晖 NAS / 树莓派部署
36.1 为什么用 Docker
直接 curl ... | bash 装 Hermes 的问题:
- 环境污染(Python / Node 版本冲突)
- 难迁移到新机器
- 难限制资源
- 升级失败难回滚
Docker 解决:
- 一行命令搞定环境
- 数据 / 配置分离
- 多机器一致
- 资源隔离 + cgroup 限制
- 容器删了再启不丢数据
36.2 装 Docker
按系统:
- macOS / Windows:Docker Desktop
- Linux:bash
curl -fsSL https://get.docker.com | sh sudo systemctl enable docker sudo usermod -aG docker $USER
国内 mirror 必配,见 23. 网络与镜像加速。
36.3 一行命令启动
bash
docker run -d \
--name hermes \
--restart unless-stopped \
-v ~/hermes-data:/root/.hermes \
-e DEEPSEEK_API_KEY=sk-xxxxx \
-p 8443:8443 \
nousresearch/hermes-agent:latest说明:
-d后台跑--restart unless-stopped挂了自动重启-v ~/hermes-data:/root/.hermes数据持久化-p 8443:8443暴露 webhook 端口(可选)- 环境变量传 API Key
进容器用 CLI
bash
# 进容器跑 hermes 命令
docker exec -it hermes hermes "你好"
# 或交互式
docker exec -it hermes hermes36.4 docker-compose(推荐生产)
docker-compose.yml:
yaml
version: '3.9'
services:
hermes:
image: nousresearch/hermes-agent:latest
container_name: hermes
restart: unless-stopped
ports:
- "8443:8443" # webhook port
volumes:
- ./data:/root/.hermes # 持久化
- ./logs:/var/log/hermes
environment:
# LLM Keys
- DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
# Channels
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
- DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN}
# Timezone
- TZ=Asia/Shanghai
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "hermes", "doctor", "--quiet"]
interval: 60s
timeout: 10s
retries: 3
# (可选)跑本地 Ollama 一起
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama-data:/root/.ollama
deploy:
resources:
limits:
memory: 12G # 跑 7B 至少 8G.env:
bash
DEEPSEEK_API_KEY=sk-xxx
ANTHROPIC_API_KEY=sk-ant-xxx
TELEGRAM_BOT_TOKEN=...
DISCORD_BOT_TOKEN=...启动:
bash
docker compose up -d
docker compose ps
docker compose logs -f hermes36.5 数据持久化
./data/ # 容器内 /root/.hermes
├── config.yaml
├── .env
├── memory.md
├── user.md
├── skills/
├── agents/
├── data/
│ ├── sessions.db
│ └── honcho.db
└── logs/
./ollama-data/ # 容器内 /root/.ollama
└── models/容器删了重建数据不丢。
备份
bash
#!/bin/bash
# backup-hermes.sh
DATE=$(date +%F)
tar -czf ~/hermes-backups/hermes-${DATE}.tar.gz \
./data ./logs .env docker-compose.yml
# 保留 30 天
find ~/hermes-backups -name "hermes-*.tar.gz" -mtime +30 -deletecrontab:
bash
0 3 * * * bash ~/backup-hermes.sh36.6 升级 / 回滚
升级到最新
bash
docker compose pull hermes
docker compose up -d hermes数据保留,只换容器版本。
回滚
如果新版本有问题,回退指定版本:
yaml
services:
hermes:
image: nousresearch/hermes-agent:0.7.5 # 指定旧版本号bash
docker compose up -d hermes36.7 多 Hermes 实例
例如:dev + prod 双跑
yaml
services:
hermes-dev:
image: nousresearch/hermes-agent:latest
container_name: hermes-dev
ports:
- "8443:8443"
volumes:
- ./data-dev:/root/.hermes
environment:
- HERMES_PROFILE=dev
hermes-prod:
image: nousresearch/hermes-agent:0.8.3 # prod 用固定版本
container_name: hermes-prod
ports:
- "8444:8443" # 不同对外端口
volumes:
- ./data-prod:/root/.hermes
environment:
- HERMES_PROFILE=prod两套互不干扰。dev 跑最新版玩,prod 跑稳定版长跑。
36.8 群晖 NAS / QNAP
Container Manager UI
- 套件中心装 Container Manager
- 注册表搜
nousresearch/hermes-agent→ 下载 latest - 启动配置:
- 网络: Bridge
- 端口: 8443 → 8443
- 卷:
/docker/hermes→/root/.hermes - 环境变量: 加 Keys
或 SSH + docker-compose
bash
ssh admin@nas
cd /volume1/docker
mkdir hermes && cd hermes
# 上传 docker-compose.yml + .env
docker compose up -dNAS 优势:24/7 在线 + 自带 RAID + 不动主力机。
36.9 树莓派部署
树莓派 5(4GB / 8GB)完全够。
bash
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker pi
# ARM 镜像(Hermes 官方支持 arm64)
docker pull nousresearch/hermes-agent:latest
docker compose up -d注意:
- 别同时跑 Ollama(树莓派内存不够)
- 用国内 LLM API(CPU 几乎 0 负载)
- 大数据存 USB SSD,不要 SD 卡
36.10 健康检查 + 自愈
yaml
healthcheck:
test: ["CMD", "hermes", "doctor", "--quiet"]
interval: 60s
timeout: 10s
retries: 3
start_period: 60sDocker 自动重启不健康的容器。配合 --restart unless-stopped,几乎零维护。
36.11 监控
bash
# 实时资源
docker stats hermes
# 看日志
docker logs --tail 100 hermes
docker logs -f hermes
# 容器详情
docker inspect hermes进阶接 Grafana + cAdvisor 看长期趋势。
36.12 自定义镜像(高阶)
官方镜像不够用?自己 build:
Dockerfile:
dockerfile
FROM nousresearch/hermes-agent:latest
# 加你自己的依赖
RUN pip install --no-cache-dir my-custom-skill-deps
# 加自定义工具
COPY my-skills/ /root/.hermes/skills/
COPY my-tools/ /opt/hermes/custom-tools/
# 装额外的 mcp servers
RUN npm install -g @modelcontextprotocol/server-githubbuild:
bash
docker build -t my-hermes:latest .用:
yaml
services:
hermes:
image: my-hermes:latest
...36.13 网络配置
让 Hermes 能调宿主机服务
yaml
hermes:
extra_hosts:
- "host.docker.internal:host-gateway"容器内访问 http://host.docker.internal:11434 等于访问宿主机 Ollama。
国内代理透传
yaml
hermes:
environment:
- HTTPS_PROXY=http://host.docker.internal:7890
- NO_PROXY=localhost,*.deepseek.com,*.aliyuncs.com容器内的请求按规则走代理。
Bridge vs Host network
yaml
hermes:
network_mode: bridge # 默认,隔离
# 或
network_mode: host # 不隔离,性能略好但不安全强烈用 bridge,host 模式失去 Docker 一半价值。
36.14 常见报错
Q:容器一直 restarting
bash
docker logs hermes常见原因:
- 端口冲突(8443 被占)
- volume 权限错(容器内 user 没法写)
- API Key 错(日志会抱怨)
Q:连不上 docker socket
bash
sudo usermod -aG docker $USER
# 重新登录Q:升级后旧 data 不兼容
回滚到老版本(36.6 节)+ 先备份再升。
Q:Apple Silicon 跑 amd64 镜像很慢
Hermes 官方镜像有 arm64 版,应自动选。强制指定:
bash
docker pull --platform linux/arm64 nousresearch/hermes-agent看完这一章你应该知道
✅ 一行 docker run 或 docker-compose 部署 ✅ 数据通过 volume 持久化,容器换不丢数据 ✅ 升级 = compose pull && up,回滚 = 指定老版本 ✅ 群晖 / 树莓派 / 云服务器一致体验 ✅ 健康检查 + 自动重启 = 几乎零维护
最后一篇部署:跑在公网服务器 / 国内云 / 海外 VPS。