ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

腾讯云部署OpenClaw:Docker镜像拉取超时排查与加速配置实战

腾讯云部署OpenClaw:Docker镜像拉取超时排查与加速配置实战 我最近在一台腾讯云轻量服务器上折腾 OpenClaw 的部署整个过程卡在了一个看似最简单、其实最磨人的环节docker pull拉取基础镜像时反复超时。如果你也正在尝试把 OpenClaw 这类依赖 Docker 编排的 AI 项目搬到云服务器上大概率会撞上同一个墙。这篇文章不聊虚的就把我从腾讯云环境初始化、Docker 安装、镜像拉取超时排查到 OpenClaw 容器组最终跑起来的完整过程拆开讲清楚。我会尽量把每一步为什么这么做、踩了哪些坑、正确的排查链路是什么都写出来让你照着走一遍就能落地而不是看完还是一头雾水。1. 问题表象与根因拉取超时不是一个网络玄学问题1.1 我遇到的卡死现场第一次在腾讯云实例上执行docker pull时终端输出是这样的Using default tag: latest latest: Pulling from library/openclaw e5d8b7c6d8a3: Pulling fs layer 76d5a4f8c8c1: Waiting d1e6b3a9c7f2: Downloading [ ] 12.45MB/58.21MB然后进度条就像被钉住了一样卡在某个百分比纹丝不动。等一两分钟终端直接报Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)更常见的情况是报dial tcp: i/o timeout或者干脆在Waiting状态挂到天荒地老。我一开始以为是 OpenClaw 镜像太大、机器带宽不够后来换了个只有几十 MB 的官方基础镜像测试发现同样超时。这时候才反应过来问题不在镜像大小而在 Docker 与镜像仓库之间的网络链路。1.2 为什么腾讯云机器拉 Docker Hub 镜像特别容易超时Docker Hub 的官方仓库域名是registry-1.docker.io它的 CDN 节点和认证服务分布在海外。腾讯云国内地域的服务器默认访问海外站点时网络路径会绕经国际出口这个出口在晚高峰或特定时段经常拥塞表现就是连接建立慢、传输中断、响应超时。这里有个关键点容易被人忽略docker pull并不是一个单纯的下载动作。Docker 客户端先要访问auth.docker.io做 token 认证再访问registry-1.docker.io获取镜像 manifest最后才从它返回的 CDN 地址通常是production.cloudflare.docker.com等拉取分层数据。任何一个环节超时整个 pull 就失败。所以你会看到有时候卡在 Waiting有时候卡在 Downloading这实际上是不同环节的网络问题。另外腾讯云新开的实例如果是按量计费的基础型默认公网带宽可能只有 1Mbps 到 3Mbps加上跨网延迟拉取几十 MB 的分层数据耗时极长拉几百 MB 的镜像基本就是灾难。我第一次在 1Mbps 带宽的小水管上尝试光是等超时重试就花了二十多分钟最后才下定决心先解决网络链路问题。1.3 先确认问题的定位是网络问题还是配置问题在改任何配置之前我建议你先做三个快速排查命令避免瞎折腾# 测试到 Docker Hub 的连通性 curl -I https://registry-1.docker.io/v2/ # 测试 DNS 解析是否正常 nslookup registry-1.docker.io # 看当前 Docker 使用的 registry-mirror 配置 docker info | grep -A 5 Registry Mirrors我当时的测试结果是curl能发出请求但迟迟不返回响应头nslookup能正常解析出 IPdocker info里没有任何镜像加速配置。这说明 DNS 没问题Docker 默认直连官方仓库纯粹是网络链路质量问题。到这一步就可以确定要走镜像加速的路子了。2. 环境准备腾讯云实例选型、系统初始化与 Docker 安装2.1 服务器选型与系统建议部署 OpenClaw 这类带 Web 控制台、数据库、消息中间件的容器组我建议腾讯云实例至少选择 2 核 4GB 内存系统盘 50GB 起步。镜像拉取超时问题在低配机器上会叠加内存不足、磁盘 IO 慢等二次故障排查起来更痛苦。系统方面我用的 Debian 12Bookworm这是当前兼容性最好、Docker 官方源支持最完整的版本。Ubuntu 22.04 和 24.04 也没问题但 CentOS 7 已经停止维护内核版本偏旧Docker 新版本可能会遇到 iptables 兼容问题不建议新部署选择它。提示如果对 Linux 命令不太熟腾讯云控制台支持在购买实例时直接设置 root 密码也可以用 SSH 密钥登录。后者更安全但需要自己在本地生成密钥对并上传公钥。对于临时测试环境密码登录更省事长期使用强烈建议改密钥登录。2.2 Docker 安装方式对比我见过很多教程让人直接用腾讯云的 Docker 镜像源安装或者用curl -fsSL https://get.docker.com | sh一键安装。这两种方式我都不太推荐原因很简单你没法确定脚本给你装成了什么版本也没法精确控制安装过程。推荐的做法是走 Docker 官方 apt 源手动分步安装# 安装基础依赖 apt update apt install -y ca-certificates curl gnupg # 添加 Docker 官方 GPG 密钥 install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod ar /etc/apt/keyrings/docker.gpg # 添加 apt 源 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ tee /etc/apt/sources.list.d/docker.list /dev/null # 安装 Docker 引擎和 Compose 插件 apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里的docker-compose-plugin特别重要它提供的是docker compose带空格子命令比旧版的独立docker-compose二进制更好用语法更新、维护也更及时。安装完成后执行systemctl enable docker systemctl start docker顺便提一句国内下载download.docker.com也是走国际链路如果 apt 源本身拉取很慢可以把源里的域名替换为可用镜像地址但这属于另一层优化不影响本文主线我后面会在踩坑部分单独说。2.3 安装完成后的 Docker 自检Docker 装好后先别急着拉镜像跑一遍自检docker version docker compose version docker run --rm hello-worlddocker version重点看 Server 部分有没有正常返回如果只显示 Client 而 Server 报错多半是 dockerd 没启动。docker run --rm hello-world会尝试从 Docker Hub 拉一个几百 KB 的测试镜像这一步如果成功说明基础链路是通的如果失败就正好进入下一节的核心主题。我在自检环节就卡住了hello-world都拉不下来。当时心里反而踏实了既然最小的镜像都超时那问题 100% 在网络链路不用怀疑 OpenClaw 相关配置。3. 核心解法修改 daemon.json 配置镜像加速3.1 Docker Registry Mirror 的原理Docker 原生支持配置registry-mirrors镜像加速器原理是在 Docker 守护进程dockerd启动时把所有发往 Docker Hub 的镜像拉取请求自动代理到你配置的镜像仓库地址。这个仓库会缓存 Docker Hub 的热门镜像并从国内节点提供下载速度提升非常明显。这个机制是 Docker 官方提供的标准功能——它叫 Registry Mirror不是第三方 hack。任何 Docker 环境都可以通过修改/etc/docker/daemon.json来配置。镜像加速仓库的域名可以从你所在网络环境能访问的公共镜像站点获取不同云厂商、不同地区的可用性不一样建议在配置前先curl -I测试一下对应域名是否可访问。提示给registry-mirrors配置多个地址是有实际意义的。Docker 会按顺序尝试第一个不可用时自动切换到下一个。我通常会配置 2 到 3 个形成冗余。但注意不要把不可靠的地址放前面否则每次拉镜像都会先等一次超时再切换体验很差。3.2 配置步骤备份、修改、生效完整的配置流程如下# 备份原配置 cp /etc/docker/daemon.json /etc/docker/daemon.json.bak # 编辑配置 vim /etc/docker/daemon.json写入内容{ registry-mirrors: [ https://mirror.example1.com, https://mirror.example2.com ], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, max-concurrent-downloads: 5 }这里面的参数我逐个解释一下registry-mirrors镜像加速地址列表是解决超时的核心配置。log-driver和log-opts限制容器日志文件大小。OpenClaw 这类 AI 编排项目会在运行时打印大量日志不限制的话几天就能把磁盘写满。max-size10m表示单个日志文件超过 10MB 就轮转max-file3保留最近 3 个文件避免日志无限膨胀。max-concurrent-downloads控制同时拉取的分层数。默认是 3调成 5 可以在网络带宽充足时加速拉取但如果你的机器带宽很小这个值反而可能造成连接竞争保持默认或设为 3 更稳。修改完成后重启 Dockersystemctl restart docker注意重启 Docker 会短暂中断正在运行的容器如果已有生产容器在跑建议先docker ps确认没有关键服务或者选在低峰期操作。3.3 用 docker info 验证加速是否生效重启后用下面的命令验证配置是否真正生效docker info | grep -A 10 Registry Mirrors如果输出里能看到你刚配置的地址说明 dockerd 已经加载。接下来再拉一次hello-worlddocker pull hello-world我在这台腾讯云机器上配置加速后原来拉不下来的hello-world几乎是秒下。然后我又拉了一个约 200MB 的完整运行镜像下载速度稳定在 20MB/s 以上全程没有超时。到这里镜像拉取超时的根因就算彻底解决了。提示如果你的镜像源仍然慢可以检查一下是不是只配置了一个地址且该地址不可用。用curl -I 你的加速地址测试响应头正常应该返回200 OK或者重定向到某个具体的镜像存储路径。返回超时、403、404 的地址就不要用了。4. OpenClaw 部署实操从拉取镜像到容器启动4.1 构建思路用 Docker Compose 管理组件镜像拉取问题解决后部署 OpenClaw 就顺理成章了。OpenClaw 的典型部署形态是多个组件协同核心服务负责任务编排对外提供 API 接口配套的存储组件负责状态持久化如果需要接入模型推理还要有一个模型服务的容器。手动逐个docker run管理这些组件会很痛苦所以我直接用 Docker Compose 定义一个docker-compose.yml把所有服务编排在一起。这种方式的好处是一套配置可以完整复现整个环境换机器或换团队都一样。你需要知道的是OpenClaw 镜像本身可以从其项目仓库的 Release 页获取确切的镜像标签具体镜像名和版本号以你部署时项目官方文档为准下面我会用openclaw/core作为示例名称实际操作时替换成官方发布的镜像地址即可。4.2 compose 文件的关键配置在项目目录下创建docker-compose.ymlservices: openclaw-core: image: openclaw/core:latest container_name: openclaw-core restart: unless-stopped ports: - 8080:8080 environment: - OPENCLAW_HOME/data - LOG_LEVELinfo volumes: - ./data:/data - ./skills:/skills networks: - openclaw-net openclaw-db: image: postgres:16-alpine container_name: openclaw-db restart: unless-stopped environment: - POSTGRES_USERopenclaw - POSTGRES_PASSWORDchange_this_password - POSTGRES_DBopenclaw volumes: - db-data:/var/lib/postgresql/data networks: - openclaw-net volumes: db-data: networks: openclaw-net: driver: bridge几个配置点我重点说明restart: unless-stopped容器异常退出后自动重启避免机器重启后服务起不来。这是长期运行服务的标配。ports: 8080:8080把容器内 8080 端口映射到宿主机对外提供 OpenClaw 的 Web 控制台和 API。如果你的腾讯云安全组没放行 8080外网访问会被拦截这个很容易漏。环境变量里的OPENCLAW_HOME/data指向容器内的数据目录配合./data:/data的卷挂载实现数据持久化。OpenClaw 的技能skills、配置、会话记录都存在这个目录里容器删除重建也不会丢数据。POSTGRES_PASSWORD我写了个明显的占位符实际部署务必换成强密码避免数据库裸露在公网后被扫描攻击。bridge网络让openclaw-core和openclaw-db容器之间通过服务名互相访问比 IP 更稳定。4.3 启动与首次验证配置写好后执行docker compose pull docker compose up -ddocker compose pull会一次性拉取 compose 文件里所有服务需要的镜像。这一步能直观验证加速配置是否对所有组件生效。如果某个镜像仍然超时检查该镜像是否托管在非 Docker Hub 的第三方仓库比如ghcr.io或registry.gitlab.com这些仓库不走registry-mirrors加速需要单独处理。启动完成后docker compose ps docker logs -f openclaw-coredocker ps应该显示两个容器都是Up状态。日志里如果出现类似 Server started 或 listening on 0.0.0.0:8080 的信息说明核心服务已经正常起跑。然后在本地浏览器访问http://你的服务器公网IP:8080能看到 OpenClaw 的 Web 界面就算部署成功了。提示如果本地浏览器访问不通先检查腾讯云控制台的安全组规则——在控制台找到你的实例进入防火墙/安全组页面确认 TCP 8080 端口已放行。这是云服务器部署最常见的遗漏点90% 的部署成功但访问不了都是这一处问题。5. 部署后的稳定性检查与常见故障排查5.1 容器运行状态检查几个容器全部Up只是第一步。接下来要做稳定性确认我通常是检查三个方面# 查看容器资源占用 docker stats --no-stream # 查看数据库容器日志是否正常 docker logs openclaw-db | tail -50 # 检查数据卷是否正确挂载 docker inspect openclaw-core | grep -A 3 Mountsdocker stats里重点看 CPU 和内存占用是否在合理范围。OpenClaw 在闲置状态下的 CPU 占用应该很低内存占用取决于模型缓存大小。如果 CPU 长期 100%可能是初始化任务没跑完或者容器配置有问题需要进一步看日志。数据库容器日志里如果出现database system is ready to accept connections说明 PostgreSQL 初始化成功。如果出现权限错误多半是POSTGRES_USER和POSTGRES_PASSWORD环境变量没有正确传入。5.2 镜像拉取超时的残余场景即便配置了加速也仍有两个高概率触发超时的场景场景一拉取ghcr.io、registry.k8s.io、quay.io等非 Docker Hub 仓库的镜像。registry-mirrors只管 Docker Hub管不了这些独立仓库。如果 OpenClaw 或相关组件依赖了这些仓库里的镜像比如某些模型服务的官方镜像托管在 ghcr.io超时依旧会发生。场景二直接通过 URL 安装插件或技能时工具内部请求海外资源超时。这和 Docker 镜像无关但现象相似容易被误诊成容器问题。针对场景一我的处理方式是先用docker pull单独拉一下这个非 Docker Hub 镜像看是否能成功。如果不行找该镜像是否有托管在 Docker Hub 的官方镜像副本或者在可信的镜像同步站点查找同名镜像。针对场景二需要检查 OpenClaw 配置里的超时参数把它调大并确认是否支持配置代理地址。这些都不是 Docker 层的问题需要分而治之。5.3 排查链路从 docker logs 到网络诊断遇到容器起不来或者服务无响应的情况我的排查顺序是# 第一步看容器状态 docker ps -a # 第二步看最近日志判断是启动崩溃还是运行时报错 docker logs --tail 100 openclaw-core # 第三步看是否端口监听正常 ss -tlnp | grep 8080 # 第四步测试容器间通信 docker exec -it openclaw-core ping openclaw-db这四步是一个完整的递进链路每一步都能排除一类问题。日志里如果有connection refused指向数据库容器那就不是网络问题而是数据库地址配错了或者数据库容器根本没起来。ss -tlnp确认宿主机端口有没有进程监听如果没有说明服务绑定端口失败或崩溃重启了。ping容器间通信能确认 bridge 网络是否正常。我在排查时就遇到过一次openclaw-core反复重启。日志显示连不上数据库docker ps里数据库容器却是Up状态。后来发现是 compose 文件里数据库服务名写错了openclaw-core连接的是openclaw-db而我写成了db。把环境变量改回正确的服务名后重启一切正常。这类小问题在排查时最容易让人抓狂建议仔细核对 compose 文件里的服务名和环境变量引用。6. 一些补充实操经验6.1 如果有多台机器要重复配置我自己在本地笔记本、腾讯云测试机、腾讯云正式机上前后部署了三次每次都要手动改daemon.json太繁琐。后来我把配置过程写成了一个脚本一行命令搞定#!/bin/bash mkdir -p /etc/docker mv /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date %s) 2/dev/null || true cat /etc/docker/daemon.json EOF { registry-mirrors: [https://mirror.example1.com, https://mirror.example2.com], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, max-concurrent-downloads: 5 } EOF systemctl restart docker docker info | grep -A 3 Registry Mirrors这个脚本会先备份旧配置再写入新配置并重启最后自动打印验证结果。迁移新机器时直接执行一遍省去手动编辑的步骤也避免忘改某个参数。6.2 后续扩展从单机部署到内网化、移动端探索OpenClaw 部署完成后如果只是在腾讯云上跑一个核心服务还没发挥它对接各类模型的优势。最近我在尝试把 OpenClaw 与本地部署的大模型服务比如通过 Ollama 起的推理服务联动让 OpenClaw 负责任务编排模型推理走内网不把数据送到外部 API。做法很简单在 compose 文件里再加入一个ollama服务并让openclaw-core通过环境变量指定OLLAMA_BASE_URLhttp://ollama:11434然后两个容器就在同一个 bridge 网络里直接通信数据和请求都不出服务器。另一个方向是移动端部署。我看到社区里已经有人尝试在安卓设备上用 Termux 运行 OpenClaw 的轻量版本思路基本一致先把 Docker 或 Podman 装到 Termux 环境再尽量复用上面的 Compose 配置。不过手机端的内存和存储是硬约束我的建议是只部署核心服务数据库换成 SQLite模型推理全部走 API这样还能当作低功耗的随身任务节点使用。这些扩展方向还在持续探索中等跑通了我再单独写一篇。回到当前主题镜像拉取超时这个坑解决之后后面部署 OpenClaw 的路就会顺很多。如果你现在卡在docker pull这一步不用怀疑人生按我这个思路把daemon.json改好、验证加速生效、再跑 Compose大概率一次过。最后再提醒一句修改daemon.json前一定要备份保不齐你手上那台机器有旧配置直接覆盖会把别的设置冲掉。
返回列表