Please enable Javascript to view the contents

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

 ·  ☕ 2 分钟

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 的镜像拉取,节省流量费用。


微信公众号
作者
微信公众号