相关资源
源码:https://github.com/distribution/distribution/
镜像:https://hub.docker.com/_/registry/
文档:https://distribution.github.io/distribution/
on Kubernetes | with Helm Chart | by twuni
Docker Hub/Official Image/Registry
twuni/docker-registry.helm
docker-registry 2.1.0 · twuni/twuni
该笔记将记录:在 Kubernetes Cluster 中,通过 Helm 部署 Docker Registry Mirror 的方法,以及相关问题的解决方案。
https://github.com/twuni/docker-registry.helm
helm repo add twuni https://helm.twun.io helm repo update twuni helm pull twuni/docker-registry # CHART 2.1.0, APP 2.7.1 helm show values ./docker-registry-2.2.3.tgz > docker-registry-2.2.3.tgz.helm-values.yaml ... ingress: ... persistence.storageClass: gp2 ... proxy.enabled: true helm upgrade --install --namespace registry-mirror --create-namespace \ docker-registry-mirror ./docker-registry-2.2.3.tgz -f docker-registry-2.2.3.tgz.helm-values.yaml
然后,测试是否生效:
# vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry-mirror.example.com"] } # docker pull hello-world # kubectl exec -it docker-registry-mirror-79c994c65b-64hjv -- ls /var/lib/registry/docker/registry/v2/repositories/library/hello-world _layers _manifests _uploads // 如上所示,已经存在 hello-world 镜像缓存;
通过 Docker Compose 运行
Configuring a registry | Docker Documentation
harbor/Configure_mirror.md at v2.1.5 · goharbor/harbor
Registry as a pull through cache | Docker Documentation
该笔记将记录:在 Linux 中,如何搭建 Registry Mirror 服务,以及相关问题处理方法;
补充说明:
Registry as a pull through cache | CNCF Distribution
能够使用环境变量指定配置参数,采用 REGISTRY_variable 格式,下划线(_)表示缩进深度:
storage: filesystem: rootdirectory: /var/lib/registry REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere // 这两种写法是等价的;
覆盖默认配置文件:
# docker run -d -p 5000:5000 --restart=always \ --name registry \ -v `pwd`/config.yml:/etc/docker/registry/config.yml \ registry:2
第一步、创建配置文件
在阅读官方文档之后,我们使用的配置:
cat > ./config.yml <<EOF # 版本号,必选参数 version: 0.1 # 日志相关配置 log: accesslog: disabled: false level: debug formatter: text fields: service: registry-mirror environment: production # 镜像存储配置 storage: filesystem: rootdirectory: /registry/storage/ # 监听设置 http: addr: 0.0.0.0:5000 secret: <a-secret-for-local-development> # 我们将使用 Nginx 提供 HTTPS 入口,然后反向代理到 Registry Mirror 服务 # 因此,这里不会再配置 TLS 证书信息; # tls: # certificate: /path/to/x509/public # key: /path/to/x509/private # 镜像仓库地址 # 当配置 proxy 属性后,Registry 自动会以 Mirror 的形式运行; proxy: remoteurl: https://registry-1.docker.io username: your-dockerhub-account password: your-dockerhub-password EOF
第二步、运行测试服务
docker run -d -p 5000:5000 --name registry \ -v $(realpath ./config.yml):/etc/docker/registry/config.yml \ -v $(realpath ./storage/):/registry/storage/ \ registry:2 docker container logs -f registry docker container stop registry docker container rm registry
第三步、使用 Docker Compose 运行
如下是 Docker Compose 编排文件:
version: '3' services: registry-mirror: image: "registry:2" container_name: "registry-mirror" hostname: "registry-mirror" ports: - 65000:5000 restart: always # 运行命令、及其环境信息 volumes: - /etc/localtime:/etc/localtime - /path/to/data:/registry/storage/ - /path/to/config.yml:/etc/docker/registry/config.yml # entrypoint: /bin/entrypoint # command: "ls" environment: - REGISTRY_PROXY_REMOTEURL=https://hub.docker.com - REGISTRY_PROXY_USERNAME=xxxxxxx - REGISTRY_PROXY_PASSWORD=xxxxxxx
第四步、配置 Nginx 代理
在上面的配置中,我们没有为 Registry Mirror 启动 HTTPS 监听。我们将通过 Nginx 方向代理的方式来提供 HTTPS 访问。这主要是因为 Let’s Encrypt 证书的维护问题,nginx reload 比 restart Registry Mirror 更容易;
第五步、配置 Docker 服务
配置本地 Docker 服务,以使用自建的 Registry Mirror 服务;
connection reset by peer
问题描述:
level=warning msg="Error getting v2 registry: Get http://127.0.0.1:5000/v2/: read tcp 127.0.0.1:53612->127.0.0.1:5000: read: connection reset by peer" level=info msg="Attempting next endpoint for pull after error: Get http://127.0.0.1:5000/v2/: read tcp 127.0.0.1:53612->127.0.0.1:5000: read: connection reset by peer"
原因分析:这是因为我们本地启动 HTTP 代理,导致镜像拉取失败;
解决方案:去掉本地 HTTP 代理,然后重新测试服务访问即可;