原理相关概念

Namespace命名空间

什么是namespace

Docker的运行和namespace有着密切相关的联系,Docker中每个容器都有自己独立的运行位置

空间:对于我们来讲,一个空间是可以与外界相隔的。就像所谓的平行宇宙,就是好多个宇宙之间,每个宇宙中发生的事情,都不会影响到其他的宇宙。空间也就是这个意思。

再比如:我在北京,你在家乡,如果我想给你一个东西,你是拿不到的,我们之间唯一有影响的就是通过网络来联系,可以聊天,或者发送数据,这个例子更贴合容器的概念

容器在运行时,就是在一个空间内,每个容器就是一个空间

容器运行的目的

是希望同样的环境可以运行多个,比如手机微信应用分身也是利用了这个原理;最好的例子就是,比如做一个web集群,可以通过多个容器来搭建,从而省掉了用服务器去搭建web服务,也充分的利用了硬件资源,因为一般如果一台服务器只搭建一个服务的话,硬件资源过剩,造成浪费,也造成了相应的经济损失。

当然以上所说的目的,虚拟机也可以达到,但是虚拟机是在模拟硬件来进行工作,安装起来也是要安装一个系统,然后再去部署服务,下面会说到。

虚拟化类别

容器化的虚拟化

VMware虚拟机

OpenStack虚拟化(阿里云)

容器的概念

什么是容器

容器是一个大的品类,就像操作系统一样,操作系统包括windows/linux/unix…,其中一个只是操作系统的种类。Docker也是容器的一种种类,或者说是品类都可以。虽然容器是一个大的种类,但是使用容器的应用使用镜像实例化后也称之为容器。

主流容器种类:Docker、Podman、coreOS、lxc、buildah、skopo…

images + docker = container/application,Docker镜像实例化后就是一个容器(container/application)

images + vmware = 虚拟机,VMware镜像实例化后就是一个虚拟机

如:Podman

它是被红帽公司所收购的,所以在基于红帽的linux操作系统上,可以直接yum来安装

与docker使用方法类似

podman安装

yum -y install podman

podman使用方法

podman pull centos # 从红帽仓库下载centos镜像 
podman images # 查看已有镜像
podman run -it --name test centos /bin/bash  # 运行并进入容器
podman rm -f test # 删除test容器
podman ps # 查看正在运行的容器

镜像的分类

应用类镜像、操作系统类镜像、工具类镜像

我们在之前安装Docker后,有下载了三个镜像httpd/centos/busybox,其中httpd属于应用类镜像,centos属于操作系统类镜像,busybox属于工具类镜像

虚拟化的分类

完全解耦虚拟化和半解耦虚拟化

在了解这两类虚拟化之前,需要了解两个东西,驱动程序和动态链接库文件

驱动程序是硬件的说明手册,而库文件是软件的说明手册

qudong_lib

驱动程序

每个硬件都有一个驱动程序,无论是u盘/鼠标等等,如果想要发挥硬件的所有性能,需要驱动程序的支持。驱动程序会安装到操作系统中

也就是说驱动程序可以让计算机硬件的性能发挥到极致

对于虚拟化来说,硬件的驱动程序是共用的,多个容器对硬件的调取指令集是一样的,同一台服务器的不同容器应用都是使用这一台的硬件资源。

我们使用的电脑由硬件构成,电脑中有一个Kernel内核程序,需要使用操作系统才能够来调用硬件来工作,那正常的工作生活只有操作系统、内核以及硬件吗,不是的,我们是通过软件来使用电脑的。这时候如果要对电脑进行操作,以linux为例,我们需要shell环境来进行输入指令,如:/bin/bash、/bin/zsh...;而windows的shell环境是explorer,也是windows图形界面的重要环境。最终的用户就是通过shell环境来操作的。

无论什么类型的linux操作系统,都在使用/bin/bash环境,只是目录结构不一样而已

动态链接库文件

Dynamic Link Library

也叫库文件,在日常linux的使用中,但凡目录名为lib的目录,都是存储了库文件的目录,全称是library

而在windows中是*.dll文件

库文件中写入了各种各样程序说明,信号说明,用来告诉操作系统某软件的操作手册。

一些软件的库文件会在下载安装的时候,同时下载

库文件有一定的通用性,比如一些应用或者服务的启动命令都是一样的

生成虚拟化的时候会对共用的程序生成共用的一系列的法则

