在日常开发中经常会用到docker镜像,最大的镜像仓库是 hub.docker.com,由于国内网络环境,目前已经无法拉取到这些镜像,这时候就需要我们想一些办法来实现拉取了。

2024-06-28 18:35:12 星期五

这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过 VPS 中转的方法,先找一个国外的 VPS 直接拉取到镜像,先将存储到VPS,然后再通过网络传输到本地。通过代理的方法比较简单直接。

podman 使用代理拉取镜像

export HTTP_PROXY=http://localhost:10808
export HTTPS_PROXY=http://localhost:10808

export http_proxy=http://127.0.0.1:10808
export https_proxy=http://127.0.0.1:10808

# 运行 podman 命令
podman pull <image>

Linux 中,环境变量是区分大小写的.

设置 socks5 代理不能拉取成功,用HTTP代理可以成功

docker 使用代理拉取镜像

docker 通过直接设置 http_proxyhttps_proxy 这两个环境变量是不可行的。主要原因是 docker 只是一个cli命令,传输指令给daemon,并不会负责拉取镜像,需要为 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。

尝试用proxychains

尝试用 proxychains 来拉取镜像,但是没有成功。

配置 proxychains

编辑配置文件 /etc/proxychains.conf,添加或修改以下内容:

# Dynamic chain
dynamic_chain

# Proxy DNS requests - no leak for DNS data
proxy_dns

# Types of proxies:
#        [ProxyList format]
#        type host port [user pass]
#        (values separated by 'tab' or 'blank space')

[ProxyList]
socks5 127.0.0.1 1080
使用 proxychains 运行应用程序

在命令前加上 proxychains 来确保该命令的所有网络流量通过代理:

例如:

proxychains curl http://example.com

发表评论