没魔法如何下载Docker镜像


没有解决科学上网的前提下,国内如果解决访问并下载 Docker 镜像的几种方法!

就在六月初,因为政策问题,导致国内的 Docker Hub 镜像加速器相继停止服务,让严重依赖镜像站过活的用户和企业当头一棒。导致开发、测试和部署工作严重受阻,许多高校的镜像缓存服务也相继停止。面对这一现状,以下是收集了几种主流的解决思路,助你克服限制,顺利获取所需镜像。

没魔法如何下载Docker镜像


1. 更改镜像源

对于镜像全面性不追求的群体

即找找国内目前还可用且没有关闭的 Docker Hub 镜像站,但是目前已知且测试的情况来看,有很多问题。比如,幸存的镜像一般都会有限流限制速和白名单的存在,导致其镜像不全(尤其是个人用户创建的公开镜像)且下载速度不较慢。还有就是安全问题了,很难保证所使用的镜像服务是安全可信的。

目前来说,下面三个还算是比较好点的。需要使用的话,可以在配置文件中添加重启 Docker 服务使其生效。如果都不想使用的话,可以登录自己的阿里云获取对应镜像地址,但是镜像确实不够新,尤其是不热门的项目更甚。

其中,atomhub 所属于开放原子开源基金会,是国内多个大公司成立的非营利机构,标榜的就是 镜像来源安全可信,但目前只有 336 个镜像可以下载和使用。然后,1panel 所属于飞致云,商业容器相关的公司,该站点主要是给 1Panel 产品使用的,目前只有 143 个镜像可以下载和使用。最后,daocloud 所属于道客,也是一家商业容器相关的公司,收录的镜像目前有 596 个,且可要随时提 PR,增加更多的镜像地址。

当然,还有一些其他的公共镜像站,但是大多是 .ru 相关的,可能是因为之前很早就收到美国和欧洲制裁所有应运而生的。大多都是免费的话,但是其实并不好用。

# 配置方式
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://atomhub.openatom.cn",
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://xxxxxxxx.mirror.aliyuncs.com"
  ]
}
EOF

# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker.service

# 检测是否生效
$ docker info | grep -A 4 Mirrors

使用其他人的镜像站点不放心的话,可要对下载的镜像进行 check,判断是否对应镜像和官网的版本是否一致。在官网找到对应版本的 sha256 和本地下载的进行对比。

# 检查
docker inspect d7axxxxe1e65 | grep -A 2 Digest \
    | grep sha256 | awk -F: '{print substr($2, 1, 12)}'

2. 自建镜像站点

有一些门槛,如果不付费的话,只能个人或微型公司使用。

事情出来之后,在 Github 上面出现了很多项目来解决上述代理的问题,但是大多数都是薅羊毛来部署个人站点。比如,使用免费域名,使用 docker actionCloudflare Workers 实现服务部署,最后设置自己的代理地址。这里找了三个 Github 上面 Star 数量比较多的项目,有需要的话,可要自行部署。

首先是 CF-Workers-docker.io 项目,是一个基于 Cloudflare WorkersDocker 镜像代理工具,能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。简单来说,就是在 _worker.js 写一个对官网的请求代理,因为 Cloudflare 部署的节点是可以访问的。这个 cloudflare-docker-proxyhammal 也是同样的原理。

# 拉取时需要加域名前缀
$ docker pull docker.xxx.io/escape/app:latest

# 或者配置镜像地址
"registry-mirrors": ["https://docker.xxx.io"]

还有,Docker-Proxy 也是利用 RenderKoyeb 部署基于官方 Docker Registry 的镜像加速服务。同时,也可以自己部署再国外的服务器上面,充当中传。

version: 0.1
storage:
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enabled: true
  maintenance:
    uploadpurging:
      enabled: true
      age: 168h
      dryrun: false
      interval: 1m
http:
  addr: 0.0.0.0:5000
proxy:
  remoteurl: https://registry-1.docker.io

还有,image-mirror 是利用 Github action 来拉取官网 Docker Registry 中需要的镜像,然后同步镜像到自己个人的 阿里云、华为云 的个人版镜像仓库。就目前阿里云来说,提供个人版镜像仓库,限额 3namespace300个镜像,对于个人足够用了。


3. 学会当魔法师

需要点能力和费用,但是最直接有效!只有魔法才可以打败魔法!

当好魔法师,很多原本因为网络导致的问题都可以轻松解决。使用自建的服务器,配置代理,然后就可以使用了。需要注意的是,配置方式有两种,根据自身情况选择和使用。

  • Daemon Configuration
# Linux regular setup: /etc/docker/daemon.json
# Linux rootless mode: ~/.config/docker/daemon.json
{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

# restart
$ sudo systemctl restart docker
  • Systemd Unit File
# regular install
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf

# config
$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=https://proxy.example.com:3129"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

# restart
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

# check
$ sudo systemctl show --property=Environment docker

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录