site logo

Marico's space

在 Docker 中运行 Hermes Agent:让自主 AI Agent 更安全的配置方案 🐳

AI技术与应用 2026-09-24 20:56:25 4

给 AI Agent 完全访问你整台电脑的权限,这事儿想想就挺刺激的。

尤其是当这个 Agent 能够:

  • 执行终端命令
  • 安装软件包
  • 读写文件
  • 调用外部服务
  • 自主完成多步骤任务

这些能力恰恰是 Hermes Agent 强大的地方。

但同时也引出了一个关键问题:

这些操作到底应该在什么环境里跑?

与其把 Hermes Agent 直接跑在宿主机上,我决定把它塞进 Docker 容器里,明确控制它能访问什么。

目标不是把 Hermes 往 Docker 里一放就"自动变安全"了。

目标很简单:

只给它需要的东西,别让它碰整台电脑。

这篇把完整配置流程过一遍,包括:

  • 在 Docker 里运行 Hermes Agent
  • 持久化存储(内存、会话、配置)
  • 受限的文件系统边界
  • Hermes Gateway
  • Hermes Dashboard
  • Dashboard 认证
  • Hermes Desktop 连接容器
  • 容器化自主 AI Agent 的一些重要安全考量

🤖 为什么要在 Docker 里跑 Hermes Agent?

Hermes 不只是个聊天机器人。

它能跟环境交互,替你执行操作。

比如,取决于你启用了哪些工具,Hermes 可以操作文件、执行终端命令、安装依赖、调用外部服务、自主完成各种任务。

这非常实用。

但如果 Agent 直接跑在主机上,你得认真考虑它能访问哪些文件、凭证和系统资源。

这时候 Docker 就派上用场了。

与其让 Hermes 直接在宿主机环境里横冲直撞,不如把它关进容器,明确决定什么东西能穿过这个边界。

我们最终搭出来的架构大致是这样的:

┌──────────────────── HOST MACHINE ────────────────────┐
│ │
│ Docker │
│ │
│ ~/.hermes-docker ───────────────┐ │
│ │ │
│ ┌──────────────▼──────────────┐ │
│ │ Docker Container │ │
│ │ │ │
│ │ Hermes Agent │ │
│ │ │ │
│ │ /opt/data │ │
│ │ Gateway │ │
│ │ Dashboard │ │
│ └─────────────────────────────┘ │
│ │
│ Personal files / SSH keys / other directories │
│ NOT mounted into container │
│ │
└──────────────────────────────────────────────────────┘

Hermes 有自己的专属环境和持久化数据目录。

机器的其他部分都在边界之外,除非你明确暴露。

🐳 第一步:安装 Docker

macOS 或 Windows 上装 Docker Desktop,确保 Docker 引擎在运行。

Linux 上按发行版的说明装 Docker Engine。

验证一下 Docker 是否正常:

docker --version

Docker 跑起来之后,就可以给 Hermes 搞个隔离环境了。

📁 第二步:创建专用目录

先建一个专门给 Docker 化 Hermes 实例用的目录:

mkdir -p ~/.hermes-docker

这个目录很重要,原因有两个。

1. 持久化

Docker 容器是用完就扔的。

如果删掉重装 Hermes 容器,总不能把配置、会话、内存、Skills、Profile、日志这些都丢了吧。

所以这些东西存在 ~/.hermes-docker 目录里,容器外面。

2. 它成了信任边界的一部分

这个目录里的东西都是有意暴露给 Hermes 的。

不挂载整个 home 目录,只给 Agent 一个专用位置。

这个区别很重要。

⚙️ 第三步:在 Docker 里运行 Hermes 设置

现在启动官方 Hermes Agent 镜像,运行设置流程:

docker run --rm -it \ -v ~/.hermes-docker:/opt/data \ nousresearch/hermes-agent setup

这里最关键的部分是:

-v ~/.hermes-docker:/opt/data

-v 参数在宿主机目录和容器内目录之间创建绑定挂载。

可以这么理解:

HOST CONTAINER
~/.hermes-docker ───────▶ /opt/data

左边是我们刚在宿主机上创建的目录。

右边是这个目录在 Docker 容器里出现的位置。

所以当 Hermes 把配置、会话、内存、Skills 或其他持久化数据存到 /opt/data 时,这些文件其实存在宿主机上的 ~/.hermes-docker 里。

这意味着可以销毁、重建容器而不丢失 Hermes 环境。

