220260216

准备开发一个本地化agent,已通过Ollama将DeepSeek部署到本地,现通过anythingllm搭建知识库。本篇日志根据与DS对话,由DS生成,在此基础上进行简单修改。

借助阿里云服务攻克 Docker Hub 网络拉取问题 —— 一次完整的本地部署实践日志

背景与痛点

在 Linux 本地部署 DeepSeek 模型后,我希望进一步搭建 AnythingLLM 知识库系统。然而在尝试拉取 mintplexlabs/anythingllm 镜像时,反复遭遇网络问题:配置的中科大、网易、阿里云镜像源纷纷返回 403、404 或域名解析失败(no such host),Docker Hub 直连更是时断时续,导致部署停滞不前。

寻找突破口

B 站 up 主“CodeX”分享的视频《Docker Hub镜像拉取失败?更牛的终极解决方案又来了》(BV1eEqvBmEp2)介绍了利用阿里云云效 DevOps 平台结合容器镜像服务(ACR)免费中转拉取镜像的方法。核心思路是:通过云效流水线从 Docker Hub 拉取目标镜像,再推送到自己的 ACR 仓库,最后从 ACR 拉取到本地,从而绕过公共镜像源的限制。

详细操作流程与踩坑记录

1. 准备工作

  • 注册/登录阿里云账号,开通容器镜像服务(ACR)个人版云效 DevOps(免费)。

  • 在本地确保 Docker 已安装,并了解基本的 Docker 命令。见Docker 安装与基本操作命令指南

2. 创建 ACR 仓库

进入阿里云容器镜像服务控制台,选择地域(华北2北京),点击“创建镜像仓库”。

  • 命名空间:我创建了 lqspace(需提前创建,如果不存在)。

  • 仓库名称:我原本想用 mintplexlabs/anythingllm,但系统提示仓库名称不能包含斜杠。斜杠被用作命名空间与仓库名的分隔符,因此仓库名必须只包含小写字母、数字、短横线、下划线或点。最终改为 anythingllm

  • 仓库类型:选择“私有”(安全)。

  • 点击“创建”,仓库准备就绪。

3. 配置云效流水线

  • 进入云效 Flow,新建一条流水线。

  • 添加代码源:由于我们不需要构建自己的代码,只是中转镜像,可以使用一个空的代码库,或者直接跳过代码源(视频中演示了如何设置)。

  • 添加“镜像构建并推送至 ACR(个人版)”任务。

  • 关键配置:

    • 构建集群:一定要选香港。

    • 服务连接:需要关联阿里云账号授权。我选择使用主账号 AccessKey 创建服务连接(权限较大但简单),确保该账号有 ACR 推送权限。

    • 地域:与 ACR 仓库一致(华北2)。

    • 仓库地址:填写完整的 ACR 仓库地址,例如 crpi-pc0gtpaivbzmb7da.cn-beijing.personal.cr.aliyuncs.com/lqspace/anythingllm

    • 标签:填写 latest

    • Dockerfile 路径:因为我们的目的是拉取现成镜像,而不是构建,所以需要在代码库中放一个简单的 Dockerfile,内容仅为 FROM mintplexlabs/anythingllm:latest,这样流水线就会基于这个基础镜像“拉取并推送”。

4. 从 ACR 拉取镜像到本地

本节命令直接从阿里云复制即可。

  • 首先需要登录 ACR。运行上图指令1,然后输入密码。这里需要先在仓库管理-访问凭证处设置固定密码。

  • 登录成功后,拉取镜像:

    注意仓库名必须与推送时一致。

5. 部署 AnythingLLM

  • 创建本地存储目录:

  • 运行容器:

  • 访问 http://localhost:3001,配置 LLM 提供商为 Ollama,填入 http://host.docker.internal:11434,成功连接到我本地的 my-assistant 模型。

  • 若创建本地存储目录时提示“docker: Error response from daemon: Conflict. The container name "/anythingllm" is already in use by container”,说明已经存在一个名为 anythingllm 的容器,Docker 不允许同名容器存在,需要先处理掉旧的容器才能创建新的。运行如下代码:

    1. 停止并删除现有容器(如果正在运行,先停止):

      bash

    2. 重新运行你的 docker run 命令

      bash

    注意:删除容器不会影响你挂载在 ~/anythingllm/storage 目录中的数据,因为数据卷是映射到宿主机的,下次运行时会继续使用。

注意事项与经验总结

⚠️ 关键错误与纠正

  1. 仓库命名规则:ACR 仓库名不能包含斜杠 /,只能用字母、数字、短横线、下划线、点。我最初想用 mintplexlabs/anythingllm,导致创建失败。正确做法是用连字符连接,如 mintplexlabs-anythingllm

  2. Docker 登录密码:登录 ACR 时必须使用在“访问凭证”中设置的固定密码,而不是阿里云账号登录密码。忘记设置或使用错误密码会返回 unauthorized

  3. 云效流水线中的 Dockerfile:如果只是拉取并推送现有镜像,需要在代码库中准备一个仅包含 FROM 指令的 Dockerfile,否则流水线会尝试构建不存在的上下文。

  4. 服务连接权限:确保云效服务连接的阿里云账号有 ACR 的推送权限。使用主账号 AccessKey 最直接,但要注意安全;使用 RAM 子账号需授予 AliyunContainerRegistryFullAccess 策略。

  5. 仓库存在性:推送前必须先在 ACR 控制台创建好对应的仓库,否则会报 repository does not exist

  6. 镜像标签一致性:推送时使用的标签(如 latest)必须与拉取时一致。

💡 优化建议

  • 如果经常需要中转镜像,可以将这个过程固化到云效流水线中,以后只需修改 Dockerfile 中的基础镜像名,即可快速拉取任何 Docker Hub 镜像。

  • 对于私有仓库,建议定期清理不再使用的镜像版本,避免占用空间。

  • 如果本地网络允许,也可以考虑使用其他云服务商的中转方案,原理类似。

最后更新于