首页 > 其他分享 >深入解析Docker(2)Docker引擎

深入解析Docker(2)Docker引擎

时间:2023-05-24 11:31:55浏览次数:58  
标签:容器 Daemon 引擎 版本 Docker 解析 安装 docker

分享一下最近正在b站上看动力节点的docker课程,整理了相关学习笔记,会按照学习进度慢慢更新的,加油

2 Docker引擎

2.1 Docker引擎发展历程

2.1.1 首发版本架构

Docker在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与Docker Daemon。 不过,该架构依赖于LXC,使得Docker存在严重的问题:

  • 依赖于外部工具,对Docker来说,存在着巨大的生存风险
  • LXC使得Docker无法实现跨平台

Docker Daemon的“大而全”也带来了严重的问题:

  • 版本更新与功能扩展较难
  • 运行较慢,带来性能问题
  • Docker Daemon运行出现问题,会直接影响容器的运行
  • 不符合软件哲学

2.1.2 Docker0.9版本架构

从Docker0.8版本开始,Docker使用自研的Libcontainer工具替换了LXC。

2.1.3 Docker1.1版本架构

2017年7月OCI基金会发布了两个规范(镜像规范与容器运行时规范)的OCI1.0版本。2016年底发布的Docker1.1版本基本遵循了OCI1.0版本。 从Docker1.1版本开始,Docker Daemon中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了Runc项目。

2.2 Docker引擎架构

Docker引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成: Docker Client,Dockerd、Containerd与Runc。

深入解析Docker(2)Docker引擎_官网

2.2.1 Docker Client

Docker客户端,Docker引擎提供的CLI工具,用于用户向Docker提交命令请求。

2.2.2 Dockerd

Dockerd,即Docker Daemon。在现代Dockerd中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过gRPC与Containerd进行通信。

2.2.3 Containerd

Containerd,即Container Daemon,该项目的主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用Runc来完成容器的创建。 Docker公司后来将Containerd项目捐献给了CNCF(云原生基金会)。

2.2.4 Runc

Runc,Run Container,是OCI(开放容器倡议基金会)容器运行时规范的实现,Runc项目的目标之一就是与OCI规范保持一致。所以,Runc所在层也称为OCI层。这使得Docker Daemon中不用再包含任何容器运行时的代码了,简化了Docker Daemon。 Runc只有一个作用—创建容器,其本质是一个独立的容器运行时CLI工具。其在fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc会自动退出。

2.2.5 Shim

Shim(垫片)是实现“Daemonless Container(无Docker Daemon与Container Daemon容器)”不可或缺的工具,使容器与Docker Daemon解耦,使得Docker Daemon的维护与升级不会影响到运行中的容器。
每次创建容器时,Containerd同时会fork出Runc进程与Shim进程。当Runc自动退出之前,会先将新容器进程的父进程指定为相应的Shim进程。
除了作为容器的父进程外,Shim进程还具有两个重要功能:
  • 保持所有STDIN与STDOUT流的开启状态,从而使得当Docker Daemon重启时,容器不会因为Pipe的关闭而终止。
  • 将容器的退出状态反馈给Docker Daemon。

2.3 Docker引擎分类

在安装Docker之前需要先了解Docker官方对其版本的分类。Docker的版本分为大版本与小版本。

2.3.1 大版本

Docker从大版本来说,分为三类:Moby、社区版Docker-CE(Community Edition)和企业版Docker-EE(Enterprise Edition)。

2.3.2 小版本

从v1.13.1之后,Docker的发布计划发生了变更,每个大版本下都出现了两个小版本Edge月版与Stable季版。不过,现在的官网中一般只能看到Stable版本。

2.4 Docker引擎的安装

Docker可以安装在Windows、Linux、Mac等系统中,但生产环境下,服务器使用Linux中的CentOS居多,所以下面就以Docker在CentOS7中的安装为例来学习Docker的安装。官网https://docs.docker.com/engine/install/centos/中可以看到具体安装方式与安装步骤。

2.4.1 系统要求

我们这里要安装的是Docker CE版,且要安装到CentOS之中。不过,对于安装Docker的系统环境还是有要求的。

深入解析Docker(2)Docker引擎_docker_02

对于CentOS系统的安装主机,无论是传统架构还是ARM架构,要求处理器都是64位系统。

深入解析Docker(2)Docker引擎_docker自学_03

并且CentOS要求是7及其以上版本。

2.4.2 克隆并配置主机

  • 修改主机名:/etc/hostname
  • 修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens33

2.4.3 安装需要的包

yum-utils中提供了yum-config-manager工具,该工具是下面要使用的命令,用于完成配置管理。

深入解析Docker(2)Docker引擎_docker自学_04

安装成功后可以看到以下提示。

深入解析Docker(2)Docker引擎_docker自学_05

2.4.4 添加docker下载仓库

这里要添加后面安装docker-ce的下载仓库。官网给出的是一个国外地址仓库,不过我们国内一般使用国内仓库地址。

