乐趣区

了解docker-pull时下载的镜像

默认运行 docker pull 获取镜像时,其仓库地址为 docker.io,执行docker info 有:

% docker info
...
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)

完整镜像名称格式为<hostname>/<namespace|project>/<image>:<tag>

  • 镜像提供了完整主机名称,则 docker 从此镜像库下载镜像,如从 quay.io 镜像库的 coreos 项目下载 etcd:latest 镜像:
% docker pull quay.io/coreos/etcd
  • 若省略了 hostname,则默认从docker.io 下载镜像,而若省略 project,其会补充projectlibrary
% docker pull library/debian
Using default tag: latest
Trying to pull repository docker.io/library/debian
% docker pull debian           # 未明确指定 project,从 docker.io 下载时默认补充 library/<image>
Using default tag: latest
Trying to pull repository docker.io/library/debian 

若没有提供 hostname,则下载镜像顺序从Registries 列表获取,但默认只有docker.io,可调整顺序,如:

% vi /etc/sysconfig/docker
ADD_REGISTRY='--add-registry okd-lr.zyl.io:5000 --add-registry quay.io'
INSECURE_REGISTRY='--insecure-registry okd-lr.zyl.io:5000' # 镜像库若是非 TLS,则必须添加此参数

此时 docker info 显示如下:

Registry: https://okd-lr.zyl.io:5000/v1/     # 这里没啥用
Experimental: false
Insecure Registries:
 okd-lr.zyl.io:5000          # 非安全镜像库
 127.0.0.0/8
Live Restore Enabled: false  # 由 ADD_REGISTRY 添加了 2 个镜像库
Registries: okd-lr.zyl.io:5000 (insecure), quay.io (secure), docker.io (secure)

若此时下载镜像,则顺序遍历 Registries 列出的镜像库:

% docker pull etcd
Using default tag: latest
Trying to pull repository okd-lr.zyl.io:5000/etcd ...
Trying to pull repository quay.io/etcd ... 
Trying to pull repository docker.io/library/etcd ... 
Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 134.194.18.2:53: read udp 134.194.18.3:45004->134.194.18.2:53: i/o timeout

如上所示,docker顺序遍历了 3 个镜像库,而在前两个镜像库没找到后,从 docker.io 镜像库查找,此时其会添加 library 项目,而其他的镜像库地址不会添加。由于主机没法访问外网,则报错退出。

okd-lr.zyl.io:5000 私有镜像库配置为 docker.iomirror,如配置了REGISTRY_PROXY_REMOTEURL

% cat /etc/systemd/system/local-registry.service 
[Unit]
Description=Local Docker Mirror registry cache
Requires=docker.service
After=docker.service

# HTTP_PROXY、HTTPS_PROXY 替换为实际代理
# NO_PROXY 配置不走代理的 IP 地址,如示例 192.168.10.x 为宿主机 IP 地址
[Service]
ExecStartPre=-/usr/bin/docker rm -f local-registry
ExecStart=/usr/bin/docker run --name %p \
     -v /data/local-registry:/var/lib/registry \
     -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry \
     -e REGISTRY_PROXY_REMOTEURL=https://registry.docker-cn.com \
     -e HTTP_PROXY=http://<ip>:<port>\
     -e HTTPS_PROXY=http://<ip>:<port>\
     -e NO_PROXY='localhost,127.0.0.1,.cluster.local,.svc,.zyl.io,172.30.0.1,192.168.10.3,192.168.10.4' \
     -p 5000:5000 registry
ExecStop=-/usr/bin/docker stop -t 2 %p
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

此时配置–registry-mirror,如:

vi /etc/sysconfig/docker
OPTIONS='--registry-mirror=http://okd-lr.zyl.io:5000 --selinux-enabled --log-driver=journald --signature-verification=false'
ADD_REGISTRY='--add-registry okd-lr.zyl.io:5000 --add-registry quay.io'
INSECURE_REGISTRY='--insecure-registry okd-lr.zyl.io:5000'

此时执行 docker pull debian 下载镜像,有:

  1. 搜索okd-lr.zyl.io:5000/debian,若上面有则返回,否则搜索下一个镜像库;
  2. 搜索quay.io/debian,若成功则返回,否则继续搜索;
  3. 搜索docker.io/library/debian,因配置了registry-mirror,其将从此代理镜像库获取镜像,若代理镜像库中有,则直接返回,否则其先抓取镜像后再返回;

注意

  • registry-mirror只会代理 docker.io 默认镜像库的镜像,其他镜像库不会代理;
  • mirror镜像库支持的代理操作,即 push/pull 均会代理到 docker.io 上;
  • mirror镜像库若是非 TLS 配置,若要通过此 mirror pushdocker.io,需配置INSECURE_REGISTRY
退出移动版