在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。
这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 hub.docker.com。
代理方法
使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。主要原因是 docker 并不会使用它们,需要为 docker daemon 服务的设置代理才可以。
设置docker服务代理
sudo mkdir -p /etc/systemd/system/docker.service.d/ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
将以下内容写入 http-proxy.conf 文件
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="ALL_PROXY=socks5://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp,.docker.io,.docker.com"
上面代理地址是本机开启的代理服务监听端口,如果代理服务在局域网内的其它机器上的话,需要更换为其 ip 地址和端口号。环境变量 NO_PROXY 表示不使用代理的域名或IP。
重启 docker 服务
root@ubuntu:~# systemctl daemon-reload root@ubuntu:~# systemctl restart docker
验证设置
root@ubuntu:~# systemctl show --property=Environment docker Environment=HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890 ALL_PROXY=socks5://127.0.0.1:7890 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp,.docker.io,.docker.com
也可以使用命令 docker info 验证
root@ubuntu:~# docker info ... Debug Mode: false HTTP Proxy: http://127.0.0.1:7890 HTTPS Proxy: http://127.0.0.1:7890 No Proxy: localhost,127.0.0.1,docker-registry.example.com,.corp,.docker.io,.docker.com ...
拉取镜像
root@ubuntu:~# docker pull gcr.io/google_containers/pause-amd64:3.0 3.0: Pulling from google_containers/pause-amd64 a3ed95caeb02: Pull complete f11233434377: Pull complete Digest: sha256:163ac025575b775d1c0f9bf0bdd0f086883171eb475b5068e7defa4ca9e76516 Status: Downloaded newer image for gcr.io/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
此时使用命令 docker images 命令查看,会看到镜像下载成功,大小为747K。
中转方法
对于中转方法这里推荐使用 https://labs.play-with-docker.com,国内用户可以直接访问。方法比较简单,这里只给出几个用到的命令,不再详细介绍。
首先拉取镜像到本地,然后用docker tag 命令修改标签,并上传到 hub.docker.com 的个人账号仓库下
# docker pull gcr.io/google_containers/pause-amd64:3.0 # docker tag gcr.io/google_containers/pause-amd64:3.0 cfanbo/gcr.io_google_containers_pause-amd64:3.0 # 登录 hub.docker.log # docker login # docker push cfanbo/gcr.io_google_containers_pause-amd64:3.0
本地从 hub.docker.com 拉取镜像, 再改为原来的名称+标签名
# docker pull cfanbo/gcr.io_google_containers_pause-amd64:3.0 # docker tag cfanbo/gcr.io_google_containers_pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
此时镜像已经拉取成功,当前本地存在两个完全一样的镜像,可以将原来使用的临时中转镜像删除。