# Technical Documentation: DaoCloud/public-image-mirror

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/DaoCloud/public-image-mirror)

### Overview (`README.md`)

# 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 点), 其他时间段非常拥挤, 高峰期工作日(北京时间 09-11, 14-17点)
- 建议优先使用 `@sha256:` 指定镜像, 其次使用明确版本号的 tag, 最后才考虑 latest 这种可变 tag, 其变更后会响应旧数据, 并且后台重新同步
- [本服务后端代码](https://github.com/OpenCIDN/ocimirror)
- [同步队列](https://queue.m.daocloud.io/status/) 仅保留一小时的同步记录
- [服务状态监控](https://status.daocloud.io/status/docker)

## 背景 & 目标

很多镜像都在国外。比如 gcr 。国内下载很慢，需要加速。

* 一个简洁有效的方法能够加速这些包。简洁的名称映射
* 易于添加，添加新的包，不需要去修改代码。
* 稳定可靠，更新实时。每天检查同步情况。
* 此项目仅是源镜像仓库 (Registry) 的 Mirror
  * 所有 hash(sha256) 均和源保持一致 (懒加载机制)。
  * 缓存的内容只保留 30 天, 过期后会需要重新同步。
  * Manifest 内存缓存 1 小时, 所以 tag 被更新了 1 小时之后才会同步新的。
  * Blob 内存缓存 1 分钟, 在期间如果 blob 到达 30 天期限被删除, 导致会报 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 之外的站点配置给 docker 的 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"
  ]
}
```

### 加速 Podman

添加到 `/etc/containers/registries.conf` (rootless 模式也可以添加到 `~/.config/containers/registries.conf`)
``` toml
[[registry]]
location = "docker.io"

[[registry.mirror]]
location = "docker.m.daocloud.io"
```

与 Docker 不同, Podman 还支持为 docker.io 之外的 registry 配置 mirror, 例如:
``` toml
[[registry]]
location = "gcr.io"

[[registry.mirror]]
location = "gcr.m.daocloud.io"

[[registry]]
location = "ghcr.io"

[[registry.mirror]]
location = "ghcr.m.daocloud.io"

[[registry]]
location = "quay.io"

[[registry.mirror]]
location = "quay.m.daocloud.io"

[[registry]]
location = "registry.k8s.io"

[[registry.mirror]]
location = "k8s.m.daocloud.io"
```

* 参考 Podman 官方文档: [registries.conf](https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md)

### 加速 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).

---

### Overview (`docs/local-cache/README.md`)

# 部署内网缓存

## 简介

本地缓存部署用于在内网环境中加速镜像拉取，减少对外网的依赖。通过设置一个本地镜像仓库，您可以缓存常用的镜像。

## 部署步骤

1. **准备环境**  

确保已安装 Docker 和 Docker Compose。

2. **配置 Docker Compose 文件**  

创建一个 `docker-compose.yml` 文件：

```yaml
services:
  registry:
    image: m.daocloud.io/docker.io/library/registry:3
    restart: unless-stopped
    ports:
    - 8888:8888
    command:
    - /etc/docker/registry/config.yml
    volumes:
    - cache-data:/var/lib/registry
    configs:
    - source: registry-config
      target: /etc/docker/registry/config.yml
configs:
  registry-config:
    content: |
      version: 0.1
      storage:
        delete:
          enabled: true
        filesystem:
          rootdirectory: /var/lib/registry
      http:
        addr: :8888
      proxy:
        remoteurl: https://m.daocloud.io
        ttl: 2160h
volumes:
  cache-data: {}
```

4. **启动服务**  
```bash
docker compose up -d
```

5. **配置 Docker 客户端**  
在 `/etc/docker/daemon.json` 中添加以下内容：
```json
{
  "insecure-registries": ["<your-registry-ip>:<your-registry-port>"]
}

```
然后重启 Docker 服务：
```bash
systemctl restart docker
```

## 用法

现在您的 `<your-registry-ip>:<your-registry-port>/` 已经是 `m.daocloud.io/` 的本地缓存代理

后续就像 `m.daocloud.io` 加前缀一样, 只需要在原始镜像地址前加上 `<your-registry-ip>:<your-registry-port>/` 即可。

例如，拉取 `docker.io/library/nginx:latest` 镜像，可以使用以下命令：
```bash
docker pull <your-registry-ip>:<your-registry-port>/docker.io/library/nginx:latest
```

---

--- METRICS ---
- Files Extracted: 2
- Estimated Token Budget: ~1842 tokens
- Canonical Reference: https://codewiki.google/github.com/DaoCloud/public-image-mirror
