五分钟快速认识Docker

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37142346/article/details/81814602

说起Docker,它经常和“容器”这个词结合在一起使用,那么,在认识Docker之前,我们先来简单认识一下容器。

什么是容器?

  1. 容器是一种虚拟的技术
  2. 操作系统级别的虚拟化
  3. 只能运行相同或者相似内核的操作系统
  4. 依赖于Linux内核的Namespace和Cgroups(Control Group)

容器同我们通常使用的虚拟机一样,都是一种虚拟的技术,但是相比较虚拟机,容器更加方便简洁,虚拟机会模拟硬件的行为,在一个物理机上可以运行一台或者多台虚拟机,而容器直接运行在操作系统之上,一台容器也可以运行一个进程或者多个进程;容器的实现也重点依赖于Linux内核的Namespace和Cgroups技术,实现容器资源,权限等的隔离以及控制。如下图所示,可以看出Linux容器技术和虚拟机的区别:
这里写图片描述
从上图可以看出,虚拟机是基于操作系统之上的,假如你需要在虚拟机上运行一个几百兆的app,但是你需要安装操作系统,因此需要占用几个G的内存,因此虚拟机显得更加笨重,而且耗费内存;而容器运行一个app只需要将这个应用和所需要的库加载入容器即可。

什么是Docker?

对于Docker的解释,这里给出官网的说明:

Docker is a platform for developers and sysadmins to develop, deploy, and run applications with containers. The use of Linux containers to deploy applications is called containerization. Containers are not new, but their use for easily deploying applications is.

实际上,用一句话总结:Docker可以将应用程序自动部署到容器中。

Docker的优点

  1. 提供简单轻量的建模方式
  2. 职责的逻辑分离
  3. 快速高效的开发生命周期
  4. 鼓励使用面向服务的架构

    Docker的安装和使用非常简单,使得开发人员可以快速上手使用Docker来部署自己的应用程序;Docker可以使得开发人员只需关注应用程序的开发,运维人员只需关注应用程序如何在Docker之上运行,运维Docker即可;Docker可以实现快速开发,测试,部署的开发生命周期;Docker基于Linux的Namespace和Cgroup技术,可以在一台容器中只运行一个应用或者进程,这样可以实现分布式系统,便于集群的维护,不至于一个容器中运行多个服务应用而相互产生影响,这样也符合软件开发高内聚,低耦合的设计要求。

Docker的使用场景

  1. 使用Docker容器快速开发,测试,部署服务。
  2. 创建隔离的运行环境。
  3. 搭建测试环境。
  4. 构建多用的平台即服务(Paas)基础设施。
  5. 提供软件及服务(Saas)应用程序。
  6. 高性能、超大规模的宿主机部署。

Docker的基本组成

  • Dcoker Client客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • Docker Container容器
  • Docker Registry仓库

Docker使用C/S架构,Client客户端发送用户的命令,后台守护进程进行处理。即可以在本地进行通信,也可以进行远程通信。如下图所示:
这里写图片描述

Docker Image镜像在容器刚创建时是一系列只读的文件系统,通过构造一个镜像栈来存储多个镜像文件,最底层的是bootfs,但是用户不会直接和该镜像文件交互,类似于linux系统,容器在创建时将其加载如内存中,当容器创建完毕之后,会将其卸载。因此,在一个容器中,我们可以近似的认为最底层的镜像文件为rootfs,比如Ubuntu镜像。

这些镜像文件是容器的基石,使用镜像栈装载一系列的镜像文件形成了层叠的只读文件系统,镜像文件也可以联合加载(union mount),但是在用户层面只会感受到一个镜像文件。
这里写图片描述

Dcoker Container容器通过镜像启动,我们可以想象Dcoker Image是容器的创建阶段,而Docker Container就是容器的启动和执行阶段,在容器的创建时会加载一系列的镜像文件,但是这些文件是只读的,在运行自己的应用的时候,需要进行读写,这时就会在镜像栈的顶层创建一个可写层,当需要使用到哪个镜像文件时通过写时复制(copy on write)的方式首先将文件系统中的文件拷贝到可写层,保存原始的文件,但是会被可写层的文件隐藏掉,当进行写时,就在可写层的副本上进行写操作。
这里写图片描述

Docker Registry仓库有两种,分为公有和私有这两种,公有的仓库有Docker Hub,私有的仓库我们可以自己进行创建。

整个Docker的架构如下图所示:
这里写图片描述

Linux系统Namespace和Cgroup

最后,我们简单说说Linux系统的Namespace和Cgroup技术,Docker的核心就是依赖于这两个技术来实现强大的功能。
对于一门编程语言,我们都知道,它有Namespace主要用来进行代码的隔离,降低耦合性。
而对于Linux操作系统,使用Namespace来实现系统资源的隔离,比如进程,网络和文件系统等等。

Linux主要有以下Namespace:

  • PID(Process ID):进程隔离
  • NET(NetWork)管理网络接口
  • IPC(InterProcess Communication)管理跨进程通信的访问
  • MNT(Mount)管理挂载点
  • UTS(Unix Timesharing System)隔离内核和版本标识

Control Group控制组主要有以下作用:

  • 资源限制:可以限制一个进程或应用的内存上限,当超过这个上限的时候会发生OOM
  • 优先级设定:可以设计哪个进程优先使用CPU资源
  • 资源计量
  • 资源控制:可以控制进程占用的资源,比如CPU,内存资源等等。

基于这两种技术使得Docker容器拥有的能力:

  • 文件系统的隔离:每个容器都有自己的root文件系统
  • 进程隔离:每个容器都运行在自己的运行环境中
  • 网络隔离:容器间的虚拟网络接口和IP地址是分开的
  • 资源隔离和分组:使用Cgroup将cpu和内存之类的资源分配给每一个Docker容器。

猜你喜欢

转载自blog.csdn.net/qq_37142346/article/details/81814602