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

Felier. 2024-06-28 08:07:04 阅读 69

目录

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:password@10.70.80.900:8080/

Environment=HTTPS_PROXY=http://user:password@10.70.80.900: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)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。