一、 基本概念

首先,让我们回想,整个docker的安装流程,删除旧版本--》配置安装源--》安装依赖项--》安装docker --》注册成服务--》启动docker。这里我们学习下dockerder的基础框架

docker 采用CS架构,在宿主机器上,docker启用了一个服务端,也即docker的守护进程,服务端与客户端通过一个称为RESET API的网络组件交互,RESET API  基于 UNIX套接字或网络接口实现通讯。服务端接收client端的描述或者指令管理镜像、容器、网络及数据卷等对象,相对于client端,任务更多集中在服务端。docker的客户端和服务端可同时运行在同一设备上,也可运行在不同设备上,默认安装docker-ce / docker  会同时安装服务端和客户端,也可通过仅安装 client端,连接另外一个设备的docker daemon. 具体操作后续再介绍。

这是,docker官网上 docker框架 运行结构图 docker client  通过 RESET API 向docker daemon 发送指令操作进行,当服务端在本地找不到镜像时,服务器从远处仓库中,拉取镜像,然会保存到本地,根据请求实例化镜像或者创建新镜像。那么很多有人好奇,daemon 如何保存管理镜像,启动容器,那么这里需要关注下linux的devicemapper技术,后续有空跟上。

二、各模块详细介绍

2.1 docker daemon

   docker daemon,即docker服务端,通过查询可发现监听三个套接字

netstat -ano | grep docker
[root@localhost docker]# netstat -ano  |  grep docker
unix  2      [ ACC ]     STREAM     LISTENING     10264084 /var/run/docker.sock
unix  2      [ ACC ]     STREAM     LISTENING     10360721 /var/run/docker/metrics.sock
unix  2      [ ACC ]     STREAM     LISTENING     10344608 /run/docker/libnetwork/251d25ccbae459eda47b6edf98222dc34d19a7de94c7321345754082d7ef65e7.sock
[root@localhost docker]# 

/var/run/docker.sock 是daemon与容器通讯的套接字,端口是变化的,每次关闭、启动 端口会变化,

/var/run/docker/metrics.sock  用于收集各容器状态信息

/run/docker/libnetwork/.sock  是docker内部用来构建容器网络的

通过查询端口对应的进程我们发现该三个端口对应的启动进程都是 /usr/bin/dockerd

netstat -anp | grep 端口号

查询到具体的进程号后,再查询 启动程序

ps -aux | grep 进程号

例如

[root@localhost hadoop]# netstat -ano | grep docker
unix  2      [ ACC ]     STREAM     LISTENING     10264084 /var/run/docker.sock
unix  2      [ ACC ]     STREAM     LISTENING     10360721 /var/run/docker/metrics.sock
unix  2      [ ACC ]     STREAM     LISTENING     10344608 /run/docker/libnetwork/251d25ccbae459eda47b6edf98222dc34d19a7de94c7321345754082d7ef65e7.sock
[root@localhost hadoop]# netstat -anop | grep 10360721
unix  2      [ ACC ]     STREAM     LISTENING     10360721 5488/dockerd         /var/run/docker/metrics.sock
[root@localhost hadoop]# ps  -aux | grep 5488
root      5488  0.0  0.0 2463668 71660 ?       Ssl  10:33   0:08 /usr/bin/dockerd -H unix://
root     27808  0.0  0.0 112648   952 pts/1    S+   14:48   0:00 grep --color=auto 5488

docker daemon 接收 docker API(RESET API  实际上是docker client)的请求,操作docker对象(image container volume network),同时,docker daemon也可与其他daemon交互,协同完成docker服务。docker网络相关问题后续跟进。

2.2 docker cli

docker client 是 与docker服务端交互的客户端,当我们调用 docker run  / create pull 等操作指令时,docker client调用API请求daemon,  daemon 收到请求后,执行操作, 同一个了docker client 可连接不同宿主设备的daemon。

2.3 docker Registries

docker 注册仓库是用于存储docker镜像,例如Docker Hub 、 Docker Cloud 是免费公用镜像库,而且 docker默认在 Docker Hub上查找镜像(当本地未找到镜像时),同样,用户也即可建立私有库,存储镜像。

