简介:这套代码包面向需要快速上手OpenClaw的开发者,聚焦用Docker完成部署与配置,覆盖从基础镜像手动安装、配置网关到通过Dockerfile构建自定义镜像的完整技术路径。整套资源为ZIP格式,共8个文件,以Shell安装脚本、Dockerfile、docker-compose、JSON配置和Markdown说明为主,压缩包大小约12KB,体量轻巧、便于直接复用和改造。已有1369人学习下载。包内既有可运行的安装与编排脚本,也有项目说明、默认配置和辅助页面资源;对插件冲突、网络配置等高频问题做了专门提醒,并给出了通过修改默认配置与模板化设置优化镜像的思路与建议,能减少测试、开发与部署阶段的踩坑概率。借助Docker的容器隔离和分层镜像能力,这套内容还适合用来管理OpenClaw版本、快速迭代或回退,适合需要提升部署可控性和环境一致性的AI应用开发者。
1. Docker 安装 OpenClaw:别急着敲 docker run,先想清楚三件事
看到“Docker安装OpenClaw指南[代码]”这个标题,多数人的第一反应是找一条 docker run 命令直接粘贴。但如果你真这么干,大概率会在半小时后陷入“容器起来了、管理页打不开、配置存不住”的三连翻车。OpenClaw 这种带管理界面、会写配置、还要长期跑会话任务的框架,容器化部署真正的难点从来不是“装起来”,而是“装完能长期不返工”。这篇笔记按我实际部署时的路径来写:先讲清楚为什么用 Docker 装、再给一份能直接落地的 compose 文件、然后把内存、日志、数据卷这些必调参数逐个说明白,最后是五条踩坑记录。适合正在搭 OpenClaw 环境、又不想在裸机上被依赖问题折磨的开发者,也适合已经跑起来但被重启还原、端口冲突折腾过的熟手。
2. 为什么用 Docker 装 OpenClaw:容器化方案的两个先决条件
2.1 从裸机到容器:OpenClaw 运行环境里哪些依赖最容易被拖垮
OpenClaw 部署到裸机时,最常见的场景是“在某台机器上能跑,换一台就废了”。它的运行环境里至少有三类东西容易被系统环境拖垮:一是运行时的语言版本和第三方库,某些底层库对系统自带的版本敏感,升级系统包时很容易把兼容性弄碎;二是配置文件里写的绝对路径,裸机部署时经常出现“日志写到一半找不到目录”的怪问题;三是会话进程的退出残留,OpenClaw 这类工具会维护长期会话状态,进程被异常杀掉后留下的锁文件在裸机上很难彻底清理。
用 Docker 装 OpenClaw,本质上是把这三类不确定性全部封装进镜像层。镜像里已经包含了它运行所需要的语言运行时、依赖库和默认目录结构,宿主机上装了什么、升级了什么,和容器内的环境不再互相干扰。我一般会在服务器上准备一个独立的目录专门放 OpenClaw 的数据卷,这样即使镜像更新、容器重建,配置和会话记录也还在。
容器化方案的另一个隐含价值是可复现性。同一份 compose 文件,在 A 机器上能跑,在 B 机器上大概率也能跑,差别只在于数据卷目录的权限和端口是否被占用。这一点对于要部署多套实例、或者帮同事搭建同样环境的场景特别重要。你不需要写一份“先装依赖再改配置”的长篇文档,一条 docker compose up -d 就够了。
2.2 部署前清单:目录规划、网络模式与镜像来源校验
在动手拉镜像之前,我建议先花五分钟确认三件事,这五分钟能省掉后面两个小时的排障。
第一是目录规划。你要决定 OpenClaw 的配置、会话、日志分别放在宿主机的哪个路径下,并把它们映射进容器。常见做法是在家目录下建一个统一目录,比如 ~/openclaw/data,里面再分 config、sessions、logs 三个子目录。这样后续备份只需要打包这一个顶层目录,迁移时也只要拷贝它。目录权限要注意:容器内的进程通常以非 root 用户运行,宿主机目录的所有者如果和容器内用户 UID 不一致,会出现“容器内能写、宿主机看得到文件,但重启后写不进去”的权限问题。
第二是网络模式。OpenClaw 默认会监听一个管理端口,如果这个端口和宿主机上已有的服务冲突,容器能启动但页面打不开。我的习惯是先执行 ss -tlnp 看一眼端口占用情况,再决定映射到宿主机的哪个端口。另外,如果 OpenClaw 需要访问宿主机上的其他服务,比如本机数据库或消息队列,用 host 网络模式最省事,但代价是端口隔离失效;用 bridge 模式则需要把目标服务的 IP 写成宿主机在 docker0 网桥上的地址。
第三是镜像来源校验。拉镜像时不要只盯着 latest 标签,latest 是滚动更新的,今天拉的和上个月拉的可能不是同一个版本。我在生产环境里一定会用具体的版本标签。首次拉取后,建议马上执行 docker image inspect 看一眼镜像的创建时间和环境变量,确认镜像的默认工作目录和暴露端口和你准备挂载的路径对得上。
提示:部署前先把这三项写进一个简单的部署备忘,别信自己的记忆力。我吃过亏——以为端口没冲突,结果容器一直处于重启循环,排查半天才发现是端口被系统服务占了。
3. 用 docker-compose 拉起最小可用 OpenClaw:一份能直接落地的编排文件
3.1 最小化 compose 文件:镜像、端口、数据卷三件套
用 docker run 单条命令也能把 OpenClaw 跑起来,但我不推荐,因为命令里的参数一旦写错,改起来要重敲一整条。用 docker-compose 管理的好处是:编排文件本身就是文档,端口、挂载、环境变量都写在明面上,换机器时拷贝一份文件就能复现。
我一般会在 ~/openclaw/ 下放一个 docker-compose.yml,内容如下,这是能跑通的最小配置:
services: openclaw: image: openclaw/openclaw:stable container_name: openclaw restart: unless-stopped ports: - "8080:8080" volumes: - ./data/config:/app/config - ./data/sessions:/app/sessions - ./data/logs:/app/logs environment: TZ: Asia/Shanghai OPENCLAW_PORT: 8080这段配置的逻辑很直接:指定镜像为 openclaw/openclaw:stable,容器内部的管理端口是 8080,映射到宿主机的 8080 端口;挂载三个数据目录,把配置、会话、日志都落到宿主机上;环境变量里设置了时区和监听端口。
参数说明要分几个点讲。restart: unless-stopped 的意思是容器异常退出时自动拉起,但如果你手动 stop 它,就不会被自动重启——这个策略适合长期运行的 OpenClaw 服务。ports 的写法 "8080:8080" 是“宿主机端口:容器端口”,如果你宿主机上 8080 已被占用,改成 "8081:8080" 即可,注意改完要访问 8081 而不是 8080。volumes 里用的是相对路径,基于 compose 文件所在目录,所以你在 ~/openclaw/ 下执行命令时,数据会落在 ~/openclaw/data/ 下,迁移整机时打包这个目录就行。
执行启动命令前,先创建好数据目录并给到合适的权限。我一般这样做:
mkdir -p ~/openclaw/data/{config,sessions,logs} cd ~/openclaw docker compose up -d这里的 mkdir -p 会一次性建好三个子目录;docker compose up -d 是后台启动。如果你用的是旧版 docker-compose,命令要写成 docker-compose up -d,注意中间有没有横杠。启动后别急着关终端,先看一眼容器状态,确认不是奇怪的退出状态。
3.2 启动后的自检动作:容器日志、健康状态与首次配置入口
容器启动后有三件事要做:查状态、看日志、确认管理页能打开。这三步走完,最小可用环境才算真正落地。
docker compose ps docker logs openclaw --tail 100 curl -I http://127.0.0.1:8080docker compose ps 会显示容器的运行状态和端口映射,正常情况是 Up 状态。docker logs 里如果出现类似“listening on 0.0.0.0:8080”的日志,说明服务进程已经起来了。curl -I 用 HEAD 请求探测管理页,返回 HTTP 状态码说明端口通;如果 curl 没装,可以换成 wget --spider http://127.0.0.1:8080。
这里有个常见误区:容器状态是 Up,不代表服务就绪。很多框架在启动时要做数据库初始化或配置加载,这期间端口还没有监听,要等几秒到几十秒。我看到过有人容器刚起来就去点页面,发现打不开就开始重启容器,结果陷入死循环。正确的做法是看日志里有没有明确的启动完成标志,再配合 curl 探测。
首次打开管理页时,OpenClaw 一般会引导你创建管理员账号或初始化配置。这个配置一旦写入,就会落到我们挂载的 ./data/config 目录下。这一步完成后,建议回到宿主机看一眼目录里是不是多了配置文件,确认数据卷挂载确实生效。如果目录是空的,说明挂载路径没对上,这是个必须尽早解决的隐患,否则后面重启必丢配置。
4. 参数调优与数据持久化:让 OpenClaw 在容器里长期稳定跑
4.1 必调参数:内存上限、日志轮转与重启策略
最小配置能跑通,但不建议直接丢到生产环境里长跑。OpenClaw 的会话任务会吃内存,日志文件会无限增长,这些都要在 compose 文件里提前约束住。我调优后的 compose 文件长这样:
services: openclaw: image: openclaw/openclaw:stable container_name: openclaw restart: unless-stopped ports: - "8080:8080" volumes: - ./data/config:/app/config - ./data/sessions:/app/sessions - ./data/logs:/app/logs environment: TZ: Asia/Shanghai OPENCLAW_PORT: 8080 logging: driver: json-file options: max-size: "10m" max-file: "3" deploy: resources: limits: memory: 2g对比最小配置,这里加了两个关键块。logging 块限制容器日志的单文件大小为 10MB,最多保留 3 个文件,防止日志把磁盘写满。deploy.resources.limits.memory 把容器内存上限设为 2GB,超过这个值容器会被内核 OOM 杀掉并自动重启(配合 restart: unless-stopped)。内存上限要结合你的会话并发量来定,OpenClaw 跑复杂任务时内存涨幅很快,设太小会导致频繁重启,我一般先观察两天的峰值内存再定这个值。
查看容器内存使用情况的命令:
docker stats openclawdocker stats 实时显示 CPU 和内存占用。观察几个小时,取一个峰值上浮 30% 作为内存上限,这样既不会浪费资源,也不会动不动被 OOM。另外补充一个冷门但有用的参数:重启策略。restart: unless-stopped 适合大多数场景,但如果你希望宿主机重启后 OpenClaw 也自动拉起,可以保持这个策略不变——它就是干这个的。千万不要用 always,因为 always 在容器手动停止后仍会在下次 Docker 服务启动时自动拉起,你可能想停都停不住。
4.2 数据持久化与备份习惯:把配置和会话目录挂出容器
数据卷挂载上面已经写了,但这里要单独说清楚一件事:不挂载数据卷的后果是什么。如果镜像里自带了默认数据目录,而你启动容器时没挂载,那么容器一旦被删除,所有配置和会话数据连同容器一起消失。很多人以为 restart 就万事大吉,但 restart 只保证容器进程重启,不保证容器本身不被删。一旦你执行 docker compose down 再 up,未挂载的数据就全没了。
挂载做到了、备份也要跟上。我的备份习惯是在宿主机上写一个定时任务,每天打包一次数据目录:
tar -czf openclaw-backup-$(date +%F).tar.gz -C ~/openclaw data这条命令把 ~/openclaw/data 目录压缩成带日期的归档文件。恢复时先停容器,解压归档到原目录,再启动容器:
docker compose down tar -xzf openclaw-backup-2025-01-01.tar.gz -C ~/openclaw docker compose up -d备份的频率取决于你对数据丢失的容忍度。会话记录如果只是调试用的临时数据,一周一次够了;如果里面存着生产环境的任务配置,建议每天备份并保留最近七天。数据卷权限问题也常在这里暴露:如果容器内进程以 UID 1000 运行,而你宿主机备份目录的所有者是 root,恢复数据后容器会写不进去。解决方法是恢复后执行 chown -R 1000:1000 ~/openclaw/data,把目录属主改成容器内用户对应的 UID。
提示:换机器迁移时,别只拷数据卷,要连 compose 文件一起拷。数据卷记录的是运行状态,compose 文件记录的是运行方式,两者缺一个都得重新折腾。
5. OpenClaw 容器化避坑清单:5 个典型故障与处理顺序
5.1 现象一:容器起来了但 Web 管理页打不开
现象:docker compose ps 显示容器是 Up,但浏览器访问管理页一直超时。原因有两类,最常见的是端口映射没生效,其次是容器内的服务还没监听端口。处理顺序:先看宿主机端口是否有监听,再进容器看进程状态。
排查命令我一般这样执行:
ss -tlnp | grep 8080 docker exec -it openclaw sh -c "wget -qO- http://127.0.0.1:8080 || echo not-ready"第一条命令确认宿主机上 8080 端口是否有进程监听;第二条命令绕过端口映射,直接在容器内部访问服务,用来判断是服务没起来还是网络映射问题。如果容器内 curl 通、宿主机不通,那就是端口映射或防火墙的问题,检查 compose 文件里的 ports 段;如果容器内也不通,说明服务还在初始化,等日志出现 ready 字样再试。
5.2 现象二:重启后配置全部还原
现象:第一天配置好的管理账号和参数,docker compose restart 之后全部回到初始状态。原因基本只有一个:配置目录没有挂载或挂载路径不对。常见错误是把宿主机路径写成了容器内路径,比如 volumes 里写了 /app/config:/app/config,这会把容器目录挂到自己身上,等于没挂。处理方式:先看容器启动时日志里有没有提示配置写入的路径,再对比镜像里默认的配置目录。在 compose 文件里把宿主机路径改成带 ./data 前缀的路径,然后 down 再 up 重新创建容器。注意是 down 加 up,restart 不会重新挂载。
我给这个坑排了个优先级的理由是:数据丢失类问题比端口类问题隐蔽得多,而且一旦你继续跑了好几天才发现,回滚都没有余地。
5.3 现象三:容器反复退出,日志只留一句 exit code
现象:容器启动后几秒就退出,docker logs 里只有一句 exit code 1。原因大概率是环境变量或启动命令不对。OpenClaw 镜像在启动时会校验关键环境变量,缺了就拿不到监听端口。处理方法是先看完整日志,不要只看最后几行;再进容器手动执行启动命令看报错:
docker logs openclaw 2>&1 | head -50 docker run --rm -it --entrypoint sh openclaw/openclaw:stable第二条命令用临时容器覆盖默认启动命令,进入 shell 后手动执行启动脚本,这样能看到真正的报错信息,而不是被 up 状态欺骗。我遇到过一次是时区环境变量格式写错导致启动脚本解析失败,改回标准 TZ 值就好了。
5.4 现象四:与宿主机其他服务端口冲突
现象:容器能启动,但外部始终无法连接,ss 查看发现宿主机端口被另一个进程占用。处理方式最简单:换宿主机映射端口。但要强调的是,只改 ports 的左边数字,右边容器端口保持不变。比如:
ports: - "8081:8080"这样宿主机的 8081 接受请求,转发到容器内的 8080。改完执行 docker compose up -d 重新创建容器,不要用 restart,因为端口映射在容器创建时只读取一次。
5.5 现象五:容器内时区不对导致定时任务延迟 8 小时
现象:OpenClaw 里配置的定时任务总是比预期时间晚 8 小时触发。原因是容器默认时区是 UTC,而你的预期是北京时间。解决:在 compose 文件的 environment 里设置 TZ: Asia/Shanghai,然后重建容器。如果镜像里没有 tzdata,只设 TZ 可能无效,需要在构建镜像时安装 tzdata,或者用宿主机的时区文件挂载进去:
volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro这个坑提醒我们:容器里的环境和宿主机不是同一个世界,凡是和时间相关的行为都要先确认时区设置。
6. 进阶:版本升级与跨机器迁移,用镜像 tag 和数据卷快照兜底
OpenClaw 镜像更新比较频繁,长期跑的人迟早要面对升级问题。我的升级流程是:先进容器备份数据卷,再拉新镜像,然后重建容器,最后验证版本。备份时先停容器,确保数据卷没有写入中的文件,再打包:
docker compose stop tar -czf pre-upgrade-backup.tar.gz -C ~/openclaw data docker compose pull docker compose up -ddocker compose pull 会把 compose 文件里指定的镜像拉成最新层。需要注意,如果你用的是 stable 标签,pull 会把镜像更新到的当前稳定版,版本跨度可能很大;更稳妥的做法是先手动执行 docker pull openclaw/openclaw:具体的版本标签,确认无误后把 compose 文件里 image 字段改成这个标签,再执行 up -d。降级操作同理:把标签改回旧版本,重新 up -d,数据卷不动,配置一般能兼容,但建议降级前也做一次备份,因为高版本写入的配置可能被低版本拒绝读取。
跨机器迁移时,我一般把 compose 文件和数据卷归档一起拷过去。目标机器上先建目录、解压数据、改好端口,再启动。这里最容易漏的是数据目录的属主不对,新机器上解压后所有文件是 root 属主,容器内进程写不进去,启动会报权限错误。执行 chown 后再启动容器。
关于验证,我每次升级后固定跑一遍回归动作:打开管理页确认能登录,创建一个测试会话跑通一个简单任务,看一眼日志没有红色报错。这套动作用不了五分钟,但能避免升级完才发现老任务全部挂掉的尴尬。之前有一次我升级后偷懒没跑回归,结果会话任务全被新版本迁移逻辑重置,一群定时任务静默失败,排查花了一个下午。从那以后我再也没有跳过验证环节。
OpenClaw 的容器化部署说穿了就三件事:目录规划要提前、参数调优要观察、数据卷要当宝。如果你照着这份指南一步步来,从拉镜像到跑通管理页应该在十分钟内完成,后面需要操心的是内存上限和备份频率。踩坑是正常的,但希望这篇笔记能帮你把坑都留在可见处,而不是半夜三点被日志刷屏惊醒。希望帮到你。
本文还有配套的精品资源,点击获取