Linux所谓的系统代理是针对系统使用者,通过SHELL转化用户请求为系统可识别,完成网络出口的系统转发。Docker基于C/S架构运行,Server端由Systemd维护管理,Client非daemon方式运行,所有请求以API方式,通过SHELL环境,转由Server接收执行命令并返回结果给Client。因此,系统代理魔法对 Docker 无效。换句话讲,凡由非SHELL运行的服务,环境变量均无效。需在进程本身配置代码或其父进程systemd或sysv配置生效。
希望深入了解请继续
新部署的docker环境拉取镜像时总报错 registry-1.docker.io timeout
# docker run nginx
Unable to find image 'nginx:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).尝试了如下办法依然没有解决:
/etc/docker/daemon.json{
"registry-mirrors": ["https://registry.docker-cn.com"]
}/etc/resolv.confnameserver 114.114.114.114
nameserver 1.1.1.1/etc/hosts52.206.192.146 registry-1.docker.iodockerd后仍不生效# systemctl daemon-reload
# systemctl restart docker.service
无效
docker服务添加代理/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment=http_proxy=http://proxyip:8118 https_proxy=http://proxyip:8118dockerd后镜像正常拉取# systemctl daemon-reload
# systemctl restart docker.service
生效
问题是解决了,但原因很值得分析。考验的是大家对Linux系统理解的是否扎实。

Docker架构
如图为Docker的架构,需要关注的是:
Docker 是C/S架构。即Server端是以Daemon方式运行在后台,Client无非DaemonDockerd所有的操作都是由docker-cli发起,两者所有的交互由以API接口的方式通信Linux系统结构可知, docker-cli运行在shell环境下。那么Dockerd服务进程也运行是shell环境下吗?显然不是的!
看下图可知, dockerd的父进程是systemd。其实不尽然,在系统引导结束后,systemd其实是所有服务的父进程 .

systemd

system start
从网上扒了一张图,具体启动流程这里不再赘述。有兴趣的朋友自行研究。