近期出现 docker pull 无法正常拉取镜像的解决方案

最近因为不明原因,在 Unraid 系统的应用商店拉取 docker 镜像时经常出现 Timeout 的情况。不出意外可能是被墙或者镜像源出问题了。

解决方法有三种

  1. 用插件 Proxy Editor 开启全局代理,保证 dockerd 进程走的是代理。但是全局代理可能会影响其他进程。加上我的服务器不在身边,一旦全局代理配置时出现问题,可能无法外网访问,风险太大。
  2. 结合旁路由规划 docker 容器和 unraid 网络进行代理分流
  3. 单独给 dockerd 加个代理,这样拉镜像docker pull就走这个代理了,不会影响其他容器网络

经过实践,方法 3 能够解决我的问题。

首先,unraid docker 启动脚本位置在 /usr/local/etc/rc.d/rc.docker在webui上的docker 操作都会调用这个 shell 脚本。如果为此脚本配置代理,即可保证启动 docker 服务时,dockerd 进程是走代理的。

具体实现如下,用文本编辑器(如 vi)打开 /usr/local/etc/rc.d/rc.docker,在大约 531 行处有这么一句启动命令

nohup $UNSHARE --propagation slave -- $DOCKER -p $DOCKER_PIDFILE $DOCKER_OPTS >>$DOCKER_LOG 2>&1 &

可以添加参数 env 来指定代理。例如我在服务器所在的内网中有一台 PC,IP 地址为 192.168.1.174,其上运行了 Clash,端口为 7890,则上面的启动命令改为

nohup env https_proxy=http://192.168.1.174 http_proxy=http://192.168.1.174 $UNSHARE --propagation slave -- $DOCKER -p $DOCKER_PIDFILE $DOCKER_OPTS >>$DOCKER_LOG 2>&1 &

保存后,在 Unraid 的 Web UI 中打开 Setting-Docker-Enable Docker 处,先关掉,Apply,再打开,Apply 来重启 Docker 服务,即可正常 pull 镜像


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注