【业务工具】【Docker】1. Docker基本概念和框架

CSDN 光仔December: https://blog.csdn.net/acmman/article/details/83212634
极客学院Docker视频教程


前言

Docker的Logo是一只载满了集装箱的鲸鱼:
在这里插入图片描述
Docker自己是这样说鲸鱼的:The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you.它托着许多集装箱。我们可以把宿主机当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含自己的应用程序。鲸鱼或许代表着创始人Solomon Hykes眼中的互联网愿景,就像20世纪50年代集装箱颠覆了全球物资运输方式一样,它将会颠覆信息运输方式,让货物在互联网的火车、汽车、轮船之间畅通无阻。


一、Docker简介

1.1 认识一下Docker

以图为例:

  • 运行的系统是ubuntu,运行的命令bin/bash
  • root账户登录,@后面是容器的名字
    在这里插入图片描述
    图中的ifconfig命令的功能是显示或设置网络设备

docker的容器技术就是虚拟化的一种

1.2 什么是容器?

【一种虚拟化方案】容器技术其实就是一种虚拟化方案,与传统的虚拟机不同。

【操作系统虚拟化】传统的虚拟机,是通过中间层,将一台或者多台独立的机器虚拟运行于物理硬件内核之上,而容器则是直接运行于操作系统之上的用户空间。因此,容器虚拟化,也被成为操作系统虚拟化。

【只能运行相同或相似内核的操作系统】由于依赖于操作系统的特性,所以容器只能运行与底层操作系统相同或相似内核的操作系统。

【依赖于Linux内核特性:Namespace和CGroups】而Docker使用的操作系统,正是依赖于Linux内核的Namespace和CGroups等特性,所以Docker上只能运行Linux类型的系统,而不能运行Windows系统,这也正是容器相对于虚拟机技术,在系统灵活性上的劣势。

1.3 虚拟机vs容器技术

在这里插入图片描述
上图左边是运行在一台机器上的两台虚拟机,右边是运行在一台机器上的两个容器。

从图中可以看出,容器需要使用的磁盘空间比虚拟机要少。因为当使用虚拟机部署应用时,不但包含了应用和其依赖的库,还需要包含一个完整的操作系统,原本只需要几十MB的应用,却需要动辄几GB的操作系统来支持。而右边的容器,只需要包含应用程序和其依赖的库,资源占用大大减少。

另外,虚拟机需要模拟硬件的行为,对内存和CPU的损耗也相当得大。所以,同样配置的服务器,使用容器技术,比使用虚拟机能够提供更多的服务能力,服务更多的用户

那么,容器有那么多的优点,为什么直到Docker的出现,才成为大家关注的重点呢?

  • 容器技术的复杂性,它依赖于Linux内核的很多特性,
  • 容器不易安装,
  • 容器不容易管理和实现自动化。

Docker就是为了改变这些而出现的。

1.4 什么是Docker?

  • 将开发的应用程序自动部署到容器的开源引擎
  • 使用go语言编写,其GitHub的地址为:https://github.com/docker/docker
  • 2013年初,dotCloud(也就是现在的Docker公司)发布
  • 基于Apache2.0开源授权协议。

Docker有什么特别之处呢?它在虚拟化的容器环境中,增加了程序部署引擎,该引擎的目标,就是提供一个轻量、快速的环境,能够运行开发者程序,并能方便高效的将应用程序从开发者的环境,部署到测试环境,然后再部署到生产环境。

1.5 Docker的目标

(1) 提供简单、轻量的建模方式
Docker十分容易上手,用户只需要几分钟,就可以将自己的程序“Docker化”。大多数Docker容器只需要不到1秒的时间,即可运行起来。由于去除了管理程序的开销,Docker容器拥有非常高的性能,同时,同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

(2) 职责的逻辑分离
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的,就是要加强开发人员写代码的开发环境,与应用程序要部署的生产环境的一致性。

(3) 快速高效的开发生命周期
Docker的目标之一,是缩短代码从开发、测试到部署、上线运行的周期,让我们的应用程序具备可一致性。在容器中开发,以容器的形式交付和分发,这样,开发、测试、生产都使用相同的环境,也就避免了额外的调试,以及部署上的开销。这样就能有效的缩短产品的上线周期。

(4) 鼓励使用面向服务的架构
Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用模型。在这种模型下,应用程序或服务,都可以表示为一系列内部互联的容器,从而使分布式部署、扩展和调试应用程序都变得非常简单。这就像我们在开发中的“高内聚、低耦合、单一任务”的思想。这样就能避免在同一服务器上部署不同服务时,可能带来的服务之间的互相影响。这样在运行过程中,出现问题,也比较容易定位问题的所在。

