前几天还好好的,这两天拉取docker镜像的时候发现一直无法拉取了,应该是进了GFW了,整理一下如何正常拉取镜像。
基本原理 {#基本原理}
Docker是一种容器实现方式,巴拉巴拉,这里不细说了,其采用的C/S架构,其中
- 客户端:命令行工具,负责与服务器通信。
- 服务端: docker服务( docker daemon),承担创建、运行和下载容器镜像服务
所以这里如果处理无法拉取镜像的问题,即需要配置服务端,让其能够正常拉取。
Docker守护程序在其启动环境中使用以下环境变量来配置HTTP或HTTPS代理行为:
- HTTP_PROXY
- http_proxy
- HTTPS_PROXY
- https_proxy
- NO_PROXY
- no_proxy
处理方式 {#处理方式}
默认代理模式添加
创建一个systemd插件目录docker服务:
sudo mkdir -p /etc/systemd/system/docker.service.d
</code>
</pre>
创建/etc/systemd/system/docker.service.d/http-proxy.conf文件,增加了HTTP_PROXY环境变量:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
</code>
</pre>
如果使用HTTPS代理服务器,配置HTTPS_PROXY环境变量:
[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:3129"
</code>
</pre>
或者按需配置多个环境变量:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=https://proxy.example.com:3129"
</code>
</pre>
如果代理路径中需要使用特殊字符包括 ` #?!()[]{} ` 需要进行转义处理。
例如:
[Service]
Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%
23pass@proxy.example.com
:3128/"
</code>
</pre>
如果有不需要代理的地址,可以通过NO_PROXY环境变量说明。
NO_PROXY变量指定一个字符串,该字符串包含应从代理中排除的主机的逗号分隔值。您可以指定以下选项来排除主机:
* IP地址前缀(1.2.3.4)
* 域名或特殊的DNS标签(*)
* 域名匹配该名称和所有子域。以"."开头的域名仅匹配子域。例如,给定域foo.example.com和example.com:
* example.com比赛example.com和foo.example.com,以及
* .example.com仅匹配foo.example.com
* 一个星号(*)表示不应进行任何代理
* IP地址前缀(1.2.3.4:80)和域名(foo.example.com:80)
例如:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=https://proxy.example.com:3129"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
</code>
</pre>
刷新配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
</code>
</pre>
验证配置是否已加载
sudo systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
</code>
</pre>
在Docker引擎版本23.0和更高版本中,可以在daemon.json文件修改,修改方式如下:
{
"proxies": {
"http-proxy": "http://proxy.example.com",
"https-proxy": "https://proxy.example.com",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
</code>
</pre>
这些配置会覆盖默认配置。