CentOS7 下 Docker 配置代理以解决国内服务器无法拉取官方镜像的问题(需要账号密码的代理也可使用)

国内服务器访问不到各种官方镜像应该是老生常谈的问题了,Docker 也不例外,拉取官方镜像时各种 EOF 错误大概率就是墙的问题了,这篇文档不会记录 Linux 整体环境代理的配置方法,只会配置 Docker 的。


1、首先确定你的代理可以被稳定访问:

# 相关参数自行替换,如果不需要认证信息可以直接跳到第 2 步
# HTTP 代理
curl -x http://$username:[email protected]$host:$port http://ip-api.com/json/?lang=zh-CN
# SOCKS5 代理 
curl -x socks5://$username:[email protected]$host:$port http://ip-api.com/json/?lang=zh-CN

如果你的代理需要认证信息,那么是不能直接被配置到 Docker 的配置文件中的,如果强行配置的话,运行时会出现以下信息:
cuowu
光从代理打码长度也能看到根本没有使用账号密码去访问代理。
你需要做的是使用 GOST 做转发,在本地搭建一个无需账号密码的长久代理:

# 从我的 Gitee 仓库下载 GOST 压缩包
curl -s https://gitee.com/senjianlu/one-click-scripts/raw/main/CentOS7%20%E4%B8%8B%E4%B8%8B%E8%BD%BD%20Gitee%20%E8%B6%85%E8%BF%87%201%20MB%20%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%96%87%E4%BB%B6/download.sh | bash -s https://gitee.com/senjianlu/one-click-scripts/raw/main/mirror/GOST/gost-linux-amd64-2.11.1.gz
# 解压
gunzip gost-linux-amd64-2.11.1.gz
# 转移到 /usr/bin 使其在任意目录都可执行
mv gost-linux-amd64-2.11.1 /usr/bin/gost
chmod 777 /usr/bin/gost
# 开启开机自启动,本地端口和代理信息自行替换
echo "@reboot gost -L :$local_port -F=socks5://$username:[email protected]$host:$port" >> /var/spool/cron/root
service crond restart
# nohup 启动在后台
nohup gost -L :$local_port -F=socks5://$username:[email protected]$host:$port >/dev/null 2>&1 &

接着测试本地代理是否正常,和最上面的测试方法一样,不过不需要账号密码了。

curl -x socks5://127.0.0.1:$local_port http://ip-api.com/json/?lang=zh-CN

2、配置 Docker 代理。
参照文档:Control Docker with systemd
此方法配置的代理对 Docker 长久有效,如果你的代理失效了及时修改 GOST 的转发配置即可。

# 为 Docker 服务创建一个内嵌的 systemd 目录
mkdir -p /etc/systemd/system/docker.service.d

创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件,

vi /etc/systemd/system/docker.service.d/http-proxy.conf

文件内容如下,只需要这 3 行即可:

[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:$local_port"
Environment="HTTPS_PROXY=socks5://127.0.0.1:$local_port"

然后重新加载配置,确定下代理配置没问题后重启即可。

# 重新加载配置
systemctl daemon-reload
# 查看配置是否生效
systemctl show --property=Environment docker
# 无误后重启
systemctl restart docker

然后就去 Pull 你的镜像吧!