前言:当“换源”不再有效
最近很多同学在部署开源项目(如 DeepSeek-R1、Open WebUI)时,都被卡在了第一步:镜像拉取失败。
以往遇到 Time out,我们第一反应是“换个国内镜像源”(如阿里云、网易、道客云等)。但近期的情况大家也都清楚,国内大厂的 Docker 镜像源大多处于不可用或极其不稳定的状态。
如果你在日志中看到了类似下面的报错:
Error failed to resolve reference "docker.io/...": dial tcp 173.252.88.133:443: i/o timeout
且更换了镜像源依然无效,那么配置 Docker 守护进程(Daemon)走代理是目前唯一稳健的解决方案。
本文将演示如何在 Linux 环境下(适用于 CentOS/Ubuntu/Debian 及宝塔面板环境)为 Docker 配置全局代理。
误区提示
很多同学以为在终端执行 export http_proxy=... 就能让 Docker 走代理。
这是无效的!
因为 docker pull 的动作是由后台的 dockerd 守护进程执行的,终端的环境变量影响不到系统服务。我们需要修改 Systemd 的配置。
操作步骤
假设你的代理服务地址为:172.30.1.12:6310
(请根据你实际的局域网代理 IP 或本机代理端口修改此地址)
1. 创建 Docker 配置目录
Systemd 允许我们通过创建 .d 目录来覆盖或追加服务的默认配置,而无需修改主服务文件。
sudo mkdir -p /etc/systemd/system/docker.service.d2. 创建代理配置文件
在该目录下新建一个 http-proxy.conf 文件:
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf(如果你不习惯用 vim,也可以使用 nano 或者在宝塔面板的文件管理器中直接新建编辑)
3. 写入配置内容(核心)
将以下内容复制并粘贴到文件中。
注意:
- 请将
172.30.1.12:6310替换为你自己的代理地址。 NO_PROXY非常关键!它确保容器内部通信、本地回环地址不走代理。如果缺少这一行,可能会导致容器启动后连不上本地数据库。
[Service]
# HTTP 代理
Environment="HTTP_PROXY=http://172.30.1.12:6310"
# HTTPS 代理 (通常与 HTTP 保持一致即可)
Environment="HTTPS_PROXY=http://172.30.1.12:6310"
# 不走代理的地址 (重要!)
Environment="NO_PROXY=localhost,127.0.0.1,::1,.local,172.16.0.0/12,10.0.0.0/8,192.168.0.0/16"补充说明: 如果你的代理有账号密码,格式为:
http://username:password@ip:port
4. 重载配置并重启 Docker
保存文件后,需要通知 Systemd 重新加载配置,并重启 Docker 服务使更改生效。
# 1. 重载守护进程配置
sudo systemctl daemon-reload
# 2. 重启 Docker
sudo systemctl restart docker验证配置
配置完成后,怎么确认 Docker 真的挂上代理了呢?
执行以下命令:
docker info | grep -i proxy如果输出类似下方内容,说明配置成功:
HTTP Proxy: http://172.30.1.12:6310
HTTPS Proxy: http://172.30.1.12:6310
No Proxy: localhost,127.0.0.1,::1,.local...效果测试
现在,你可以回到命令行或宝塔面板中,重新尝试拉取刚才失败的镜像:
docker pull dyrnq/open-webui:main你会发现之前的 i/o timeout 消失了,进度条开始转动。
总结
在当前的网络环境下,为服务器配置一个稳定的出海代理是部署海外开源项目的必备技能。通过修改 systemd 配置,我们可以从根本上解决 Docker 拉取镜像超时的问题,彻底告别频繁寻找可用镜像源的烦恼。
希望这篇笔记能帮你节省排坑的时间!🚀
版权属于:soarli
本文链接:https://blog.soarli.top/archives/779.html
转载时须注明出处及本声明。