1.6 Docker的使用场景

(1) 使用Docker容器开发、测试、部署服务
因为Docker本身非常轻量化,所以本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中创建,然后再提交到测试,最终进入生产环境。

(2) 创建隔离的运行环境
在很多企业应用中,同一服务的不同版本,可能服务于不同的用户。而使用Docker,非常容易创建不同的生产环境来运行不同的服务。

(3) 搭建测试环境
由于Docker的轻量化,所以开发者很容易利用Docker在本地搭建测试环境,用来测试程序在不同系统下的兼容性,甚至是搭建集群系统的测试。而学生也很容易利用Docker来搭建学习开发的环境。

(4) 构建多用户的平台即服务(PaaS)基础设施

(5) 提供软件即服务(SaaS)应用程序

(6) 高性能、超大规模的宿主机部署

目前AWS(亚马逊云平台)、Windows Azure(微软云计算操作系统)等公有云服务,都提供了对Docker的支持,使开发者可以借助云平台,利用Docker搭建PaaS、SaaS等服务。

同时,也有开发者,在使用Open Stack和Docker结合,提供PaaS、SaaS的服务,使Docker在云计算服务领域,有着非常广阔的前景。

1.7 总结

什么是容器:依托于Linux内核的虚拟化技术
什么是docker:能把应用程序自动部署到容器的开源引擎
docker的目标
docker的使用场景

二、Docker基本组成

2.1 五大组成部分

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

2.2 架构

  1. C/S架构:Docker是C/S(客户端/服务器)架构的程序,Docker的客户端,向Docker的服务端(即守护进程)发出请求,守护进程处理完所有的工作,并返回结果

  2. 本地/远程:Docker客户端对服务器端的访问,既可以是在本地,也可以通过远程来访问。

下图可以帮助我们很好理解Docker的C/S架构:
在这里插入图片描述
我们通过Docker客户端,执行各种命令,然后Docker客户端会将这些命令发送给守护进程。守护进程执行的结果,还会传回给客户端,使我们能够通过客户端,查看命令运行的结果。

2.3 Docker Image 镜像

镜像是Docker容器的基石,容器基于镜像启动和运行。

镜像就好比容器的源代码,保存了用于启动容器的各种条件。

如果更深一层的剖析Docker的Image镜像,其是一个层叠的只读系统
在这里插入图片描述
它的最底端,是一个引导文件系统,即bootfs。计算机系统中引导程序的作用是进行系统初始化工作,以及将OS的核心程序装入主存。这很像典型的Linux引导系统,而用户几乎不会和引导文件系统进行交互。
实际上,当一个容器启动后,它将会被引入到内存中,而引导文件系统会被卸载。

它的第二层,是rootfs(root文件系统),它位于引导文件之上。root文件系统可以是一种或者多种的操作系统,例如Ubuntu或Cent OS。
在传统的Linux引导过程中,root文件系统以只读的方式加载,当引导结束并完成了完整性检查后,它才会被切换为读写模式。
但是在Docker容器中,root文件系统永远只能为只读状态,并且Docker利用**联合加载(union mount)**技术,又会在root文件系统之上,加载更多的只读文件系统。联合加载的意思就是,一次同时加载多个文件系统,但是在外面看起来,只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,让最终的文件系统,会包含所有的底层文件和目录。

Docker将这样的文件系统成为“镜像”。一个镜像可以放到另一个镜像的顶部,位于下面的镜像,称为父镜像,可以以此类推,直到镜像栈的最底部,而最底部的镜像,称为“基础镜像”。也就是上图的镜像栈中的rootfs文件系统。所有的层都会有一个指针指向下一层。

2.4 Docker Container 容器

Docker Container容器是通过镜像启动的,Container容器是Docker的执行单元,容器中可以运行客户的一个或多个进程。
如果说镜像是Docker生命周期的【构建和打包阶段】,那么容器则是Docker生命周期的【启动和执行阶段】。

那么,容器是怎么通过镜像来启动的呢,看一下上面的镜像结构图:

在这里插入图片描述
当一个容器启动时,Docker会在容器的最顶层,加载一个读写文件系统,也就是一个可写的文件层。我们在Docker中运行的程序,就是在这个层中进行执行的。

当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,我们想修改一个文件,这个文件首先会从读写层下面的只读层,复制到上面的读写层,该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏,这就是Docker中的一个重要技术,即写时复制(copy on write),每个只读镜像层都是只读的,并且以后永远不会变化。

