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 转发就不去找配置了, 不知道为什么.

最后直接在命令里写通过代理, 终于给连上了.

整个链大概长这样:

d o c k e r d a e m o n s s h n a i v e c a d d y s s h d d o c k e r r e p o s i t o r y

debuff 叠满, 哪一环都不能少, 乐死.

最后步骤如下:

  1. 本地 socks 代理, 监听端口 socks_port
  2. ssh -D $listen_port user@host -o ProxyCommand="nc -x localhost:$socks_port %h %p" 通过代理起一个 ssh 隧道, 监听本地端口 listen_port.
  3. docker daemon 配置代理:
    [Service]
    Environment="HTTPS_PROXY=socks5://localhost:$listen_port"
    Environment="HTTP_PROXY=socks5://localhost:$listen_port"
    Environment="ALL_PROXY=socks5://localhost:$listen_port"
  1. systemctl [--user] daemon-reload && systemctl [--user] restart docker.service 重启 docker daemon.