在国内服务器环境中,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
实战访问谷歌
✅ 总结
- 使用 SSH 反向代理是一种优雅的方式让远程服务器共享你本地的网络环境。
- Docker 拉镜像失败时,不一定是网络问题,也可能是版本标签不对。
- Docker daemon 不继承 shell 代理,要专门配置。
- 配置代理后,记得在不用时及时清除。