操作系统的自我学习

用户通过shell发送指令给操作系统,操作系统来控制软件,那操作系统是怎么知道,什么样的软件应该怎么操作呢,它需要一个说明手册,它要给软件发送什么样的指令就能够去操作这个软件呢。

这个时候就用到了库文件。

当软件收到了来自操作系统的正确操作指令集后,会把这个程序发送给内核,由内核调用硬件来达到用户所需要的操作,如,播放音乐,用户点击播放以后,系统通过库文件识别到了用户的操作,然后使用驱动程序来调用扬声器来播放音乐。

虚拟化状态

两种虚拟化状态会在我们使用虚拟化时,自动的出现在我们的电脑中。

完全解耦虚拟化

传统虚拟化:VMware、KVM…

wanquanjieouxuni

为了创建一个完整的虚拟机,如果想要运行一个程序,如nginx,就需要创建一个虚拟机,安装操作系统,在进行模拟硬件再次进行硬件驱动,再安装nginx来使用,然后也会安装对应的lib库以及指令集(命令);如果web集群中需要要安装第二台nginx,就要再安装操作系统来进行。但是每一台的硬件资源不仅仅只能运行一个nginx,就造成了硬件资源的浪费。

借用物理机的操作系统和虚拟的操作系统之间,使用hypervisor对硬件进行虚拟化,也就是虚拟机模拟硬件的功能是由它来完成的。

半解耦虚拟化

容器虚拟化

banjieouxuni

所有Docker的容器的硬件和物理机的硬件参数完全一模一样,如物理机内存1G,Docker容器内存也是1G,可以通过软限制来实现对硬件资源的限制,之后会说到。

相同的app之间使用相同的lib库即可,不同app自然也使用不同的lib库。这个过程中有一个概念很重要,就是rootfs镜像分层,后面会说到

比较两种状态的虚拟化

半解耦能够共用的会去尽量共用,这样使得容器在体积上会比虚拟机小很多,app只需要在安装时,安装自己对应的lib库、bin指令集即可

如果当web访问量突增,需要多开几台web应用来缓解时,半解耦在当前服务器启动容器即可,不需要去启动操作系统,容器中的web应用中会在沙盒中运行。而完全解耦则需要去启动一台虚拟机,相当于启动一台操作系统,然后去运行web,时间上也造成了浪费。

为什么需要使用容器

容器使软件具备了超强的可移植能力,数据从测试环境迁移到生成环境中是没有差别的。

  • 生产环境和测试环境是不同的人员进行搭建的,虽然都能运行开发程序,由于环境的不同,会增加开发人员的难度

  • 开发人员需要的环境比较复杂(mq、web、sql、memcache…),来构成巨大的应用,可能会部署在不同的环境中去运行,服务在运行时可能需要动态迁移到不同环境,运维人员需要为不同的服务运行的平台进行配置,使服务迁移后可以顺利正常的运行,造成了大量的工作难度

以上两点就可以通过容器来进行解决

Docker的logo也就意味着一条大鱼载着好多的集装箱,将现实中运输的集装箱概念运用到了软件中,一个集装箱装一种货物,可以避免不同货物堆放在一起时的损坏

Docker为代码提供了标准化的运输系统,Docker可以将任何应用打包成一个个轻量级可移植的容器,容器几乎可以运行在所有的操作系统上。

Container一词原为集装箱,Docker引入这个概念后,中国人将它更抽象的解释为容器。

Docker 特性

  • 打包对象:任何软件及其依赖都可以打包在一起
  • 解决硬件的依赖关系:容器不需要更改就可以几乎运行在所有的平台上,包括虚拟机、物理机、公有云、私有云、阿里云、腾讯云、华为云…
  • 隔离性:资源、网络、库都是被隔离的,不会出现依赖问题
  • 自动化:提供标准的操作内容,run/start/stop等对容器的操作。高效、轻量级,可以快速启动和迁移
  • 职责分工:开发人员只需要考虑代码怎么去写,运维人员只需要考虑如何配置基础环境,不需要去考虑平台以及硬件。

容器意味着,环境隔离和可重复性:开发人员只需要为应用创建一次运行环境,打包为容器,便可以在任何电脑上使用,容器环境与其他host主机环境是隔离的,更简单。运维人员只需要配置好标准的环境,更加高效,一致和可重复性。容器的消除和开发测试,生产环境当中的不一致性都已经不存在。

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0