当前位置:   article > 正文

docker设置代理解决内网pull外网镜像_docker pull 代理

docker pull 代理

目录

Docker 配置代理的缘由

通过dockerd配置实现代理

通过container配置实现代理

参考文献


Docker 配置代理的缘由

        如何在内网环境内环境内Pull外网registry,或者反过来想要Pull公司Registry镜像?存在上述需求的朋友可以尝试以下方法进行docker代理配置。其中配置dockerd代理的方式遇到了些坑,即解决了通过配置文件docker.service.d/http-proxy.conf代理无效的问题。先来回顾下docker的架构设计。

        Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境Docker基于客户端-服务器架构,客户端与 Docker 守护进程通信,服务端负责构建、运行和分发Docker容器等繁重的工作。Docker 客户端和守护进程可以运行在同一个系统上,也可以连接到一个远程 Docker 守护进程。两者通过 UNIX 套接字或网络接口使用 REST API 进行通信。【以上引自:Docker简要教程 - 知乎 (zhihu.com)

        综上,docker配置网络代理需要在其守护进程dockerd的启动环境中,而无法通过操作系统本身的环境变量实现代理配置。下述主要介绍两种方法实现docker代理。

通过dockerd配置实现代理

  目前常见的方法是通过systemd service设置docker代理,具体步骤如下:

  1. # 创建/etc/systemd/system/docker.service.d路径
  2. sudo mkdir -p /etc/systemd/system/docker.service.d
  3. # 创建 http-proxy.conf
  4. sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
  5. # 写入配置
  6. vim /etc/systemd/system/docker.service.d/http-proxy.conf
  7. # 粘贴下方配置代理并wq退出
  8. [Service]
  9. Environment="HTTP_PROXY=http://proxy.example.com:8080/"
  10. Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
  11. Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

  配置完成后需要重启docker服务以使其生效:

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart docker

  问题是我这样设置后代理并未成功,经过如下设置后才配置成功:

  1. # edit config file
  2. cd /lib/systemd/system && sudo vim docker.service
  3. # add proxy setting
  4. Environment=HTTP_PROXY=http://user:password@10.70.80.900:8080/
  5. Environment=HTTPS_PROXY=http://user:password@10.70.80.900:8080/
  6. Environment=NO_PROXY=localhost, 127.0.0.1, ::1, 10.9*

        前面配置未生效的原因不确定,分析原因可能和systemd的配置文件相关,但理论上通过/etc/systemd/system的配置优先级高会覆盖/lib/systemd/system,但事实并未覆盖。小弟Linux系统了解比较浅,下方引用了systemd的参考文献,这个问题可供大家一起探讨。

        在一般的使用场景下,每一个 Unit(服务等) 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。systemd 的使用大幅提高了系统服务的运行效率, 而 unit 的文件位置一般主要有三个目录:

  • /lib/systemd/system
  • /run/systemd/system
  • /etc/systemd/system

        这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。​​​​​​​系统安装时,默认会将 unit 文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:

  • /etc/systemd/system目录下创建nginx.service文件,写入
  • /etc/systemd/system​​​​​​​下面创建nginx.service.d目录,在目录里创建.conf 文件写入配置

    块引自:/etc/systemd/system 和 /lib/systemd/system 的区别 - 知乎 (zhihu.com)

通过container配置实现代理

  相当于在启动的container内设置环境变量,最简单的方法是在创建容器时添加环境变量env:

docker run -d --env HTTP_PROXY="http://user:psd@ip:port" --env HTTPS_PROXY="http://user:psd@ip:port" --name test_container image:v0.0.1

  另个方法是配置~/.docker/config.json文件:

  1. # cat ~/.docker/config.json
  2. {
  3. "proxies":
  4. {
  5. "default":
  6. {
  7. "httpProxy": "http://127.0.0.1:7890",
  8. "httpsProxy": "http://127.0.0.1:7890",
  9. "noProxy": "localhost"
  10. }
  11. }
  12. }

   配置完成后需要重启docker服务以使其生效:

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart docker

参考文献

详解 Docker 的三种网络代理配置 - Roc's Blog (havemail.cn)

Docker 配置代理 - SnailRush - 博客园 (cnblogs.com)

Docker配置代理 - 码农教程 (manongjc.com)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/779126
推荐阅读
相关标签
  

闽ICP备14008679号