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]
|
创建存储目录
启动服务
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 模式
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
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
|
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 的镜像拉取,节省流量费用。