最近尝试在 Windows 上使用 Docker 部署 OpenClaw,本以为是一路绿灯,结果却在最后一步卡住了------明明容器日志显示"一切正常",浏览器却始终无法访问。经过一番折腾,终于找到了症结所在。如果你也遇到了同样的问题,希望这篇博客能帮你省下排查的时间。
现象:一切看起来都很完美
按照官方文档,我使用以下命令启动了容器:
bash
docker run -d `
--name openclaw `
--restart always `
-p 18789:18789 `
-v D:\OpenClaw\config:/app/config `
openclaw:latest
容器成功启动,查看日志,一切看起来都很完美:
gateway\] listening on ws://127.0.0.1:18789, ws://\[::1\]:18789 (PID 14) \[heartbeat\] started \[health-monitor\] started
端口映射也确认无误:
bash
docker port openclaw
18789/tcp -> 0.0.0.0:18789
18789/tcp -> [::]:18789
然而,当我信心满满地在浏览器中打开 http://127.0.0.1:18789 时,迎接我的却是无尽的"无法访问此网站"。
诊断:被忽略的关键日志
问题出在哪里?我反复检查了防火墙、端口占用,甚至重装了 Docker Desktop,都无济于事。直到我再次仔细观察日志,才发现了一个被忽略的关键信息:
[gateway] listening on ws://127.0.0.1:18789
这里的 127.0.0.1 指的是容器内部的本地回环地址。这意味着 OpenClaw 的网关服务只接受来自容器"自己"的连接,而拒绝了来自外部(也就是你的 Windows 宿主机)的请求。
尽管 Docker 的端口映射(-p 18789:18789)已经把"大门"打开了,但门后的服务却只允许"自己人"通过,导致外部的请求被拒之门外。
解决方案:让服务监听所有接口
问题的根源找到了,解决起来就非常简单了。我们需要修改 OpenClaw 的配置,让它从监听 127.0.0.1 改为监听所有网络接口(0.0.0.0)。
OpenClaw 提供了一个便捷的命令来完成这个操作:
-
修改配置
在 PowerShell 中执行以下命令,告诉网关绑定到局域网(LAN):
bashdocker exec openclaw openclaw config set gateway.bind lan -
重启服务
让新的配置生效:
bashdocker restart openclaw -
验证访问
等待十几秒让服务重启完成,然后再次刷新浏览器
http://127.0.0.1:18789。此时,你应该就能看到 OpenClaw 的登录界面了。
总结
这次踩坑经历提醒我们,在 Docker 部署中,端口映射成功 并不等于服务可以被外部访问 。当遇到类似问题时,不妨多留意一下服务启动日志中的 listening on 信息,确认它监听的是 127.0.0.1 还是 0.0.0.0,这往往是解决问题的关键线索。