利用代理拉取docker镜像
By admin
- 2 minutes read - 222 words在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。
这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 https://hub.docker.com。
代理方式
使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。如果是k8s环境的话,可能会使用到 containerd
运行时,这时可能还需要设置 crictl
配置,因此下面将分别介绍这个软件的配置方式。
如果k8s运行时,使用的是 Docker Engine ,则可以通过 docker 命令管理镜像;如果使用的是 containerd
运行时,则需要通过 crictl
命令管理镜像。
不同运行时需要不同的管理客户端,因此下面我们将一下针对这两个软件配置的不同代理配置。
如果使用的是
containerd
运行时,crictl 命令无法下载镜像的话,可能还需要配置一下 Docker 代理。
Docker 代理
主要原因是 docker 并不会使用它们,需要为 docker daemon 服务的设置代理才可以。
1. 设置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。
2. 重启 docker 服务
root@ubuntu:~# systemctl daemon-reload
root@ubuntu:~# systemctl restart docker
3. 验证设置
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
...
4. 拉取镜像
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。
Circtl 代理
k8s下载的镜像可以通过 crictl
命令查看,如果使用 docker 下载的镜像k8s是无法识别到的,只能通过crictl来管理k8s镜像。
1. 创建一个环境变量文件
sudo tee /etc/systemd/system/containerd.service.d/proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://your-proxy-server:port"
Environment="HTTPS_PROXY=http://your-proxy-server:port"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16"
EOF
2. 重新加载 systemd 配置
sudo systemctl daemon-reload
3. 重启 containerd 服务
sudo systemctl restart containerd
4. 验证设置
sudo systemctl show --property=Environment containerd
5. 尝试拉取镜像
sudo crictl pull docker.io/library/nginx:latest
中转方法
对于中转方法这里推荐使用 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
此时镜像已经拉取成功,当前本地存在两个完全一样的镜像,可以将原来使用的临时中转镜像删除。