当创建一个新容器时,Docker会构建一个镜像栈,就像上图中展现的,在栈的最顶层添加可写层。这个读写层,加上下面的镜像层,以及一些配置数据,就构成了一个容器,也即是:容器 = 镜像 + 可写层

容器的这种特点,加上镜像分层的框架,使我们可以快速的构建镜像,并允许包含我们自己的应用程序和服务的容器。

2.5 Docker Registry 仓库

Docker用仓库来保存用户构建的镜像,仓库分为“公有”和“私有”两种。

Docker公司自己提供了一个公有的仓库,叫做“Docker Hub”。我们可以在“Docker Hub”上去注册账号,分享并保存自己的镜像。目前“Docker Hub”已经有了非常丰富的镜像,所以我们也可以通过“Docker Hub”来查找我们需要的镜像,为我们节省很多的构建镜像的时间。

当然,我们也可以架设自己的私有仓库,后面会有所介绍。

回顾一下Docker的各个组成部分的关系:

00
我们通过客户端,来访问Docker的守护进程,从而操作Docker的容器,而容器是通过镜像来创建的,而镜像保存在仓库中。

2.6 总结

  1. 五大组成部分
    00
  2. C/S架构:Client和Daemon
  3. 镜像Image:层叠的只读文件系统
  4. 容器Container:可写层+镜像
  5. 仓库Registry:是Image的仓库,分为公有和私有

三、Docker容器相关技术简介

本节将了解Docker针对容器的相关底层技术,即Docker容器所依赖的Linux内核技术----Namespace和CGroup技术

Docker依赖Linux内核的特性:Namespace命名空间以及Control groups(CGroup)控制组。通过学习这两种特性,能够更好的帮助我们理解Docker容器的资源分配和管理。

3.1 Namespace命名空间

很多编程语言都包含了“命名空间”的概念,我们可以认为“命名空间”是一种“封装”的概念, 而“封装”本身实际上实现的是代码的隔离。

而在操作系统中,命名空间提供的是系统资源的隔离,而系统资源包括了进程、网络、文件系统等:
在这里插入图片描述
而实际上,Linux实现命名空间的主要目的之一,就是为了实现轻量级虚拟化服务,也就是我们说的容器。

在同一个命名空间下的进程,可以感知彼此的变化,而对其它命名空间中的进程一无所知。这让就可以让容器中的进程产生一种错觉,仿佛它自己置身于一个独立的系统环境中,以此达到“独立”和“隔离”的目的。

我们从Docker公开的文档来看,它使用了5种命名空间:

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

那么,这些隔离的资源,是如何被管理起来的呢?这就需要用到------Control groups(CGroup)控制组了。

3.2 Control groups(CGroup)控制组

代码如下(示例):

Control groups是Linux内核提供的,一种可以限制、记录、隔离进程组所使用的物理资源的机制。

最初是由google工程师提出,并且在2007年时被Linux kernel的内核中的2.6.24版本引进。可以说,Control groups就是为容器而生的,没有Control groups就没有容器技术的今天。

Control groups提供了以下功能:

  • (1) 资源限制
    例如,memory(内存)子系统可以为进程组设定一个内存使用的上限,一旦进程组使用的内存达到了限额,该进程组再发出内存申请时,就会发出“out of memory”(内存溢出)的警告。

  • (2) 优先级设定
    它可以设定哪些进程组可以使用更大的CPU或者磁盘IO的资源。

  • (3) 资源计量
    它可以计算进程组使用了多少系统资源。尤其是在计费系统中,这一点十分重要。

  • (4) 资源控制
    它可以将进程组挂起或恢复。

3.3 Namespace和CGroup带给Docker的能力

到这里我们了解了Namespace和CGroup的概念和职能,而这两个特性带给了Docker哪些能力呢?如下:

  • (1) 文件系统隔离
    首先是文件系统的隔离,每个Docker的容器,都可以拥有自己的root文件系统。

  • (2) 进程隔离
    每个容器都运行在自己的进程环境中。

  • (3) 网络隔离
    容器间的虚拟网络接口和IP地址都是分开的。

  • (4) 资源的隔离和分组
    使用cgroups将cpu和内存之类的资源独立分配给每个Docker容器。

3.4 总结

  1. Namespace命名空间:隔离
  2. Control groups(CGroup)控制组 :管理隔离资源

总结

我们了解了Docker是什么、Docker由哪些部分组成、Docker容器的能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值