Docker(一)--基本概念

1.docker简介

1.1 云计算简介

什么是云计算:

       云计算是一种资源的服务模式,该模式可以实现随时随地、便捷按需地从可配置计算资源共享池中获取所需的资源(如网络、服务器、存储、应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销,你甚至可以再也不用理会那些令人头痛的传统服务供应商了。
       随着云计算的兴起,像"cloud-native"和"cattle not pets"之类的术语行话也纷纷出现,它们都表达了一个意思,那就是整个和云计算相关的IT领域都需要彻底改变现有的意识形态,不能再像过去一样看待基础设施组件,因为在云计算模式下,基础设施已经不再是一个既庞大又昂贵,而且专业的令人难以企及的怪物,它不再需要繁琐的手动维护,也不再难以改换。

云计算经典架构:

在这里插入图片描述
IaaS(Infrastructure as a Service 基础设施即服务):IaaS层为基础设施运维人员服务,提供计算、存储、网络及其他基础资源,云平台使用者可以在上面部署和运行包括操作系统和应用程序在内的任意软件,无需再为基础设施的管理而分心。
PaaS(Platform as a Service 平台即服务):PaaS层为应用开发人员服务,提供支持应用运行所需的软件运行时环境、相关工具与服务,如数据库服务、日志服务、监控服务等,让应用开发者可以专注于核心业务的开发。
SaaS(Software as a Service 软件即服务):SaaS层为一般用户服务,提供了一套完整可用的软件系统,让一般用户无需关注技术细节,只需通过浏览器、应用客户端等方式就能使用部署在云上的应用服务。

1.2 虚拟化技术分类

硬件级虚拟化(hardware-level-virtualization):硬件级虚拟化是运行在硬件之上的虚拟化技术,它的管理软件也就是我们通常说的 hypervisor 或者 virtual machine monitor,它需要模拟的就是一个完整的操作系统,也就是我们通常所说的 Hyper-V 的虚拟化技术,VMWare,Xen,VirtualBox,AWS EC2 和阿里云ECS都是用的这种技术。
操作系统级虚拟化(os-level-virtualization):操作系统级虚拟化是运行在操作系统之上的,它模拟的是运行在操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,也称为容器化技术。Docker 正是容器虚拟化中目前最流行的一种实现。

1.3 什么是docker

       根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植并且简单易用的容器解决方案。Docker的源代码托管在GitHub上,基于Go语言开发并遵从Apache 2.0协议。Docker可在同期内部快速自动化地部署应用,并通过操作系统内核技术(namespaces、cgroups等)为容器提供资源隔离与安全保障。
       最初,Linux容器技术是基于LXC(LinuX Container)的,Docker在易用性和稳定性方面做了很大改善,其三大核心功能就是CGroups、Namespaces 和 UnionFS。CGroups 技术同来限定一个进程的资源使用;在一个操作系统之上,用户ID、机器名等资源是全局的,运行的进程间都是访问同一份资源,为了达到隔离的目的,Linux又出现了Namespace技术用来划分不同的命名空间;而UnionFS则是用来处理分层镜像的功能。
:LXC是Docker早期使用的技术,后来Docker自行开发了libcontainer,二者都是对Linux内核功能的封装。

1.4 docker解决的问题

       可以看出,容器技术的生态系统自下而上分别覆盖了 IaaS层和 PaaS层所涉及的各类问题,包括资源调度、编排、部署、监控、配置管理、存储网络管理、安全、容器化应用支撑平台等。除了基于容器技术解决构建分布式平台无法回避的经典问题,容器技术主要带来了一下几点好处。

  • 持续部署与测试: 容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。
  • 跨云平台支持: 容器带来的最大的好处之一就是其适配性,越来越多的云平台都支持容器,用户再也无需担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。目前支持容器的IaaS云平台包括但不限于亚马逊平台(AWS)、Google云平台(GCP)、微软云平台(Azure)、OpenStack等,还包括如Chef、Puppet、Ansible等配置管理工具。
    在这里插入图片描述
  • 环境标准化和版本控制: 基于容器提供的环境一致性和标准化,你可以使用Git等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,你还能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。
  • 高资源利用率与隔离: 容器没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有不错的资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,确保了应用间不会相互影响。
  • 容器跨平台性与镜像: Linux容器虽然早在Linux2.6版本内核已经存在,但是缺少容器的跨平台性,难以推广。容器在原有Linux容器的基础上进行大胆革新,为容器设定了一整套标准化的配制方法,将应用及其依赖的运行环境打包成镜像,真正实现了"构建一次,到处运行" 的理念,大大提高了容器的跨平台性。
  • 提高安全性: Docker会保护我们在容器内运行的软件。软件程序可能会有各种各样的情况,出现错误或带来安全风险: 如程序可能是由攻击者编写的、好心的开发人员也会编写出有害的错误程序、程序可能会意外地由于输入处理的故障,被攻击者利用。无论何种方式,运行软件都将给计算机带来安全威胁。由于运行软件是拥有计算机的主旨,应谨慎地应用实际的降险措施。像物理的牢房,容器里的任何东西都只能访问在它内部的东西。此规则有例外,但仅在用户显示创建时,容器限制了一个程序对其他程序带来的影响范围、可访问的数据和系统资源的影响范围。
    在这里插入图片描述
  • 易于理解且易用: Docker的英文原意是处理集装箱的码头工人,标志是鲸鱼运送一大堆集装箱,集装箱就是容器,生动好记,易于理解。一个开发者可以在15分钟之内入门Docker并进行安装和部署,这是容器使用史上的一次飞跃。因为它的易用性,有更多的人开始关注容器技术,加速了容器标准化的步伐。
  • 应用镜像仓库: Docker官方构建了一个镜像仓库,组织和管理形式类似于GitHub,其上已积累了成千上万的镜像。因为Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利。

2.docker深入解析

2.1 docker的架构

       Docker使用的是C/S结构。Docker Client 同 Docker Daemon 进行交互,其中主要的工作是通过 Daemon 来完成,包括拉取镜像、编译镜像、运行容器、发布容器等。Docker Client 和 Docker Daemon 可以运行在同一个系统上,也可以通过远程方式进行访问。
在这里插入图片描述

  • Docker Daemon: Docker Daemon 运行在一个主机上,用户并不是直接同Docker Daemon进行交互,而是通过Docker Client 进行访问。
  • Docker Client: Docker Client 是主要的用户访问Docker的渠道。用户通过它对 Docker Daemon 进行访问控制。
  • Docker Image: Docker Image 是一个只读的模板。Image是用来创建容器的。Docker 提供了一种简单的方式来创建 Image和更新已有的 Image,用户可以从网上下载 Image,也可以自己制作 Image。
  • Docker Containers: Docker容器就像一个文件夹。一个容器包含了应用程序运行所需的所有环境。每个容器都源于某一个Docker Image。Docker容器可以运行、开始、停止、移动并删除。每个容器都是完全隔离的、安全的应用。
  • Docker Registry: Docker Registry 是存放Image的仓库。我们可以使用公有的和私有的Registry来进行下载和上传Image。公共的Docker Registry 位于 Docker Hub,但是国内访问比较慢。Docker Hub 包含了大量已有的Image,供用户使用。你可以基于之前的 Image来创建自己的 Image。

2.2 Docker Image 工作方式

       Docker Image 是只读模板,并随容器一起启动。每个镜像包含多个层。Docker Image使用的是 UnionFS(Union File System)来将这些层组合成一个镜像。UnionFS可以将文件和目录(通常称作Branch)进行透明的层叠组装,然后形成一个单独的文件系统。Docker为什么轻量,就是因为使用了这些层状的文件系统。当用户修改一个Docker Image时(如更新应用程序)一个新的层就会被建立。因此,这是一种增量式的修改,而不是新建一个全新的镜像,这也是区别于传统虚拟机的特点。当发布一个新的镜像时,只需发布差异的部分,因此速度就非常快。每个镜像都来自于一个最基础的镜像。

2.3 Docker Registry 工作方式

       Docker Registry是镜像的仓库,你编译完成一个镜像时,可以推送到公共的Registry,如Docker Hub(默认,也可使用国内阿里仓库如https://dev.aliyun.com/search.html),也可以推送到自己的私有Registry。使用Docker Client,可以搜索已经发布的镜像,并从中拉取镜像到本地,并在容器中运行。Docker Hub 提供了公有和私有的Registry。所有人都可以搜索和下载公共镜像。私有仓库只有私有用户能够查询和下载。

2.4 底层的技术

Namespace(资源隔离): Docker 使用了Namespace 技术来隔离工作区,也就是通常所说的容器。当容器运行时,Docker创建了一系列的Namespace。通过Namespaces,容器运行在它自己的独立命名空间之中,而外层没有访问权限。目前,Docker 使用了以下 Namespace:
在这里插入图片描述

  • UTS:提供了主机名和域名的隔离,这样每个Docker容器就可以拥有独立的主机名和域名了,在网络上可以被视为一个独立的节点,而非宿主机上的一个进程。
  • IPC:进程间通信涉及的IPC资源包括常见的信号量、消息队列和共享内存。申请IPC资源就申请了一个全局唯一的32位ID,所以IPC namespace中实际上包括了系统IPC标识符以及实现POSIX消息队列的文件系统。在同一个IPC namespace下的进程彼此可见,不同IPC namespace下的进程则互相不可见。
  • PID:PID namespace隔离非常实用,它对进程PID重新标号,即两个不同namespace可以有相同的PID。每个PID namespace中的第一个进程"PID 1",都会像传统Linux中的init进程一样拥有特权,起特殊作用。
  • Mount:mount namespace通过隔离文件系统挂载点对隔离文件系统提供支持,它是历史上第一个linux namespace。
  • Network:network namespace主要提供了关于网络资源的隔离,包括网络设备、Ipv4和Ipv6协议栈、IP路由表、防火墙等等。
  • User:user namespace主要隔离了安全相关的标识符(identifier)和属性(attribute),包括用户ID、用户组ID、root目录、key(指密钥)以及特殊权限。

Control Groups(资源限制): 实现CGroups的主要目的是为不同用户层面的资源管理,提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,CGroups提供了以下四大功能。

  • 资源限制:CGroups可以对任务使用的资源总额(包括CPU、Memory、IO等)进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)提示。
  • 优先级分配:通过分配的CPU时间片数量及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。
  • 资源统计:CGroups可以统计系统的资源使用量,如CPU使用时长、内存用量等,这个功能非常适用于计费。
  • 任务控制:CGroups可以对任务执行挂起、恢复等操作。

Union File System: UnionFS 用来对文件系统进行分层,通过分层可以使镜像更加轻量级和快捷。Docker 可以使用多种不同的UnionFS,如Aufs、Btrfs、VFS、DevicemapperFS。

猜你喜欢

转载自blog.csdn.net/rightlzc/article/details/82961841