base on 很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。 # public-image-mirror 源仓库 [Github](https://github.com/DaoCloud/public-image-mirror) Mirror 仓库 [Gitee](https://gitee.com/daocloud/public-image-mirror) - 白名单 & 限流 的公开信息 [#2328](https://github.com/DaoCloud/public-image-mirror/issues/2328) - 如有疑问请咨询 [#4183](https://github.com/DaoCloud/public-image-mirror/issues/4183) - 建议将拉取任务放在闲时 凌晨(北京时间 01-07 点), 其他时间段非常拥挤 - 建议使用明确版本号的 tag, 对于 latest 这种变更后响应旧数据, 并且后台重新同步 - [本服务后端代码](https://github.com/OpenCIDN/ocimirror) - [同步队列](https://queue.m.daocloud.io/status/) 仅保留一小时的同步记录 - [服务状态监控](https://status.daocloud.io/status/docker) ## 背景 & 目标 很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。 * 一个简洁有效的方法能够加速这些包。简洁的名称映射 * 易于添加,添加新的包,不需要去修改代码。 * 稳定可靠,更新实时。每天检查同步情况。 * 此项目仅是源镜像仓库 (Registry) 的 Mirror * 所有 hash(sha256) 均和源保持一致 (懒加载机制)。 * 缓存的内容只保留 90 天, 过期后会需要重新同步。 * Manifest 内存缓存 1 小时, 所以 tag 被更新了 1 小时之后才会同步新的。 * Blob 内存缓存 1 分钟, 在期间如果 blob 到达 90 天期限被删除会报 404。 ## 快速开始 ``` docker run -d -P m.daocloud.io/docker.io/library/nginx ``` ## 使用方法 **增加前缀** (推荐方式)。比如: ``` log docker.io/library/busybox | V m.daocloud.io/docker.io/library/busybox ``` 或者 支持的镜像仓库 的 *前缀替换* 就可以使用。比如: ``` log docker.io/library/busybox | V docker.m.daocloud.io/library/busybox ``` ## 支持前缀替换的 Registry (不推荐) 推荐使用添加前缀的方式. 前缀替换的 Registry 的规则, 这是人工配置的, 有需求提 Issue. 除了这里每一个源站, 内容都是不同的, 不要把 docker.io 之外的站点配置给 registry-mirrors | 源站 | 替换为 | 备注 | | ------------------ | --------------------- | ---------------------------------------------- | | docker.elastic.co | elastic.m.daocloud.io | | | docker.io | docker.m.daocloud.io | | | dhi.io | dhi.m.daocloud.io | | | gcr.io | gcr.m.daocloud.io | | | ghcr.io | ghcr.m.daocloud.io | | | k8s.gcr.io | k8s-gcr.m.daocloud.io | k8s.gcr.io 已被迁移到 registry.k8s.io | | registry.k8s.io | k8s.m.daocloud.io | | | mcr.microsoft.com | mcr.m.daocloud.io | | | nvcr.io | nvcr.m.daocloud.io | | | quay.io | quay.m.daocloud.io | | | registry.ollama.ai | ollama.m.daocloud.io | 实验内测中,[使用方法](#加速-ollama--deepseek) | ## 最佳实践 ### 部署内网缓存 本地缓存部署用于在内网环境中加速镜像拉取,减少对外网的依赖。通过设置一个本地镜像仓库,您可以缓存常用的镜像。 [请参考文档](https://github.com/DaoCloud/public-image-mirror/tree/main/docs/local-cache) ### 加速 Kubneretes #### 加速安装 kubeadm ``` yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration dns: imageRepository: k8s.m.daocloud.io/coredns imageRepository: k8s.m.daocloud.io ... ``` #### 加速安装 kind ``` bash kind create cluster --name kind --image m.daocloud.io/docker.io/kindest/node:v1.22.1 ``` #### 加速所有 Pod https://github.com/wzshiming/repimage 不修改 yaml, helm 等, 仅使用 Webhook, 自动修改所有新建 Pod 的 image 使用本 mirror ``` bash kubectl create -f https://files.m.daocloud.io/github.com/wzshiming/repimage/releases/download/latest/repimage.yaml kubectl rollout status deployment/repimage -n kube-system ``` #### 加速 Containerd * 参考 Containerd 官方文档: [hosts.md](https://github.com/containerd/containerd/blob/main/docs/hosts.md#registry-host-namespace) * 如果您使用 kubespray 安装 containerd, 可以配置 [`containerd_registries_mirrors`](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/CRI/containerd.md#containerd-config) ### 加速 Docker 添加到 `/etc/docker/daemon.json` ``` json { "registry-mirrors": [ "https://docker.m.daocloud.io" ] } ``` ### 加速 Ollama & DeepSeek #### 加速安装 Ollama CPU: ```bash docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama docker.m.daocloud.io/ollama/ollama ``` GPU 版本: 1. 首先安装 Nvidia Container Toolkit 2. 运行以下命令启动 Ollama 容器: ```bash docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama docker.m.daocloud.io/ollama/ollama ``` 更多信息请参考: * [Ollama Docker 官方文档](https://ollama.com/blog/ollama-is-now-available-as-an-official-docker-image) #### 加速使用 Deepseek-R1 模型(实验内测中) 如上述步骤,在启动了ollama容器的前提下,还可以通过加速源,加速启动DeepSeek相关的模型服务 注:目前 Ollama 官方源的下载速度已经很快,您也可以直接使用[官方源](https://ollama.com/library/deepseek-r1:1.5b)。 ```bash # 使用加速源 docker exec -it ollama ollama run ollama.m.daocloud.io/library/deepseek-r1:1.5b # 或直接使用官方源下载模型 # docker exec -it ollama ollama run deepseek-r1:1.5b ``` ## [友情链接]加速二剑客 * 镜像加速:https://github.com/DaoCloud/public-image-mirror * 二进制文件加速:https://github.com/DaoCloud/public-binary-files-mirror ## 贡献者 <a href="https://github.com/DaoCloud/public-image-mirror/graphs/contributors"> <img src="https://contrib.rocks/image?repo=DaoCloud/public-image-mirror" /> </a> Made with [contrib.rocks](https://contrib.rocks). ", Assign "at most 3 tags" to the expected json: {"id":"10695","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"