DockerHub镜像代理

背景 公司的服务器从 DockerHub 拉取镜像有时会遇到拉取慢和访问限制,虽说 Docker 官方和国内很多云服务商都提供了国内加速器服务,但是从外网重复拉取速度没法保证。机器的存储空间有限,几乎每天都要清理镜像缓存。
解决方法就是用自家私有的镜像仓库来存储这些常用镜像,比如nginx、golang、python等等。手动把这些镜像push到私有镜像仓库太累,本文使用的正是 Harbor 提供的镜像代理功能。
Harbor镜像代理 harbor的部署就跳过了,直接到操作界面
DockerHub镜像代理
文章图片

DockerHub镜像代理
文章图片

DockerHub镜像代理
文章图片

经过上面的步骤后dockerhub项目就是用来代理到DockerHub官方的,第一次会去DockerHub官方拉取,然后在habor存储一份,下次就不用访问DockerHub了。
假设这里的harbor镜像仓库的地址是 my-harbor.com,使用例子(强烈建议使用具体tag):

nginx:1.22 -> my-harbor.com/dockerhub/library/nginx:1.22golang:1.18.4 -> my-harbor.com/dockerhub/library/golang:1.18.4bitnami/prometheus:2.38.0 -> my-harbor.com/dockerhub/bitnami/prometheus:2.38.0

Dockerfile自动替换 【DockerHub镜像代理】公司内部都有自己的ci/cd系统,此处提供一个思路,在构建镜像这一步做自动替换,最好提供一个开关,让用户选择是否代理DockerHub镜像。
#!/bin/bash dockerfilePath=./Dockerfile i=0 # 去掉空行 grep -v "^$" $dockerfilePath > /tmp/tmp_dockerfile cat /dev/null > $dockerfilePath cat /tmp/tmp_dockerfile |while read line do echo $line >> $dockerfilePath done cat $dockerfilePath |while read line do i=`expr $i + 1`; # 排除注释和scratch镜像 s=$(echo $line |grep 'FROM'| egrep -v '#|\$|scratch' |awk '{print $2}'|awk -F: '{print $1}' |grep -v '\.') || true if [[ -n "$s" ]]; then new="my-harbor.com/dockerhub/library/$s" echo $s | grep '/' > /dev/null && new="my-harbor.com/dockerhub/$s" || true sed -i "${i}s|$s|$new|" $dockerfilePath ||true fi done

    推荐阅读