虚拟化的目的就是为了隔离。

docker与linux内核的两个重要特性关系无比密切:namespace和cgroup。namespace实现了资源的隔离,而cgroup实现了控制。而namespace中隔离分为pid/net/ipc/mnt/uts/user,而mnt namespace,则是将一个进程放到指定的目录执行。其使得不同namespace的进程看到的文件结构不同,从而实现了隔离。而chroot则是更为古老的技术,但是由于其和mnt namespace实现的功能较为类似。

docker的诞生流程:

云计算(2)—— 体系结构_消息中间件

LXC

Linux 容器 (LXC - linux container)

云计算(2)—— 体系结构_消息中间件_02

•LXC 是非常轻量级的, 它将 VM 的进程也伪装成 HOST 的进程. 与提供硬件虚拟化机制的虚拟机不同,容器通过对“用户空间”的抽象化处理提供操作系统层级的虚拟化机制。通过对容器进行分解,大家将可以非常清晰地理解其中含义。•出于各种考量与需求,容器在外观上与虚拟机非常相似。举例来说,二者皆拥有专有处理空间、能够作为root执行命令、提供专有网络接口与IP地址、允许定制化路由及iptable规则,且可启动文件系统等等。•容器与虚拟机间的最大区别在于,各容器系统共享主机系统的内核

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:

1.与宿主机使用同一个内核,性能损耗小;2.不需要指令级模拟;3.不需要即时(Just-in-time)编译;4.容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;5.避免了准虚拟化和系统调用替换中的复杂性;6.轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

简单的说,就是lxc实现了资源分配的简化,对原有的常用功能进行了封装,方便我们做容器的生命周期管理。

云计算(2)—— 体系结构_虚拟化_03


namespace

从根本上说,namespace是Linux系统的底层概念有一些不同类型的命名空间被部署在核内。跟踪docker run -it --privileged --net host crosbymichael/make-containers这段代码,我们就可以深入到每个不同的namespace。开始会有一些预加载文件和配置。尽管我们也会在用Docker为我们运行的容器中创建namespace,不要让他影响到你,我选择提供一个容器预加载所有依赖项的方法。我使用 --net host标志,这样可以在容器内看到host的网络接口。也需要提供--privilged标签,以保证拥有正确的权限去通过容器创建新的namespace。

一个容器基本需要做到6项基本隔离,也就是Linux内核中提供的6种Namespace隔离:

云计算(2)—— 体系结构_虚拟化_04

NET Namespace

network namespaces为你的系统网络协议栈提供了自己的视图。这个协议栈包括你的本地主机(localhost)。确认你在目录crosbymichael/make-containers下,并运行 ip a查看所有运行在你的主机上的网络接口。

MNT Namespace

mount namespace可以让看到系统中所有挂载点在某个范围下的目录视图。人们经常把它和在chroot中禁锢进程混淆在一起,或者是认为他们是相似的,还有人说容器使用mount namespac来把进程禁锢在它的根文件系统中,这都是不对的!

UTS Namespace

UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识。包含了hostname 和域名domainname 。它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。让我们开始,拷贝 skeleton.c 然后借助他运行hostname 命令。

IPC Namespace

IPC namespace用于隔离进程间通信,像SysV的消息队列,让我们为这个命名空间创建一个skeleton.c的副本。

PID Namespace

这部分是非常有趣的。PID (Process Identification,OS里指进程识别号)namespace是划分那些一个进程可以查看并与之交互的PID的方式。当我们创建一个新的 PID namespace时,第一个进程的PID会被赋值为1。进程退出时,内核会杀死这个namespace内的其他进程。让我们来通过制作skeleton.c副本开始我们的改变。

USER Namespace

User namespace是最新的子用户空间,它允许你创建独立于其他namespace之外的用户。这是通过GID和UID映射实现的。

这里有一个未指定映射的实例应用程序。如果我们添加CLONE_NEWUSER到clone_flags,然后运行id或ls -la,会得到nobody的输出,因为当前用户还未被创建。

Docker Hub

现如今,Docker可谓是如日中天,使用Docker的企业越来越多。Docker有很多优点,完美的解决了很多项目部署方面的问题。Docker主要优点:

申请Docker hub账号

首先在https://hub.docker.com/官网申请一个docker hub 帐号,该账号是免费申请的。

但是在中国大陆访问dockerhub官方网站的时候,sign up注册按钮是灰色的,不能点击进行注册。以下提供一种解决方案:

在以下链接下载

链接:https://pan.baidu.com/s/1qG0fZTZ2-ntoC1HRhQHpuQ

密码:rzyn

下载谷歌访问助手之后,解压之后使用浏览器打开,根据提示添加即可。

创建个人仓库

创建账号成功之后登录docker hub,点击create按钮:create ->create repository ,起一个名字,这里我们最终创建的仓库名称:hello-docker,其中cupidkai是帐号名称,hello-docker是其中一个仓库名,如下图所示:

云计算(2)—— 体系结构_docker_05


创建镜像

在这里使用Dockerfile的方式建立一个image。它可以在一个镜像的基础上,去构建另一个镜像。首先我们拉取一个centos的镜像。在这里创建一个简单的打印hello world的镜像。

docker pull centos

然后,在本地创建一个Dockerfile文件,让它在这个centos的基础上去输出一个hello-world 。

touch Dockerfile

vi Dockerfile

现在通过docker build生成一个新的镜像,-t可以指定新镜像的名字 . 表示在当前目录下

docker build -t cupid/hello-world .

接下来可以docker images查看本地镜像

docker体系结构

云计算(2)—— 体系结构_虚拟化_06

云计算(2)—— 体系结构_虚拟化_07

Dockerfile、Docker镜像和Docker容器的关系 Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。

简单来讲,Dockerfile构建出Docker镜像,通过Docker镜像运行Docker容器。

云计算(2)—— 体系结构_docker_08

------------------- 消息中间件Rabbitmq ----------------------------------

消息中间件Rabbitmq(01)

消息中间件Rabbitmq(02)

消息中间件Rabbitmq(03)

消息中间件Rabbitmq(04)

消息中间件Rabbitmq(05)

消息中间件Rabbitmq(06)

消息中间件Rabbitmq(07)

------------------- ---------- 云计算  -------------------------------------

云计算(1)——docker的前世今生



关注公众号 soft张三丰 

云计算(2)—— 体系结构_虚拟化_09