当前位置: 首页 > news >正文

docker 设置代理以及配置镜像加速

为什么 proxychainsdocker 无效?

在使用 proxychains 尝试让 docker pull 通过代理拉取镜像时,常常发现代理并未生效,拉取速度依然很慢。其根本原因在于 Docker 的架构和 proxychains 的工作机制不兼容。以下是详细的底层原理分析:

  1. Docker 的运行机制

    • Docker 客户端通过命令行工具(如 docker pull)与 Docker Daemon 通信,后者负责实际的镜像拉取、推送等操作。
    • Docker Daemon 是一个独立的守护进程,通常由 systemd 管理,运行在宿主机上,而不是直接在用户终端环境中运行。
    • proxychains 是一个基于动态链接库(如 LD_PRELOAD)的代理工具,它通过拦截应用程序的网络请求来强制走代理。然而,proxychains 仅对直接运行在用户终端环境下的进程有效,无法影响 Docker Daemon 的网络行为。
  2. 为何 proxychains 不生效

    • 当执行 proxychains docker pull 时,proxychains 仅代理了 docker 客户端命令的网络请求,而 Docker Daemon 的实际网络操作(如拉取镜像)并未经过 proxychains 的拦截。
    • Docker Daemon 的网络请求由其自身的配置决定(如 HTTP_PROXY 环境变量或 daemon.json 设置),而非用户终端的环境变量。
    • 因此,proxychains 无法直接控制 Docker Daemon 的网络行为,导致 docker pull 不走代理。
  3. 解决思路

    • 要让 docker pull 使用代理,必须通过 Docker 自身的代理配置机制,设置 Docker Daemon 的环境变量。
    • 对于 docker builddocker run,需要分别配置容器构建或运行时的代理环境变量。
    • 如果需要使用 socks5 代理(如 proxychains 常用的代理类型),需将 socks5 转换为 http 代理(如通过 polipo),因为 Docker 目前仅支持 httphttpsftp 协议的代理。

国内镜像加速方案

在国内访问 Docker Hub 速度较慢时,可以通过配置镜像加速器来提升 docker pull 的速度。以下是具体步骤:

  1. 配置国内镜像加速器

    • 编辑 /etc/docker/daemon.json 文件,添加镜像加速地址:
      {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
      }
      
    • 其他可选的镜像加速服务包括:
      • 阿里云镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
      • DaoCloud 镜像:https://docs.daocloud.io/community/mirror/
    • 保存后重启 Docker 服务:
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  2. 注意事项

    • 2024 年 6 月以来,国内镜像站的稳定性可能存在波动,建议测试多个镜像地址,选择效果最佳的。
    • 如果镜像加速器不可用或速度不理想,可直接配置代理访问 Docker Hub。

设置 Docker 代理的几种方案

以下是针对 docker pulldocker pushdocker builddocker run 的代理设置方法,适用于 Docker 17.07 及以上版本。

1. 为 docker pulldocker push 设置代理

由于 docker pulldocker push 的网络请求由 Docker Daemon 直接处理,需通过 systemd 配置 Docker Daemon 的环境变量。

步骤

  1. 创建 systemd 配置文件目录:

    sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 创建代理配置文件:

    sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
    

    添加以下内容:

    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:8123"
    Environment="HTTPS_PROXY=http://127.0.0.1:8123"
    
    • 这里的 127.0.0.1:8123 是宿主机的 HTTP 代理地址和端口,需根据实际代理服务配置。
    • 如果使用 socks5 代理,需通过工具(如 polipo)将其转换为 HTTP 代理,参考:https://neucrack.com/p/275。
  3. 应用配置并重启 Docker 服务:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  4. 验证环境变量是否生效:

    sudo systemctl show --property=Environment docker
    

    输出应包含配置的 HTTP_PROXYHTTPS_PROXY 变量。

注意

  • 代理设置仅对 Docker Daemon 的网络请求生效(如 docker pulldocker push)。
  • 如果代理地址发生变化,需重新编辑配置文件并重启服务。
  • 确认代理服务支持 httphttps 协议,Docker 不支持直接使用 socks5

