远程服务器拉 Docker 镜像太难?试试这个超稳的远程代理通道!

开发与运维容器服务

在国内服务器环境中,Docker 拉镜像常常因为网络限制而失败,特别是像 Redis Stack 这种镜像。虽然可以本地配置代理,但远程服务器怎么办?本文结合实际案例,讲解如何通过 SSH 建立 远程代理通道,让远程服务器也能走本地的代理访问外网,从而成功拉取镜像。并分享踩坑过程、Docker 代理配置技巧,以及 Redis Stack 镜像版本选择问题。

👋 前言

某天,我在一台云服务器上拉一个 Redis Stack 镜像:

docker pull redis/redis-stack-server:6.2.6

然后就卡……卡……卡……

折腾了半天 proxychains、curl 都通,就是 Docker 不行。

然后就是一直报错:✘ redis Error Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers... 85.2s

后来我灵光一现:能不能让服务器用我本地的代理?

答案是:可以,而且非常好用——只要你掌握 SSH 的一个冷门但强大的功能:反向代理通道

🚧 1. 问题背景

  • 国内服务器访问 Docker Hub 网络不稳定
  • curl、proxychains 有时可用,但 Docker daemon 不走你 shell 的代理配置
  • 想通过本地代理科学上网拉镜像

🌉 2. 方案核心:用 SSH 建立远程代理通道

2.1 什么是 SSH 反向隧道

SSH 的 -R 参数允许你把「本地的端口」暴露给「远程服务器」用,起到反向代理的效果。

2.2 实际命令

你执行的命令:

ssh -N -R 1081:127.0.0.1:7890 root@115.120.221.105

说明:

  • 本地代理运行在 127.0.0.1:7890(一些工具----等)
  • 将它映射给服务器的 127.0.0.1:1081
  • -N 表示不执行命令,只建立通道
  • -R 表示远程端口转发到本地

服务器上就可以这样访问你的代理了:

curl -x socks5h://127.0.0.1:1081 https://api.ipify.org

✅ 说明代理已生效!

⚙️ 3. 配置 Docker 守护进程使用代理

Docker 默认不使用 shell 的代理变量,需要手动设置:

3.1 创建配置目录和文件

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

3.2 文件内容如下

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1081"
Environment="HTTPS_PROXY=http://127.0.0.1:1081"
Environment="NO_PROXY=localhost,127.0.0.1"

3.3 重启 Docker

sudo systemctl daemon-reload
sudo systemctl restart docker

3.4 验证代理是否生效

sudo systemctl show --property=Environment docker

🔁 4. 关闭代理后的注意事项

如果你断开了代理(或本地没开),Docker 会继续尝试走这个不可用的代理地址,导致拉取失败。比如下面的:

✅ 正确做法:

sudo rm /etc/systemd/system/docker.service.d/http-proxy.conf
sudo systemctl daemon-reload
sudo systemctl restart docker

或者注释掉配置文件中的内容。

🧠 5. Bonus:自动切换代理脚本(建议)

开启代理脚本:

#!/bin/bash
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1081"
Environment="HTTPS_PROXY=http://127.0.0.1:1081"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

关闭代理脚本:

#!/bin/bash
sudo rm -f /etc/systemd/system/docker.service.d/http-proxy.conf
sudo systemctl daemon-reload
sudo systemctl restart docker

实战访问谷歌

picture.image

✅ 总结

  • 使用 SSH 反向代理是一种优雅的方式让远程服务器共享你本地的网络环境。
  • Docker 拉镜像失败时,不一定是网络问题,也可能是版本标签不对。
  • Docker daemon 不继承 shell 代理,要专门配置。
  • 配置代理后,记得在不用时及时清除。
0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 GPU Scale-up 互联技术白皮书
近日,字节跳动正式发布基于以太网极致优化的 GPU Scale-up 互联技术白皮书,推出 EthLink 的创新网络方案,旨在为 AI 集群提供低延迟、高带宽的高速互联传输,满足 AI 应用对 GPU 之间高效通信的需求。这一举措标志着字节跳动在 AI 基础设施领域的突破,有望推动通用人工智能(AGI)和大语言模型(LLM)的进一步发展。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论