当用户调用 docker run /pull 时,镜像将被从指定的仓库中拉取下, 当调用 docker push 时,docker将本地镜像推送到指定服务器仓库中。 用户也可以在网络上购买、或者销售镜像,也可免费发布。

2.4 docker objects

在使用docker过程中,docker服务器会创建一些列的对象,这些对象包括镜像、容器、网络、数据卷、插件等。这里简单介绍下镜像、容器与服务。

2.4.1 镜像

镜像是 一个具有创建容器的指令的只读模板,简单理解成 一个可执行程序的基础运行环境,通常,镜像是基于一个基础镜像构建而成,例如我们基于的Centos7.5 镜像之上,添加apache web 服务,同时加上自己web程序及依赖库,新建一个新的镜像,那么利用该新建的镜像,创建容器,则可以运行自己的web程序。

我们将将新生成的镜像,和别人的镜像,构建自己的镜像库,同时,我们也可以通过dockerfile创建镜像,一般dockerfile开头文件内容指定基础镜像,然后后续每执行一条语句(RUN),新建一个只读层次,当修改dokerfile,重建镜像时,仅执行修改的那些层,大大增加镜像构建效率。本质上,镜像是多个重叠只读层的同一视角,下一层保存上一层地址。

2.4.2 容器

容器是镜像的实例,可通过调用 docker API 或者 docker cli 创建、停止、启动、删除容器,而且一个容器可以被关联到一个或者多个网络(每个容器之间网络是隔离的,与容器命名空间相关),同时,也可以保存一个容器实时状态(例如添加了一个软件,修改了某个文件,增加了配置等)提交为镜像。

容器可以很好地与其他容器或者宿主机器关联,使用者可控制容器的网络、存储、或者其他潜在的子系统,如何与其他容器、或者宿主机器的关联。这就是后续 docker engine关注的重点,例如kubernetes。

容器状态依赖创建时指定的镜像和启动时的配置参数,一旦容器清除,那么容器在运行过程的一切持久化过程消失。

2.4.3 SERVICES

services 允许用户发布容器到多个docker daemon上,多个docker daemon以集群方式工作,存在多个管理结点和工作结点,结点间通过docker API(前面提到的 RESET API)交互。一个服务在配置时,需要指定服务个数(即在某个结点上服务异常时,集群提供多少个同样服务可替换运行)如此,服务被均衡负载到各工作结点。此时 docker daemon只是一个简单的工作环境,供上层的引擎调度。在docker 1.12及之后版本,集群模块便加入其中。这也是docker  engine的核心点。

三、容器启动流程

docker run  -t -i  ubuntu  /bin/bash   语句执行过程

docker run -t -i ubuntu /bin/bash

上述语句,运行一个ubuntu容器,容器接收外部标准输入, 容器内的接收输入的程序为 /bin/bash, 如果需要查看更多参数可d调用docker run --help,每个参数均有解释。

(1) docker 首先检查,本地是否有名为 ubuntu的镜像,如果没有,docker daemon 将从指定的远程仓库拉取,默认远程仓库为Docker Hub, 而且,未指定具体版本情况下将默认获取最新的stable版。拉取镜像。此步骤 类似于手动调用 docker pull ubuntu

(2)docker 创建容器, 对应的 手动指令 docker container create

(3)docker关联一个可读写的文件系统给容器,并将该层作为容器的最后一层,运行用户运行自定义的应用程序,修改容器本地文件或者目录,但是注意,容器一旦通知,该层的数据将删除,不会保存到对应的镜像中。

(4) docker创建一个网络接口,使得容器连接宿主机器网络。此部分工作在libnetwork模块中进行,如此容器可通过宿主机器连接外部网络。

(5) docker 启动容器并运行指定参数 设置的程序  /bin/bash ,由于启动时配置了参数 -t  -i 运行容器可宿主终端交互,因此在窗口输入指令,可直接操作docker

(6) 终端输入 exit   或者 组合键盘 Ctrl + d 退出容器,如果未设置参数 --rm  容器默认未删除,可以再次启动,如果设置了,则容器退出,将直接被删除。

