Docker pull 使用代理
debuff 叠满, 折腾好几天了
docker pull 用的是一个守护进程, 所以设置系统代理是无效的. 需要配置 service 的代理. 配置文件一般来说在 /etc/systemd/system/
下新建 docker.service.d/proxy.conf
. 由于我是 rootless docker, 所以在用户级别的 systemd 上, 应该是 ~/.config/systemd/user/docker.service.d/proxy.conf
.
内容应该类似如下:
[Service]
Environment="HTTPS_PROXY=https://example.com:443"
Environment="HTTP_PROXY=http5://example.com:80"
Environment="ALL_PROXY=socks5://example.com:1080"
Environment="NO_PROXY=example.com"
但是使用各种代理客户端监听的本地端口 (如 127.0.0.1:10808) 都说连不上.
后来发现我的 naive 使用的代理长这样: https://user:passwd@host:port
, 于是试了试这个的地址, 成了, 但没完全成. naive 只有 https 的, 没有 http 代理, 报错是说有 http 请求, 不能用 https 代理. 尝试找了找如何开启一个 http 代理, 无果.
之后查阅资料发现可以用 ssh 隧道使用 socks 代理, 尝试了一下发现服务器的 ssh 连不上 (我这种情况还挺常见的, 当时的解决办法是写 ~/.ssh/config
, 使用代理连, 绕地球一圈!), 检查了 ssh 的配置文件是有设置的, 很奇怪, 好像 ssh 转发就不去找配置了, 不知道为什么.
最后直接在命令里写通过代理, 终于给连上了.
整个链大概长这样:
debuff 叠满, 哪一环都不能少, 乐死.
最后步骤如下:
- 本地 socks 代理, 监听端口 socks_port
ssh -D $listen_port user@host -o ProxyCommand="nc -x localhost:$socks_port %h %p"
通过代理起一个 ssh 隧道, 监听本地端口 listen_port.- docker daemon 配置代理:
[Service]
Environment="HTTPS_PROXY=socks5://localhost:$listen_port"
Environment="HTTP_PROXY=socks5://localhost:$listen_port"
Environment="ALL_PROXY=socks5://localhost:$listen_port"
systemctl [--user] daemon-reload && systemctl [--user] restart docker.service
重启 docker daemon.