2. 为 docker build 设置代理

docker build 的代理设置需要在构建镜像时通过 --build-arg 参数传递代理环境变量。

方法

  1. 使用 --build-arg 参数指定代理:

    docker build --build-arg http_proxy=http://172.17.0.1:8123 \--build-arg https_proxy=http://172.17.0.1:8123 \-t image_name .
    
    • 默认情况下,Docker 使用 bridge 网络模式,容器无法直接访问宿主机的 127.0.0.1。因此,需使用 Docker 默认网桥 docker0 的 IP 地址(通常为 172.17.0.1)。
    • 确认代理地址是宿主机上的 HTTP 代理服务地址。
  2. 使用 --network=host 模式:

    • 如果在构建时指定 --network=host,容器将与宿主机共享网络,可直接使用 127.0.0.1
      docker build --network=host \--build-arg http_proxy=http://127.0.0.1:8123 \--build-arg https_proxy=http://127.0.0.1:8123 \-t image_name .
      

注意

  • 代理设置仅在构建过程中生效,构建完成的镜像不会自动继承这些环境变量。
  • 如果 Dockerfile 中需要访问外部网络(如下载依赖),需确保代理地址有效。

3. 为 docker run 设置代理(全局配置方式)

Docker 17.07 及以上版本支持通过 ~/.docker/config.json 配置全局代理,适用于 docker builddocker run 创建的容器。

步骤

  1. 编辑 ~/.docker/config.json

    vim ~/.docker/config.json
    

    添加以下内容:

    {"proxies": {"default": {"httpProxy": "http://172.17.0.1:8123","httpsProxy": "http://172.17.0.1:8123","noProxy": "localhost,127.0.0.1,.daocloud.io"}}
    }
    
    • httpProxyhttpsProxy:指定代理地址,默认网桥模式下使用 172.17.0.1
    • noProxy:设置不需要走代理的地址,防止本地通信被代理拦截。
  2. 生效方式

    • 配置保存后,Docker 会自动应用代理设置到新创建的容器,无需重启服务。
    • 新创建的容器会继承 http_proxyhttps_proxyno_proxy 环境变量。

注意

  • 如果容器无需使用代理,可在容器内清空环境变量:
    export http_proxy=""
    export https_proxy=""
    
  • 一旦 config.json 存在,所有新创建的容器都会默认使用配置的代理。若需禁用代理,可临时重命名或删除 config.json
  • 容器创建时的代理设置会被“固化”到容器中,即使后续修改 config.json,已有容器的代理设置不会改变。

4. 容器内使用宿主机代理的多种方法

以下方法适用于在容器运行时(docker run)使用宿主机的代理服务。

方法一:在容器内手动设置代理(推荐)
  • 在容器内设置环境变量:
    export ALL_PROXY="socks5://172.17.0.1:1080"
    
    • 使用 172.17.0.1 访问宿主机的代理服务(默认 bridge 模式)。
    • 如果代理是 socks5,需确保容器内的工具支持 socks5 协议,或通过 polipo 转换为 HTTP 代理。
方法二:使用 --network=host 共享宿主机网络
  • 创建容器时使用 --network=host
    docker run --network=host -it image_name bash
    
  • 在容器内设置代理:
    export ALL_PROXY="socks5://127.0.0.1:1080"
    
  • 注意--network=host 会使容器与宿主机共享网络,-p 端口映射参数将失效,所有端口直接暴露。
方法三:映射代理端口
  • 创建容器时映射宿主机的代理端口:
    docker run -p 1080:1080 -it image_name bash
    
  • 在容器内设置代理:
    export ALL_PROXY="socks5://127.0.0.1:1080"
    
  • 适用于需要精确控制端口映射的场景。
方法四:通过全局代理配置(参考第 3 节)
  • 使用 ~/.docker/config.json 配置全局代理,容器创建时会自动继承代理环境变量。
  • 注意:全局代理与 --network=host 不建议同时使用,可能导致网络配置冲突。

