相比直接在系统上安装,用 Docker 运行 OpenClaw 有三个无可替代的优势:安全隔离(恶意技能或提示注入攻击的影响被限制在容器内)、环境一致(同一镜像在任何机器上运行效果相同)、易于维护(更新只需拉新镜像,回滚只需切换标签)。
对于需要长期稳定运行 OpenClaw 的用户——尤其是在 VPS、家用 NAS 或云服务器上部署的场景——Docker 是目前最推荐的方式。本文带你完整走一遍 Docker 容器化部署流程。
准备工作:你需要什么
- Docker Engine(Linux)或 Docker Desktop(macOS/Windows)
- Docker Compose v2(Docker Desktop 已内置)
- 至少 2GB RAM(镜像构建时内存不足会导致进程被系统杀死,报错 exit 137)
- 大模型 API Key(Anthropic Claude 或 OpenAI 均可)
验证 Docker 是否安装成功:
docker --version
docker compose version
两条命令都能输出版本号即可开始。
方式一:官方一键安装脚本(最简单)
OpenClaw 官方仓库提供了完整的 Docker 安装脚本,会自动完成镜像构建、引导配置和启动:
# 克隆官方仓库
git clone https://github.com/openclaw/openclaw.git
cd openclaw
# 运行官方 Docker 安装脚本
./scripts/docker/setup.sh
如果不想从源码构建镜像,可以使用官方预构建镜像:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
./scripts/docker/setup.sh
脚本执行过程中会:
- 自动创建
~/.openclaw/(配置目录)和~/openclaw/workspace/(工作区目录)并挂载为容器卷 - 启动引导向导,提示输入 API Key 并选择模型
- 生成 Gateway Token 并写入
.env文件 - 通过 Docker Compose 启动 Gateway 容器
方式二:手动编写 docker-compose.yml(推荐生产环境)
对于需要精细控制配置的用户,手动编写 docker-compose.yml 是更好的选择。
第一步:创建项目目录
mkdir -p ~/openclaw-docker && cd ~/openclaw-docker
第二步:创建环境变量文件 .env
在项目目录中创建 .env 文件,存放所有敏感信息:
# .env 文件内容
ANTHROPIC_API_KEY=sk-ant-你的密钥
OPENAI_API_KEY=sk-你的密钥 # 可选
DEEPSEEK_API_KEY=sk-你的密钥 # 可选
TELEGRAM_BOT_TOKEN=你的BotToken # 可选
TZ=Asia/Shanghai # 时区设置
⚠️ 安全提示:
.env文件包含敏感 API Key,务必将其添加到.gitignore,永远不要上传到 GitHub 或任何公开仓库。
第三步:编写 docker-compose.yml
version: "3.8"
services:
openclaw:
image: openclaw/openclaw:latest # 官方预构建镜像
container_name: openclaw
restart: unless-stopped # 崩溃自动重启,手动停止不重启
ports:
- "127.0.0.1:18789:18789" # 仅绑定本机,不暴露公网
volumes:
- ~/.openclaw:/home/node/.openclaw # 配置和记忆持久化
- ~/openclaw/workspace:/home/node/workspace # 工作区持久化
environment:
- NODE_ENV=production
- TZ=${TZ}
env_file:
- .env # 从 .env 文件加载 API Key
deploy:
resources:
limits:
memory: 2G # 内存上限
reservations:
memory: 512M # 保留最低内存
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:18789/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s # 容器启动后等待60秒再开始健康检查
💡 关键说明:容器内部
gateway.host需要设为0.0.0.0(监听所有接口),这样 Docker 的端口映射才能正常工作——但在ports配置中用127.0.0.1:18789:18789限制宿主机只在本地监听,保证外部无法直接访问。这是 Docker 部署与裸机部署在网络配置上最容易混淆的地方。
第四步:启动容器
# 后台启动
docker compose up -d
# 查看启动日志
docker compose logs -f
等待日志中出现 “Gateway listening on port 18789” 类似信息,说明容器已成功启动。
第五步:运行引导向导完成初始配置
容器启动后,进入容器运行引导向导:
docker compose exec openclaw openclaw onboard
按提示选择大模型提供商、输入 API Key、配置通讯平台。向导完成后,Gateway Token 会显示在终端,立即复制保存。
在 Docker 中运行 CLI 命令
部署完成后,所有 openclaw CLI 命令都需要在容器内执行:
# 检查运行状态
docker exec openclaw openclaw doctor
# 查看 Gateway 状态
docker exec openclaw openclaw gateway status
# 查看技能列表
docker exec openclaw openclaw skills list
# 添加定时任务
docker exec openclaw openclaw cron add \
--name "morning-brief" \
--cron "0 9 * * *" \
--message "总结今日邮件和日程"
# 进入容器 shell(排查问题时使用)
docker exec -it openclaw bash
注意:在 Docker 中运行 openclaw doctor --fix 时,需要加 -it 参数以支持交互式输入:
docker exec -it openclaw openclaw doctor --fix
连接通讯平台:以 Telegram 为例
# 方式一:通过 CLI 连接
docker exec openclaw openclaw channels add \
--channel telegram \
--token 你的BotToken
# 方式二:通过控制面板连接
# 建立 SSH 隧道后在浏览器访问控制面板
ssh -L 18789:127.0.0.1:18789 用户名@服务器IP
# 然后浏览器访问 http://127.0.0.1:18789
连接 Telegram 后,发送第一条消息,系统会返回配对码,在控制面板或 CLI 中确认:
docker exec openclaw openclaw pairing approve telegram 配对码
日常运维命令速查
# 启动容器
docker compose up -d
# 停止容器
docker compose stop
# 重启容器(修改配置后)
docker compose restart
# 查看实时日志
docker compose logs -f
# 查看资源占用(CPU、内存)
docker stats openclaw
# 更新到最新版本
docker compose pull
docker compose up -d
# 清理旧镜像
docker image prune -f
数据持久化:永远不要丢失你的记忆
OpenClaw 的所有重要数据都通过 Volume 挂载持久化到宿主机:
~/.openclaw/:配置文件、API Key、Agent 记忆、会话历史~/openclaw/workspace/:工作区文件、技能、SOUL.md 等
注意:运行 docker compose down -v 会删除所有 Volume 数据(包括你的记忆和配置)!日常停止服务只用 docker compose stop 或 docker compose down(不加 -v)。
建议定期备份这两个目录:
# 手动备份
tar -czf ~/openclaw-backup-$(date +%Y%m%d).tar.gz \
~/.openclaw ~/openclaw/workspace
# 设置每日自动备份(crontab)
# 编辑 crontab:crontab -e
# 添加以下行(每天凌晨2点备份)
0 2 * * * tar -czf ~/backups/openclaw-$(date +\%Y\%m\%d).tar.gz ~/.openclaw ~/openclaw/workspace
常见问题排查
Q:容器启动后立即退出,日志显示 exit 137 怎么办?
这是内存不足的信号(OOM Kill)。检查宿主机可用内存是否至少有 2GB,或增加 swap 空间:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Q:控制面板显示”连接失败”怎么办?
确认容器正在运行(docker ps),端口映射正确(docker port openclaw),然后在本地建立 SSH 隧道后访问。
Q:更新容器后配置丢失了怎么办?
确认 docker-compose.yml 中的 volumes 配置正确,数据目录挂载指向宿主机路径。容器本身是无状态的,所有数据应持久化到挂载卷中。
Q:在 VPS 上 Docker 防火墙策略需要注意什么?
Docker 会自动修改 iptables 规则,有时会绕过 UFW 防火墙直接暴露端口。务必在 ports 中使用 127.0.0.1:18789:18789(绑定本机 IP),而不是 18789:18789(暴露所有接口)。
进阶:添加 Nginx 反向代理(可选)
如果需要通过域名访问控制面板,可以在 docker-compose.yml 中添加 Nginx 服务:
services:
openclaw:
# ... 已有配置 ...
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- /path/to/ssl:/etc/ssl
nginx.conf 配置(注意 WebSocket 头部,OpenClaw 实时通信依赖它):
server {
listen 443 ssl;
server_name openclaw.你的域名.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
location / {
proxy_pass http://openclaw:18789;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Docker 部署 vs 裸机安装:如何选择?
| 对比维度 | Docker 部署 | 裸机安装 |
|---|---|---|
| 安全隔离 | ✅ 容器边界限制攻击面 | ⚠️ 直接访问宿主机 |
| 环境依赖 | ✅ 无需管理 Node.js 版本 | ⚠️ 需手动维护 Node.js |
| 更新便捷性 | ✅ 一条命令拉新镜像 | ⚠️ npm update + 重启 |
| 资源占用 | ⚠️ 容器本身有额外开销 | ✅ 更轻量 |
| 调试难度 | ⚠️ 需进入容器执行命令 | ✅ 直接在宿主机操作 |
| 适合场景 | VPS、服务器、生产环境 | 个人 Mac/Linux 本地测试 |
想了解更多 Docker 部署细节,访问 OpenClaw官网中文版(通过浏览器翻译访问 openclaw.ai)或官方 Docker 文档 docs.openclaw.ai/install/docker。
本文内容基于 OpenClaw 官方文档、lumadock.com、openclaws.io、oepnclaw.com 等公开资料整理,信息截至2026年3月28日。