目录
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)