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.conf
nameserver 114.114.114.114
nameserver 1.1.1.1
/etc/hosts
52.206.192.146 registry-1.docker.io
dockerd
后仍不生效# 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:8118
dockerd
后镜像正常拉取# systemctl daemon-reload
# systemctl restart docker.service
生效
问题是解决了,但原因很值得分析。考验的是大家对Linux系统理解的是否扎实。
Docker架构
如图为Docker
的架构,需要关注的是:
Docker
是C/S
架构。即Server
端是以Daemon
方式运行在后台,Client
无非Daemon
Dockerd
所有的操作都是由docker-cli
发起,两者所有的交互由以API
接口的方式通信Linux
系统结构可知, docker-cli
运行在shell
环境下。那么Dockerd
服务进程也运行是shell
环境下吗?显然不是的!
看下图可知, dockerd
的父进程是systemd
。其实不尽然,在系统引导结束后,systemd
其实是所有服务的父进程 .
systemd
system start
从网上扒了一张图,具体启动流程这里不再赘述。有兴趣的朋友自行研究。