2.4.4.1 国外地址安装

官网给出的是国外仓库地址,我们这里不使用。

深入解析Docker(2)Docker引擎_官网_06

2.4.4.2 国内地址安装

从国外服务器上下载Docker安装包非常慢,可以从国内服务器上下载。在百度搜索“docker的阿里云镜像地址”,找到如下地址,然后将原来命令中的国外地址替换为这个阿里云地址即可。http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

深入解析Docker(2)Docker引擎_docker自学_07

2.4.5 安装docker

安装最新版的docker-ce。当然,官方给出的如下命令中没有添加-y,我们可以添加上,否则后面安装过程中会有两次询问。

深入解析Docker(2)Docker引擎_docker自学_08

若要安装指定版本的,则官网给出了安装步骤。

深入解析Docker(2)Docker引擎_docker_09

2.5 Docker引擎的启停

Docker是以服务的形式运行在系统中,所以使用systemctl来对其进行各种操作。

2.5.1 Docker启动

深入解析Docker(2)Docker引擎_Docker_10

2.5.2 启动成功测试

为了验证Docker安装启动成功,一般有两种方式:

2.5.2.1 docker version

docker version命令可以看到当前docker的版本信息,主要包括Docker的Client与Server的信息。

深入解析Docker(2)Docker引擎_官网_11

2.5.2.2 运行hello-world镜像

可以通过运行hello-world镜像来验证Docker的安装启动成功。当然,当前宿主机中是不存在hello-world镜像的,其会首先下载,然后才会运行。如果看到如下输出,则说明Docker已经安装启动成功了。如果看不到如下结果,一般都是因为下载超时,需要先完成以下“配置国内加速器”步骤。

深入解析Docker(2)Docker引擎_官网_12

2.5.3 Docker重启

深入解析Docker(2)Docker引擎_官网_13

2.5.4 查看Docker状态

深入解析Docker(2)Docker引擎_官网_14

2.5.5 开机自启动Docker

通过systemctl start docker命令仅可以开启Docker服务,但每次开机后,都需要开启。可以通过systemctl enalbe docker命令将Docker服务设置为开机自启动服务,即开机后Docker服务无需再开启,其本身就是开启状态。

深入解析Docker(2)Docker引擎_docker教程_15

此时再查看Docker的状态,可以看到原来的disabled变为了enabled,说明当前Docker服务已经变为了开机自启动了。

深入解析Docker(2)Docker引擎_Docker_16

2.5.6 Docker停止

深入解析Docker(2)Docker引擎_docker教程_17

2.5.7 关闭开机自启动

深入解析Docker(2)Docker引擎_docker_18

2.6 配置国内加速器

国内镜像中心常用的为阿里云与网易云。在本地Docker中指定要使用的国内加速器地址后,就可以直接从国内镜像中心下载镜像了。

2.6.1 配置阿里云加速器

2.6.1.1 找到相应页面

若要配置阿里云加速器,必须首先要有阿里云的账号。登录阿里云后,打开阿里云的容器镜像服务页面 https://cr.console.aliyun.com ,然后找到如下页面,执行相应的命令。

深入解析Docker(2)Docker引擎_docker教程_19

下面就需要按照给出的步骤来完成镜像加速器的配置了。

2.6.1.2 创建docker目录

深入解析Docker(2)Docker引擎_docker自学_20

2.6.1.3 修改daemon.json文件

在文件末尾添加指定的内容。注意,该json数据中的URL地址是与用户登录账号绑定的,不同的用户所生成的地址是不同的。

深入解析Docker(2)Docker引擎_官网_21

2.6.1.4 重新加载服务配置文件

深入解析Docker(2)Docker引擎_官网_22

2.6.1.5 重启docker引擎

深入解析Docker(2)Docker引擎_docker_23

2.6.2 配置网易云加速器

配置网易云加速器,无需注册网易云用户。只需将前面的daemon.json文件中的那个URL替换为如下URL即可。

深入解析Docker(2)Docker引擎_docker自学_24

当然,替换过后,仍需重新加载服务配置文件,重启docker引擎。

2.7 Docker引擎的卸载

对Docker的卸载分为三大步:

2.7.1 yum移除

通过yum remove移除docker安装的四个组件。

深入解析Docker(2)Docker引擎_docker_25

2.7.2 rm两个目录

通过rm –rf删除/var/lib下的docker与containerd两个目录。这两个目录中存放着镜像、容器、数据卷,它们在前面删除时不能被自动删除,需要手动删除。

深入解析Docker(2)Docker引擎_Docker_26

2.7.3 删除其它配置文件

还有一些自己编辑、定义的配置文件,需要自己手工删除。

2.8 总结

2.8.1 Docker引擎发展历程