注意事项与常见问题

  1. 协议支持

    • Docker 目前仅支持 httphttpsftp 协议的代理,不支持 socks5。如需使用 socks5,可通过 polipo 转换为 HTTP 代理(参考:https://neucrack.com/p/275)。
    • 未来 Docker 可能支持更多协议,建议参考官方文档:https://docs.docker.com/network/proxy/。
  2. IP 地址选择

    • 默认 bridge 模式下,容器访问宿主机代理需使用 docker0 网桥的 IP(如 172.17.0.1)。
    • 使用 --network=host 模式时,可直接使用 127.0.0.1
  3. 代理配置的持久性

    • 全局代理配置(config.json)会影响所有新创建的容器,需谨慎管理。
    • 容器创建后,代理环境变量会被“固化”。若需更改,需在容器内手动重新设置。
  4. 调试代理问题

    • 检查 Docker Daemon 的环境变量:sudo systemctl show --property=Environment docker
    • 验证容器内的代理设置:env | grep -i proxy
    • 确保代理服务正常运行,且端口未被防火墙拦截。

总结

  • 为什么不用 proxychainsproxychains 无法代理 Docker Daemon 的网络请求,需通过 Docker 自身的机制设置代理。
  • 国内镜像加速:简单有效,但稳定性可能受限。
  • 代理设置方案
    • docker pull/push:通过 systemd 配置 Docker Daemon 的代理。
    • docker build:通过 --build-arg--network=host 设置代理。
    • docker run:通过全局配置(config.json)或容器内手动设置代理。
  • 推荐做法:优先使用国内镜像加速器;若需代理,推荐全局配置(config.json)或手动设置环境变量,灵活性更高。

如需更多细节,请参考 Docker 官方文档:https://docs.docker.com/network/proxy/ 或这篇文章:https://neucrack.com/p/286。

http://www.dtcms.com/a/277178.html

相关文章:

  • 【C++】优先队列简介与模拟实现 + 仿函数
  • Matplotlib(一)- 数据可视化与Matplotlib
  • 关于数据库的慢查询
  • python3的可变参数如何传递元组和字典
  • 一文讲懂填充与步幅
  • 《Google 软件工程》:如何写好文档?
  • 3. 【Blazor全栈开发实战指南】--Blazor是什么?为什么选择Blazor?
  • 在AI应用中Prompt撰写重要却难掌握,‘理解模型与行业知识是关键’:提升迫在眉睫
  • 【读书笔记】《Effective Modern C++》第4章 Smart Pointers
  • Node.js 聊天内容加密解密实战教程(含缓存密钥优化)
  • 4. 关于CEF3 使用的一些记录及仓颉端封装的情况
  • 手写muduo笔记
  • package.json 与 package-lock.json
  • 笔记/sklearn中的数据划分方法
  • 流程控制:从基础结构到跨语言实践与优化
  • 博客项目 laravel vue mysql 第五章 标签功能
  • 前端性能优化利器:懒加载技术原理与最佳实践
  • JAVA JVM虚拟线程
  • 第三章-提示词-解锁Prompt提示词工程核销逻辑,开启高效AI交互(10/36)
  • Vue3 Diff 算法片段解析:新旧节点队列之乱序比对与更新策略
  • 7月13日星期日今日早报简报微语报早读
  • Python PyWhat详解:一款高效的数据类型识别与扫描工具
  • 把固态电池当“显卡”用:基于Li⁺迁移率的矩阵乘法加速器——电解质-权重共设计框架与FP8训练实战
  • C++--List的模拟实现
  • 深入解析Hadoop RPC:技术细节与推广应用
  • vue3 ref vs reactive值的修改
  • 自动润滑系统:从 “盲目养护“ 到智能精注的工业运维革命
  • 【芯片笔记】ADF4159
  • 详解Linux下多进程与多线程通信(一)
  • python:使用openpyxl库,实现excel表格的创建、查询(读取)、修改、插入数据