Docker:简单了解虚拟化和容器概念

目录

一、虚拟化简介

1.1 耦合与解耦合

耦合

解耦合

1.2 虚拟化作用

1.3 虚拟化工作原理

1.4 QEMU

1.5 KVM

1.6 虚拟化类型

二、Docker概述

1.1 IT架构的演进:

1.2 Docker初始

1.3 容器的特点

1.4 Docker容器与虚拟机的区别

隔离与共享

性能与损耗

1.5 容器在内核中支持2种重要技术

1.6 Docker核心概念

1)镜像

2)容器

3)仓库

三、其他容器Podman


一、虚拟化简介

通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。

  • 在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(nginx+tomcat),从而实现一台宿主机搭建一个集群(从整体)。
  • 通过软件/应用程序的方式,来实现物理硬件的功能。例如ensp,以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)。

虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率

1.1 耦合与解耦合

耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。

耦合

  • 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。
  • 对象之间的耦合度就是对象之间的依赖性。
  • 对象之间的耦合越高,维护成本越高

解耦合

  • 字面意思就是解除耦合关系。
  • 在软件工程中,降低耦合度即可以理解为解耦,模块间有依赖关系必然存在耦合,理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。

1.2 虚拟化作用

缓解/解决了资源利用率的问题

1.3 虚拟化工作原理

Docker:简单了解虚拟化和容器概念_第1张图片

虚拟机管理器功能:调用资源

两大核心组件:QEMU、KVM

1.4 QEMU

  • QEMU是I/O控制的模块,可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
  • QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。

1.5 KVM

  • 用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
  • 只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。

1.6 虚拟化类型

  • 全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
  • 半虚拟化:需要修改操作系统
  • 直通:直接使用物理硬件资源(需要支持,还不完善)

全虚拟化:KVM——》产品vmware—ce

半虚拟化:EXSI——》workststion vsphere

二、Docker概述

1.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函数(函数化、代码化)

1.2 Docker初始

  • Docker是一个开源的应用容器引擎,基于go语言开发并遵守了apache2.0协议开源。

  • Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。

  • Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
    (Docker是创建容器的工具。应用运行在容器中,每个容器都有一致的运行环境,所以可以在任何主机中运行。即实现“一次封装,到处运行”的目的。)

Docker的Logo:

  • Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
  • 鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker:简单了解虚拟化和容器概念_第2张图片

Docker的设计宗旨:

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere

  • 即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
  • docker是创建容器的工具。应用运行在容器中,每个容器都有一致的运行环境,所以可以在任何主机中运行。即实现“一次封装,到处运行”的目的。

1.3 容器的特点

容器化越来越受欢迎,因为容器是:

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:可以即时部署更新和升级。
  • 便携式:可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:可以增加并自动分发容器副本。
  • 可堆叠:可以垂直和即时堆叠服务。

1.4 Docker容器与虚拟机的区别

隔离与共享

虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。

而Docker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核、文件系统、硬件等资源。

性能与损耗

  • 与虚拟机相比,容器资源损耗要少。
  • 同样的宿主机下,能够建立容器的数量要比虚拟机多
  • 但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor层,这是极其困难的
  • 而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。
不同点 Docker容器 虚拟机

启动速度

快(几秒) 慢(几分钟)
运行性能 接近原生(直接在内核中运行) 运行于Hypervisor上,50%左右损失
磁盘占用 小,设置几十kb(根据镜像层的情况) 非常大(GB)
并发性 一台宿主机可以启动成百上千个容器 最多几十个虚拟机
隔离性 进程级别 资源隔离、限制
操作系统 主要支持Linux 主要支持Linux
封装程度 打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离
  • docker就相当于宿主机的一个进程,所以损耗微乎其微。
  • 虚拟机和操作系统之间是hypervisor,虚拟化管理程序,虚拟化各种硬件资源,这中间就会有资源损耗。

1.5 容器在内核中支持2种重要技术

docker本质就是宿主机的一个进程,docker是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制(限制硬件资源,限制2个容器相互之间抢资源),通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。

linux六大namespace(命名空间):

namespace 系统调用参数 隔离内容
UTS CLONE_NEWUTS 主机名和域名
IPC CLONE_NEWWIPS 信号量,消息队列和共享内存
PID CLONE_NEWPID 进程编号
NETWORK CLONE_NEWNET 网络设备,网络栈,端口等
MOUNT CLONE_NEWNS 挂载点(文件系统)
USER CLONE_NEWUSER 用户和用户组(3.8以后的内核才支持)

1.6 Docker核心概念

1)镜像

  • Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
  • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

2)容器

  • Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
  • 可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

3)仓库

  • Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
  • Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。

三、其他容器Podman

Podman与Docker主要区别

  • docker在运行容器的时候,需要一个守护进程。其次需要root运行
  • podman不需要守护进程。也不需要root用户运行
  • docker需要多个daemon才能调用OCI实现运行
  • podman直接调用OCI,通过common做为容器的管理工具。
  • 在podman体系中,有个称之为common的守护进程,其运行路径通常是/usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common的父则通常是1号进程。podman中的common其实相当于docker体系中的containerd-shim。
     

你可能感兴趣的:(docker,云计算,运维)