如何搭建一个私有的镜像仓库 mirror

2023年 1月 4日 123.4k 0

Docker 的 Mirror 仅能加速 docker.io 的镜像,而不能加速私有仓库的镜像。

1. 为什么需要一个私有的镜像仓库 mirror

  • 公网限速
  • dockerhub 拉取限制频率
  • 减少拉取镜像时间

2. 创建一个 Registry 镜像加速服务

  • 生成一个配置文件
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

但这样启动的服务只能作为 Registry 而不是 Mirror。Registry 是用来存储镜像,直接对外提供服务;Mirror 使从 Registry 拿到镜像数据再转给 Client。

  • 添加 proxy 字段到 config.yml 文件中

在 config.yml 可以配置很多特征,比如验证秘钥、存储后端等。这里仅添加 proxy 字段,最终的 config.yml 内容如下:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io

如果使用到私有的镜像,可以按照如下格式填入账户密码,但这里的 remoteurl 不支持自建的私有仓库,只能填 Docker 官方仓库。这在官方文档: https://docs.docker.com/registry/recipes/mirror/ 有给出说明。

1
2
3
4
proxy:
  remoteurl: https://registry-1.docker.io
  username: [username]
  password: [password]
  • 启动镜像服务

创建存储目录

1
mkdir data

启动服务

docker run -d -p 5000:5000 --restart=always --name mirror \
             -v `pwd`/config.yml:/etc/docker/registry/config.yml \
             -v `pwd`/data:/var/lib/registry \
             registry:2

查看服务

1
2
3
4
docker ps

CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                    NAMES
fc10fdef7e3f   registry:2   "/entrypoint.sh /etc…"   1 minutes ago   Up 1 minutes   0.0.0.0:5000->5000/tcp   mirror

3. 也可用 Dragonfly 的 Mirror 模式

  • 新增一个配置文件 dfget.yaml
1
vim dfget.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
proxy:
  security:
    insecure: true
  tcpListen:
    listen: 0.0.0.0
    port: 5000
  registryMirror:
    dynamic: true
    url: https://index.docker.io
  proxies:
    - regx: blobs/sha256.*
keepStorage: true
storage:
  taskExpireTime: 6h
  diskGCThreshold: 50Gi
  • 新增存储目录
1
mkdir dfdata
  • 启动 Dfdaemoan 服务
1
2
3
4
docker run -d --name dragonfly-dfdaemon --restart=always --net=host \
        -v `pwd`/dfdata:/var/lib/dragonfly \
        -v `pwd`/dfget.yaml:/etc/dragonfly/dfget.yaml \
        dragonflyoss/dfdaemon:v2.0.4

这里不需要再部署 Dragonfly 的其他服务,而且 Dfdaemon 组件能对镜像进行生命周期管理,这是比 Registry 具有优势的地方。

4. Docker Daemon 配置镜像加速源

  • 修改 Docker 的配置文件 daemon.json

在 /etc/docker/daemon.json 文件中,增加镜像源

1
2
3
4
{ 
    "registry-mirrors": ["http://127.0.0.1:5000"],
    "live-restore": true
}

live-restore 为 true 时,重启 Docker 不会影响正在运行的容器。

  • 重新加载配置
1
2
systemctl daemon-reload
systemctl restart docker
  • 查看 Docker 配置
1
docker info 
  • 测试拉取镜像
1
2
docker pull centos
docker pull ubuntu
  • 查看缓存数据大小
1
2
3
du -sh data

157M	data

5. 总结

本篇主要使用 Registry、Dragonfly 两种方案搭建了 docker.io 的 Mirror 加速服务。两种方式简单,易于维护,在办公网、IDC 网络下,都能极大加速 docker.io 的镜像拉取,节省流量费用。

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论