这部分是重点也是难点。要重点了解首发架构由两大核心组件构成:LXC(Linux Container)与Docker Daemon。要重点理解首发架构的两大问题:

  • 严重依赖于LXC,出现了“卡脖子”问题,及无法实现Docker跨平台。所以在0.9版本使用了Docker自研的Libcontainer替换了LXC。
  • Docker Daemon中的“大而全”使得版本更新难、性能出现瓶颈、不符合软件哲学(由Unix团队提出),关键是,其还存在着“中心化”问题。所以在1.1版本中其实现了OCI规范,将容器运行时Runc从Docker Daemon中剥离了出来。

2.8.2 Docker引擎架构

这部分是重点也是难点。要重点了解它们的关系及各自的功能。

  • Docker Client:用户提交Docker命令
  • Dockerd:负责REST API、处理镜像相关命令、网络、容器编排等。
  • Containerd:负责容器生命周期管理(负责处理容器相关的命令),但不负责创建容器。当docker run命令到来时会fork出Runc与Shim两个进程。
  • Runc:负责创建容器进程,容器创建并启动完毕后,Runc将容器进程交付给Shim进程管理,然后自己退出。
  • Shim:负责将容器与Docker Daemon进行解耦。

2.8.3 Docker引擎分类

了解Docker分为三大版本(Moby、CE、EE),两小版本(Edge、Statble)。

2.8.4 Docker引擎的安装与卸载

这部分是重点。主要是能够从官网找到相关操作步骤,会使用相关命令。

标签:容器,Daemon,引擎,版本,Docker,解析,安装,docker
From: https://blog.51cto.com/u_15973769/6338176

相关文章

  • 以Docker方式启动SonarQube
    以Docker方式启动SonarQube拉取镜像dockerpullpostgres:13dockerpullsonarqube:8.9-community运行容器启动postgresdockerrun\-d\--namepostgres\-p5432:5432\-ePOSTGRES_USER=sonar\-ePOSTGRES_PASSWORD=sonar\postgres:13启动SonarQ......
  • SpringBoot中操作Redis解析JsonArray数据为对象List(ruoyi字典值sys_dict为例)
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建系统的基础上,会将系统的字典值缓存进redis中。看数据格式存储的是Json数组,如何从redis中读取并解析成对象的list从而进行数据处理。注......
  • XML解析之DOM解析
    XML解析之DOM解析XML结构是一种树型结构,处理步骤都差不多,Java己经将它们封装成了现成的类库。目前流行的解析方法有三种,分别为DOM、SAX和DOM4j。本文将讲解DOM解析。DOM(DocumentObjectModel,文档对象模型)是W3C组织推荐的处理XML的一种方式。它是一种基于对象的API,......
  • 修改docker容器网络
    ###解除容器绑定的网络网络名称root_default容器名称root_redis_1dockernetworkdisconnectroot_defaultroot_redis_1##删除原先的网络dockernetworkrmroot_default##重新创建容器网络dockernetworkcreate--subnet=172.22.16.0/24root_default7d40e0be1fcade91f......
  • 安装docker
    开始安装yuminstall-ydocker查看安装结果dockerversion开启docker服务systemctlstartdocker.service设置开机启动systemctlenabledocker.service配置DOCKER镜像下载加速vim/etc/docker/daemon.json打开编辑器,然后在加⼊加速镜像源地址,这⾥......
  • 查看docker是否开机启动
    查看是否已经设置docker开机启动systemctllist-unit-files|grepenable如果自启动服务中没有docker的服务,可以用以下命令设置docker开机启动systemctlenabledocker.service......
  • K8S-学习笔记-001-容器Docker和K8S
    K8S-学习笔记-001-容器Docker和K8S容器是什么?简单来说,它就是个小工具,可以把你想跑的程序,库文件,配置文件都一起“打包”。在任何一个计算机的节点上,都可以使用这个打好的包。有了容器,一个命令就能把你想跑的程序跑起来,做到了一次打包,就可以到处使用。比如:可以把整套Zabbix环境(httpd......
  • 解析 Pinia 和 Vuex
     Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。本文将通过Vue3的形式对两者的不同实现方式进行对比,让你在以后工作中无论使用到Pinia还是Vuex的时候都能够游刃有余。既然我们要对比两者的实现......
  • 【linux基础】ftok函数解析
    前言最新项目代码有关信号量、共享内存,直接使用数值,不能得到预想的效果,调试发现不能直接使用数值,而是ftok函数获取键值,此前不了解,故记录之。原理共享内存、消息队列、信号量都是通过一个中间介质来进行通信的,这种介质多的是。就是怎么区分出来,就像唯一一个身份证来区分人一样。......
  • RAW8图像数据格式解析
    前言使用7yuv工具查看raw8图像数据,选择的格式是8bpp格式,大小是图像尺寸1280*720即可;RAW格式raw数据是sensor输出的原始数据,一般有raw8,raw10,raw12等,分别表示一个像素点有8bit、10bit、12bit数据。是sensor将光信号转化为电信号时的电平高低的原始记录,单纯地没有进行任何处......