目录
五、Docker的架构(Docker architecture)
5、资源控制—cgroups(Control groups)
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:
pid=2 ——> python
pid=3——>java
pid=4——>php
三个服务可能会相互影响
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境
随着技术发展——>虚拟化技术开销较大(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
——>延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来bin操作系统去除),只要通过引擎就可以直接连接到宿主
Docker 概述
1、IT架构演变
云计算涌现出很多改变传统IT架构和运维方式的新技术,比如虚拟机、容器、微服务、Serverless(无服务),无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题。
Bare Metal(裸金属):运行物理机,也称为裸金属
Virual machines(虚拟机):可以在一台物理机上创建多个虚拟机,并把物理配置分发成多个虚拟配置
缺点:性能损耗大,大约损耗50%
虚拟机常用软件:VMware workstation(windows、vm Sphere+ESXI (Windows server)、KVM(linux内核))
Containers(容器):容器内部自身有一个小型操作系统
常用软件:docker、podman、rocket、container
functions函数(函数化、代码化)
2、Docker 是什么
-
是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台。
-
在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中。
-
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。 -
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
3、Docker的设计宗旨
Build,Ship and Run Any App,Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
4、Docker特点
容器化越来越受欢迎,因为容器是:
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:可以即时部署更新和升级。
便携式:可以在本地构建,部署到云,并在任何地方运行。
可扩展:可以增加并白动分发容器副本。
可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。
5、Docker与KVM(虚拟机)的区别
5.1 隔离与共享
虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核、文件系统、硬件等资源。
5.2 性能与损耗
与虚拟机相比,容器资源损耗要少。
同样的宿主机下,能够建立容器的数量要比虚拟机多
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor层,这是极其困难的
而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。
不同点 | Docker容器 | 虚拟机 |
启动速度 | 秒级(块) | 分钟级(稍慢) |
运行性能 | 接近原生(直接在内核中运行),运行于Hypervisor上 | 50%左右损失 |
磁盘占用 | MB(小) | GB(大) |
数量(并发性) | 一台宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
隔离性 | 进程级别 | 资源隔离(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
5.3 docker在内核中支持2种重要技术
docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过==cgroups ==实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,而是随着使用扩展)
6、Docker有哪些优势?和虚拟化比有什么优势?
把容器化技术做成了标准化平台
docker引擎统一了基础设施环境——docker容器环境(引擎)
docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
docker引擎统一了程序部署(运行)方式——docker容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态 - 运行时)
实现了一次构建,多次、多处使用。
三、Docker的使用场景
① 打包应用程序部署简单
② 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
③ 适合做微服务的部署
④ 适合持续集成和持续交付(CI/CD):开发到测试发布
⑤ 部署微服务
提供PASS产品(平台即服务){OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker(K8S)属于PAAS}
机操作系统中,极大减小了开销。
四、Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的**客户端-服务器(C/S架构)**应用程序:
① server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
② client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
③ 命令行界面(cLI)客户端((docker命令)。
docker run
docker start
docker rm
五、Docker的架构(Docker architecture)
① Docker使用客户端-服务端(C/S)架构。Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
② Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快。
③ Docker daemon:守护进程
④ Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象。例如图像、容器、网络和卷,守护程序还可以与其他守护程序通信以管理Docker服务。
1、简述Docker体系架构
Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。
Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件
Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker目录下。
2、Docker 三要素(核心组件)
Docker images:镜像:统一的封装方式——》模板
Docker container:容器:统一的运行时环境 ——》基于镜像,运行状态/运行时状态
Docker registry:镜像仓库:放置镜像的仓库——》存放镜像模板
存储镜像的地方,默认在公共的 Docker Hub上查找,可以搞个人仓库。
仓库大类:①公共仓库—》docker hub ②私有仓库registry harbor
3、Docker运行流程
工作流程:
- 客户端发起各种各样的命令,给与主机
- 主机会调用镜像,如果有镜像直接用,运行为容器
- 如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
4、Linux 的namespace (命名空间)
namespace资源隔离——用容器技术封装
namespace | 系统调用参数 | 隔离内容 |
uts | CLONE_NEWUTS | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | CLONE_NEWWIPS | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
pid | CLONE_NEWPID | 进程编号 |
network | CLONE_NEWNET | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
mount | CLONE_NEWNS | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
5、资源控制—cgroups(Control groups)
- 六种名称空间是由cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
- cgroups 管理linux内核态中资源管理的模块
- cgroups 管理一些系统资源
- 不是docker原生的
6、容器特性
特性——》性能损耗10-20%
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务
7、 容器小的架构体系
三、Docker和虚拟化的区别
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统(更彻底,安全级别高) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
- 容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
- 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
四、总结
1、什么是docker?docker原理?
- docker是一种封装和运行的开源平台,他统一了封装方式,统一了运行方式,开源平台指的是docker引擎,统一的封装方式指的是镜像,统一的运行方式指的是容器。
- cgroup资源控制与namespaces两者构成了docker底层原理
- docker是一种容器技术,**把linux中的cgroups(资源管理)和namespace(名称空间)等**容器底层技术进行完美封装,并抽象为用户创建和管理容器的便捷界面(命令行cli、api等),这种C/S架构
2、简述Docker主要使用的技术?
- Cgroups:资源控制,管理一些系统资源
- Namespace:资源隔离(名称空间)
- rootfs:文件系统隔离(使用内核提供的rootfs)
- 容器引擎(用户态工具) :生命周期控制
docker本质就是宿主机的一个进程, docker是通过namespace(命名空间)实现资源隔离,通过cgroup,实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)
Namespace:资源隔离(名称空间)
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
3、简述Docker体系架构?
-
Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
-
Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。
-
Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件
-
Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
-
Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在**/var/lib/docker**目录下。
4、Docker有哪些优势?和虚拟化比有什么优势?
-
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
-
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境) -
实现了一次构建,多次、多处使用。
5.如何把多个目录挂载到同一个目录下?
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统