DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案[最佳实践]
Docker将容器化技术普及,推动云计算向云原生的演进。Docker的核心创新技术之一是容器镜像,它是一种文件的打包方式,将应用程序运行的操作系统、库、运行环境等依赖全部打包一起。在其他任意环境,只要可以运行docker服务,就可以基于该镜像运行容器,即业务程序。
与GitHub托管代码的定位类似,Docker Hub 是一个开放性的容器镜像托管平台。由于其是最早的在线镜像存储和分发的平台,绝大多数的开源项目镜像都在该平台上托管。
容器镜像本质还是对文件的一种组织管理方式,具有传播数据和信息的能力,因此对于其分发的文件内容需要符合地方的法律法规,在没有完成合规的要求前应该无法直接面向国内提供服务。
鉴于DockerHub是绝对权威和全面的容器镜像托管平台,无法使用托管在该平台上优质的镜像,绝对是国内信息科技业的重大损失。
一种简单合规的镜像同步到国内方案
该方案核心是基于 GitHub Action功能,通过触发Action流水线执行容器镜像的拉取和推送。(GitHub目前可访问:Github是否在调试和预演封禁中国IP用户?我们又该怎样应对?)
藏云阁 ImageToTo 开源项目(https://gitea.cncfstack.com/cncfstack/imagetoto)就是该方案的实现,大家也可以通过提交issue或在论坛,或微信群反馈需要同步的镜像,合并 push 时就会自动同步。
ImageToTo项目核心代码只有 Action 中的 10 来行代码。
源代码如下:
name: imageToTo
on:push:branches: [ "main" ]workflow_dispatch:
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- name: Run a multi-line scriptrun: |sudo docker login --username=${{ secrets.HARBOR_USER }} --password=${{ secrets.HARBOR_PWD }} harbor.cloud.cncfstack.comfor img in `cat image.list`dosudo docker pull $imgif [ $? -ne 0 ];thenecho "pull error $img" >> tmpfilecontinuefisudo docker tag $img harbor.cncfstack.com/$imgsudo docker push harbor.cncfstack.com/$imgdoneif [ -f tmpfile ];thencat tmpfilefi
源代码的逻辑
-
登陆国内镜像仓库
-
用Github Action流水线 docker pull 拉取镜像
-
通过 docker tag 将镜像tag修改为国内镜像仓库的地址信息
-
执行 docker push 将镜像推送到国内镜像仓库。
这个项目在配置时有两点需要注意,image.list 文件中填写 DockerHub 的镜像完整地址和国内镜像仓库的密码安全保密问题。
关于image.list 文件中填写 DockerHub 的镜像完整地址,主要是考虑项目的兼容性,因为到目前为止实际上已经有多个镜像托管平台了,如 Google 的gcr.io,Github的 ghcr.io ,以及一些开源项目自建的镜像仓库。
# cat image.list
docker.io/library/nginx:1.26
另外一个需要注意的就是国内镜像仓库的账号和密码需要保密,这是通过Github的 secrets 配置管理的。
#组织或项目settings
->settings->security->secrets and variables->Actions->secrets
配置后只能通过Action执行流水线时读取使用,用户在管理页面和流水线日志中都无法查看该 secret 内容信息。配置示例:
在项目的 Action 文件中使用如下语法应用
--password=${{ secrets.HARBOR_PWD }}
通过在 image.list 中添加镜像地址列表,执行 push 后在国内的镜像仓库中就可以查看和使用了。
如图是国内 Harbor 的日志信息,说明镜像已经成功推送过来了。
在使用时,只需要在镜像前面添加国内镜像仓库地址即可拉取镜像
docker pull harbor.cncfstack.com/docker.io/library/nginx:1.26
关于国内镜像仓库的选择
镜像仓库可以选择公有云的“容器镜像服务”,开箱即用。但是在实际使用时“个人免费版本”无法使用完整功能,会有很多限制。
最无法接受的就是“多级仓库目录”无法使用,该功能限制会直接导致脚本兼容性极差。
所以,经过分析评估还是选择基于开源 Harbor 搭建企业私有的容器镜像仓库相对合适。当然,如果企业有采购公有云的容器镜像仓库服务企业版本,也是可以的。
使用 Harbor 搭建的镜像仓库可以创建很多不同的项目来区分不同镜像托管平台,也没有目录层级等限制,如图示例
关于 Harbor 仓库的安装部署实际非常简单,后续的文章会进行快捷部署的介绍。