专栏首页运维部落Linux 系统代理魔法对 Docker 无效?

Linux 系统代理魔法对 Docker 无效?

  • 问题场景重现
    • 怀疑镜像慢拉取超时
    • 怀疑系统代理不生效
  • 问题分析
    • Docker 底层工作原理
    • 额外:CentOS 7系统引导过程

Linux 系统代理魔法对 Docker 无效?

  • 一句话回答问题:

Linux所谓的系统代理是针对系统使用者,通过SHELL转化用户请求为系统可识别,完成网络出口的系统转发。Docker基于C/S架构运行,Server端由Systemd维护管理,Clientdaemon方式运行,所有请求以API方式,通过SHELL环境,转由Server接收执行命令并返回结果给Client。因此,系统代理魔法对 Docker 无效。换句话讲,凡由非SHELL运行的服务,环境变量均无效。需在进程本身配置代码或其父进程systemdsysv配置生效。

希望深入了解请继续

问题场景重现

新部署的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"]
}
  • 办法二:修改dns解析 /etc/resolv.conf
nameserver 114.114.114.114
nameserver 1.1.1.1
  • 办法三:修改 /etc/hosts
52.206.192.146 registry-1.docker.io
  • 热加载systemd,重启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
  • 热加载systemd,重启dockerd后镜像正常拉取
# systemctl daemon-reload
# systemctl restart docker.service

生效

问题是解决了,但原因很值得分析。考验的是大家对Linux系统理解的是否扎实。

问题分析

Docker 底层工作原理

Docker架构

如图为Docker的架构,需要关注的是:

  1. DockerC/S架构。即Server端是以Daemon方式运行在后台,Client无非Daemon
  2. Dockerd所有的操作都是由docker-cli发起,两者所有的交互由以API接口的方式通信
  3. Linux系统结构可知, docker-cli运行在shell环境下。

那么Dockerd服务进程也运行是shell环境下吗?显然不是的!

看下图可知, dockerd的父进程是systemd。其实不尽然,在系统引导结束后,systemd其实是所有服务的父进程 .

systemd

额外:CentOS 7系统引导过程

system start

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

本文分享自微信公众号 - 运维部落(linux178),作者:松鼠尚学堂

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker镜像竟然也是容器?!Docker 到底为什么这么快!?

    Docker虚拟化技术是基于容器化,容器化技术的本质其实是基于内核资源调度的再分配! 并不是什么新技术,只是近年Linux内核更加成熟,在资源调度隔离更成熟,所...

    运维部落
  • Docker 入门手册

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

    运维部落
  • 为什么Github上找不到Docker的源码

    Docker最初是dotCloud公司Solomon Hykes在法国期间发起的一个公司内部项目。2013.3月以 Apache 2.0协议开源。

    运维部落
  • Docker|基础篇

    Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便...

    用户3467126
  • Docker实践之01-入门介绍

    镜像是由多层存储所构成,下载也是一层层的去下载,并非单一文件。 镜像的基础是底层AUFS的支持.

    2Simple
  • Docker入门教程 Part 3 Services

    本篇笔记是官方Get Started入门教程的Part3 Services,主要演示如何使用 docker-compose.yml 来定义应用服务,docker...

    twowinter
  • Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

    搜云库
  • Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

    搜云库
  • macos命令行启动docker服务

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • docker容器技术系列一:基本概念

    前言:从去年下半年开始,我们就尝试在使用docker部署生产应用,至现在已经有十多个项目使用了docker容器部署,docker为我们节约 了大量的服务器资源,...

    小小科

扫码关注云+社区

领取腾讯云代金券