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代理,具体步骤如下:

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

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

sudo systemctl daemon-reload 
sudo systemctl restart docker

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

# edit config file
cd /lib/systemd/system && sudo vim docker.service
# add proxy setting
Environment=HTTP_PROXY=http://user:[email protected]:8080/
Environment=HTTPS_PROXY=http://user:[email protected]:8080/
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文件:

# cat ~/.docker/config.json
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:7890",
     "httpsProxy": "http://127.0.0.1:7890",
     "noProxy": "localhost"
   }
 }
}

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

sudo systemctl daemon-reload 
sudo systemctl restart docker

参考文献

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

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

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