更重要的是,我们只共享了一个专用目录,而不是整个宿主机文件系统。

🧠 第四步:配置 Hermes Agent

首次运行会下载所需的 Docker 镜像,启动 Hermes 设置向导。

按正常的 Hermes 配置流程走就行。

我的配置:

  1. 用快速设置
  2. 在 Nous Portal 认证
  3. 选个模型
  4. 保持终端后端本地
  5. 暂时跳过消息平台配置

配置完成后会存在持久化目录里。

以后用同样挂载的容器可以直接复用。

🌐 第五步:启动 Hermes Gateway 和 Dashboard

现在把 Hermes 作为后台容器启动:

docker run -d \ --name hermes-docker \ --restart unless-stopped \ -v ~/.hermes-docker:/opt/data \ -p 18642:8642 \ -p 19119:9119 \ -e HERMES_DASHBOARD=1 \ nousresearch/hermes-agent gateway run

有几个关键点。

后台运行

-d

以 detached 模式启动容器。

给容器起个名字

--name hermes-docker

方便后续管理:

docker logs hermes-docker
docker stop hermes-docker
docker start hermes-docker

保持持久化目录

还是挂载同一个目录:

-v ~/.hermes-docker:/opt/data

这样 Hermes 能看到我们在设置时创建的配置文件。

启用 Dashboard

-e HERMES_DASHBOARD=1

开启 Hermes Dashboard。

🔌 理解端口映射

注意我用的是:

-p 18642:8642
-p 19119:9119

Docker 端口映射的格式是:

HOST_PORT:CONTAINER_PORT

所以:

18642 → 8642
19119 → 9119

右边的端口是 Hermes 在容器内部用的。

左边的端口是暴露在宿主机上的。

我故意用了不同的宿主机端口,因为本地已经跑了另一个 Hermes 实例,不想端口冲突。

如果只跑 Docker 实例,可以直接用默认端口 8642 和 9119,不需要 18642 和 19119。

✅ 第六步:验证容器在运行

运行:

docker ps

应该能看到 hermes-docker 容器在跑。

如果有问题,先看容器日志:

docker logs hermes-docker

配置 Dashboard 的时候这个特别有用。

🔐 第七步:配置 Dashboard 认证

我刚打开 Dashboard 的时候,它没正常启动。

没把这部分从教程里藏起来,因为这是个很好的排查例子。

查看:

docker logs hermes-docker

发现 Dashboard 需要认证 provider。

Hermes 提供了多种认证选项来保护 Dashboard 访问。

我用 Nous Portal 认证配置的。

配置完成后 Dashboard 就正常启动了。

按我的端口映射,访问地址是:

localhost:19119

现在 Hermes Dashboard 在跑了,而 Hermes 本身还在容器里。

💬 第八步:在容器里跟 Hermes 聊天

也可以直接进入正在运行的容器:

docker exec -it hermes-docker bash

然后启动 Hermes:

hermes

这时候你是在 Docker 容器里的终端跟 Hermes 交互,而不是在宿主机上直接跑 Hermes。

测试的时候挺有用的。

但每次要用 Agent 都进容器也挺麻烦的。

有更好的方式。

🖥️ 第九步:Hermes Desktop 连接 Docker 实例

Hermes Desktop 可以连接到容器里跑的 Gateway。

打开 Hermes Desktop,导航到:

Settings → Gateway → Remote Gateway

配置成使用 Docker 容器暴露的 Gateway。

我的配置里 URL 是:

http://localhost:19119

认证之后保存配置并重连。

现在 Hermes Desktop 跟 Docker 化 Hermes 实例通信了。

从用户角度,我还是有方便的桌面界面。

但 Agent 本身是在容器里跑的。

🛡️ Docker 实际保护了什么?

这可能是教程里最重要的一部分。

在 Docker 里跑 AI Agent 不会自动变安全。

Docker 给了我们一个有用的隔离边界,但这个边界很大程度上取决于容器的配置方式。

举个例子,想象你这么搞:

Host machine │ ▼
Entire home directory │ ▼
Docker container │ ▼
Hermes Agent

技术上你确实把 Hermes 容器化了。

但你也把机器的很大一部分暴露给它了。

这不是我想要的配置。

应该这样:

Host machine │ ├── Personal files ❌ ├── SSH keys ❌ ├── Other projects ❌ ├── Docker socket ❌ │ └── ~/.hermes-docker ✅ │ ▼ Hermes Container

容器只应该拿到任务所需的资源。