docker框架及模块介绍相关推荐

  1. Nginx-接入层Nginx架构及模块介绍

    文章简介: 1)帮助大家对Nginx有一定的认识 2)熟悉Nginx有哪些应用场景 3)熟悉Nginx特点和架构模型以及相关流程 4)熟悉Nginx定制化开发的几种模块分类 文章相关视频讲解: C/C ...

  2. Docker框架使用系列教程(七)Dockerfile镜像创建

    docker框架系列教程已经到第七期了,今天我们介绍一下Dockerfile镜像的创建,重点都在内部进行了标注,喜欢记得分享收藏. Dockerfile创建镜像 Dockerfile由一行行命令语句组 ...

  3. Docker框架使用系列教程(六)创建镜像

    到这里docker系列教程已经是第六期了,今天小千来给大家介绍一下docker镜像的创建方法,还是老规矩喜欢的话记得收藏起来. 创建镜像 当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求 ...

  4. Docker框架的使用系列教程(四)容器的使用

    docker框架到这里我们已经是第四期了,上一期我们介绍了docker镜像的拉取和删除等操作,今天我们就来介绍一下容器的启动.查看.退出等操作,废话不多说下面开始. 1.新建并启动容器 docker ...

  5. Python技巧:Docker框架的使用系列教程(一)

    最近Python程序员提到最多的一个框架就是docker了,对于一些新手来说还不知道他的存在,这里小千就用几期文章给大家介绍一下这个docker和使用教程,喜欢的话记得关注一下. 1.什么是Docke ...

  6. Spring之旅—Spring模块介绍

    1.0  Spring模块介绍 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.Spring使用Be ...

  7. python url模块介绍_python 中 urlparse 模块介绍

    urlparse模块主要是用于解析url中的参数  对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路 ...

  8. python自动化_python自动化测试-Behave框架的用法介绍 - python测试学习

    测码学院  Behave框架的用法介绍 众所周知:行为驱动开发((behavior-drivendevelopment,BDD)是一种基于敏捷软件开发的方法.它可以鼓励开发人员,业务参与者和QA人员之 ...

  9. (8)Node.js 模块介绍

    一.Node.js模块介绍 模块(包)是 Node.js 中具有特定功能的对象. 二.web浏览器端和Node端的对比图 我们通过如上图可以看到,再web浏览器端的基本语法,再Node端也能使用,但是 ...

最新文章

  1. Java从零开始学六(运算符)
  2. 如何在Mac计算机上轻松查找和删除类似照片
  3. 解析器 java_Java高性能解析器实现思路及方法学习
  4. CentOS7.x Hadoop集群搭建
  5. java简历项目经验范文
  6. 计算机分析桁架受力,空腹悬挑桁架受力分析
  7. iGoogle自定义
  8. 从客户端(jianjie=psasdasdfas/p)中检测到有潜在危险的 Request.Form 值
  9. 北京冬奥会使用的集装箱最后如何处理
  10. 我的第一个Android应用BMI-深入浅出Android
  11. Google 三大论文之——MapReduce
  12. 前端图片上传并且裁切
  13. 第四届蓝桥杯JavaC组国(决)赛真题
  14. 云和恩墨新晋ACED熊军微信大讲堂主题分享
  15. ug java环境变量设置_关于UG环境变量
  16. 你真的了解Gradle吗?
  17. 前后台订单入库调用流程
  18. Linux 根目录下的文件介绍
  19. 云计算的认识和看法_对云计算的看法. 我对云计算的认识
  20. Python 一大坑,配置文件中字典引用问题(拷贝)。

热门文章

  1. Ubuntu系统在终端查看一些软硬件版本或文件大小的指令!
  2. 博士毕业感悟:我从来不曾优秀过,也从未曾放弃过!
  3. 怎么直接压缩图片?好用的图片压缩工具推荐
  4. satd 与 sad
  5. Java 平衡二叉树之单旋(左旋,右旋)与双旋
  6. Golang Log日志库
  7. 复旦发布报告!70后度过中年危机?80后珍惜家庭?90后高压期来临?
  8. 深入探索 Android 网络优化(一、网络筑基篇,为什么Flutter能最好地改变移动开发
  9. python抓取图片数字_python 实现识别图片上的数字
  10. 算法总结——JS实现递归