🚫 1. 不要挂载整个 home 目录

如果把整个 home 目录挂进容器,Hermes 可能会访问到容器权限允许范围内的各种东西。

可能包括个人文件、源代码、配置文件、凭证或其他敏感数据。

这就是为什么我用的是:

~/.hermes-docker

作为专用位置。

Hermes 不需要的东西就不要暴露。

🔑 2. 凭证要谨慎

同样的原则适用于 API 密钥和令牌。

只提供 Hermes 实际需要的凭证。

避免不必要地暴露:

~/.ssh

或其他云服务的凭证和密钥。

容器化没多大用,如果你把各种敏感凭证都塞进容器的话。

⚠️ 3. 没有充分理由不要暴露 Docker Socket

我还特意没挂载:

/var/run/docker.sock

把宿主机的 Docker 守护进程暴露给容器,会大幅扩展容器的权限范围。

对于自主 Agent 来说,这是一个特别需要考虑的边界。

如果 Hermes 不需要控制宿主机的 Docker,就别给它这个能力。

🧩 4. Docker 解决不了提示词注入

还有另一个重要的限制。

AI Agent 仍然可能遇到恶意或对抗性内容。

比如,网页、仓库、文档或其他外部来源的内容可能试图操纵 Agent 执行非预期操作。

把 Agent 放 Docker 里不能消除这个问题。

区别在于 Agent 尝试操作之后会发生什么。

如果 Hermes 只能访问:

/opt/data

那它的操作环境是受限的。

如果挂载了整台电脑、暴露了敏感凭证、还给了 Docker 守护进程权限,那潜在影响就完全不一样了。

这就是为什么我认为容器化更多是"爆炸半径缩减",而不是什么 AI 安全银弹。

🎯 原则:AI Agent 的最小权限

随着 AI Agent 能力越来越强,我认为一个传统安全原则变得比以前更重要:

最小权限。

Agent 应该获得完成任务所需的最小访问权限。

不是:

Agent │ └── Everything on my computer

而是:

Agent │ ├── Required files ├── Required credentials ├── Required network services └── Required tools

不多给。

随着 Agent 获得越来越长的自主运行时间、终端访问、浏览器访问、外部集成、定时执行以及多工具协作能力,这个原则变得越来越重要。

Docker 和 VM 跑 AI Agent 哪个好?

Docker 不是隔离自主 Agent 的唯一方式。

也可以用:

  • 虚拟机
  • 专用 VPS(虚拟专用服务器)
  • 沙箱执行环境
  • 单独的物理机器
  • 更严格的容器运行时

VM 通常比标准应用容器提供更强的隔离边界,因为它虚拟化了更大范围的环境。

不过 Docker 更轻量、更方便本地开发。

对于我的 Hermes 配置,它给了我一个实用的中间地带:

Direct Host Execution ↓
Docker Container ↓
Virtual Machine / Dedicated Environment

具体用哪种边界,取决于你给 Agent 的能力以及它能访问什么资源。

最终架构

配置完成后,我的结构大概是这样的:

 ┌─────────────────────────────┐ │ Host Machine │ │ │ │ Hermes Desktop │ └──────────────┬──────────────┘ │ Remote Gateway │ ▼ ┌─────────────────────────────────┐ │ Docker Container │ │ │ │ Hermes Gateway │ │ Hermes Dashboard │ │ Hermes Agent │ │ │ │ /opt/data │ └───────────────┬─────────────────┘ │ Bind Mount │ ▼ ~/.hermes-docker │ ┌───────────────┴──────────────┐ │ Config • Memory • Sessions │ │ Skills • Profiles • Logs │ └──────────────────────────────┘ Rest of host filesystem → NOT MOUNTED SSH keys → NOT EXPOSED Docker socket → NOT EXPOSED

Hermes 还是有工作所需的环境。

但我们对什么东西能穿过边界要更加慎重。

写在最后

自主 AI Agent 能做的事已经远超生成文本了。

它们越来越能:

⚡ 执行命令
🗂️ 操作文件
🌍 与外部系统交互
🧰 使用专用工具
🔄 自主运行多步骤工作流

这很令人兴奋。

但 Agent 越强大,它的运行环境就越重要。

在 Docker 里跑 Hermes Agent 解决不了所有安全问题。

但它确实给了我们一个实用的方式:控制 Agent 能访问什么,在出问题的时候减少潜在的爆炸半径。

我的原则很简单:

只给 AI Agent 实际需要的东西。

其他的都留在边界外面。