[云原生专题-6]:容器 - Docker概述以及虚拟机的比较
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-6]:容器 - Docker概述以及虚拟机的比较相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122652769
目录
前言:
在云原生中,Docker是一个绕不开的技术,它是云原生技术和DevOps在应用程序部署环节最核心的技术。
第1章 Docker概述
1.1 Docker的详解教程
1.2 Docker容器概述
Docker,容器。
Docker 是一个开源的应用程序容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者把他们的应用程序以及相应的依赖包打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器完全使用沙箱机制,容器与容器相互之间不会有任何接口(类似 iPhone 的 app),他们之间是完全隔离,效果与两个独立的物理主机相似, 更重要的是,相对于虚拟机,容器性能开销极低。
当然,容器与容器之间的应用程序,可以通过网络进行通信。
1.3 哪些人适合了解容器
容器主要发生在应用程序的发布与部署环境,因此主要适合运维工程师及后端开发人员。
1.4 Docker的应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.5 Docker 的优点
Docker 是一个用于开发,交付和运行(三个环节)应用程序的开放平台。
Docker 使您能够将应用程序与基础架构分离,使用标准的方式交付与部署应用程序,从而可以快速交付软件。
借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
通过docker,可以轻松的重启一个应用程序。
(1) 快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
(2)响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
(3)在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
(4)资源的隔离
不同的容器之间,无论是相同镜像生成的容器,还是不同的容器生成的镜像,他们之间是隔离的。
(5)统一的标准
无论C++编写的应用程序,还是Java编写的,还是python编写的,还是go语言编写的应用程序,他们采用统一的、标准的方式发布和部署,甚至是统一和标准的方式运行:docker run xxx.
第2章 Docker的架构与架构元素
2.1 Docker 包括四个基本概念:
-
镜像(Image):Docker 镜像(Image),就相当于是一个Linux rootfs 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器的本质是Linux rootfs镜像。
-
应用程序:应用程序以及其依赖关系,被安放在镜像中,是镜像中的一组文件。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
2.2 Docker的网络架构
Docker 使用客户端-服务器 (C/S) 架构模式,通过服务器端的Dockerr Docker Daemon服务器使用远程API来管理和创建远程的Docker容器。
Docker 容器由Docker 镜像来创建,是docker镜像的实例。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
一个镜像,可以生产多个容器的实例 。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (Redirecting…) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
2.3 Docker的处理流程
- docker build:通过doker daemon生成docker镜像
- docker pull:通过doker daemon把docker镜像上传到Docker hub中
- docker run: 通过doker daemon运行docker镜像
第3章 容器与虚拟机的比较
3.1 虚拟化(重量级的容器)
(1)什么是虚拟化
虚拟机(VM)是共享一个服务器的物理资源的操作系统。它是主机硬件上的Guest
,因此也被称为Guest
虚拟机。
虚拟机由几层组成。支持虚拟化的层是hypervisor
。hypervisor
是一种虚拟化服务器的软件, 有它负责在主机操作系统上创建和管理虚拟机环境,如VMWare虚拟机软件。
虚拟机运行应用程序所需的一切都包含在虚拟机里--虚拟化的硬件、操作系统以及任何所需的二进制文件和库。因此,虚拟机具有自己独立的基础架构(虚拟硬件、全套操作系统、全套中间件、应用程序、依赖库等)。
(2)虚拟机的优势
虚拟机可减少在物理服务器设备上的支出,可以利用一个物理服务器资源切分成多个独立的虚拟机。
由于只有一台物理主机,因此可以利用虚拟机管理程序的集中功能高效地管理所有虚拟环境。这些系统完全相互独立,这意味着你可以在不同的虚拟机里安装不同的系统环境。比如VMWare虚拟机。
最重要的是,虚拟机与主机操作系统隔离,是进行实验和开发应用程序的安全场所。
(3)虚拟机的劣势
虚拟机可能占用主机的大量系统资源,虚拟机的大小为数GB。在虚拟服务器上运行单个应用程序意味着还要运行Guest OS以及Guest OS运行所需的所有硬件的虚拟副本。这样很快就增加了很多RAM和CPU资源消耗。
迁移虚拟机上运行的应用程序的过程也可能很复杂,因为它始终附加在操作系统上。因此,必须同时迁移应用程序和操作系统。同样,在创建虚拟机时,系统管理程序会分配专用于VM的硬件资源。不过与运行单独的实体服务器相比,这仍然是经济的。
3.2 容器(轻量级的虚拟机)
(1)什么是容器
容器是一个不依赖于操作系统,运行应用程序的环境,由Docker Engine引擎负责构建和管理这样的运行环境。
它通过Linux的Namespaces和Cgroups技术对应用程序进程进行隔离和限制的,Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups 的作用是限制分配给进程的宿主机资源。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。
Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;
而Cgroups的作用是限制,它给这个世界围上了一圈看不见的墙。
通过Mount Namespace可以修改容器进程对自己的文件系统 "挂载点"的认知。
在容器进程启动之前重新挂载它的整个根目录"/"(通过pivot_root系统调用改变进程的文件系统,如果系统不支持,则使用chroot),而由于Mount Namespace的存在,这个挂载对宿主机不可见的。这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。
它还有一个更为专业的名字,叫做:rootfs(根文件系统)。rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。它操作系统内核之间,通过标准的Posix接口进行交互,与主机通过mount的文件系统的加载点进行交互。
所以说,rootfs 只包括了操作系统的 "躯壳",并没有包括操作系统的内核。同一台机器上的所有容器,都会共享宿主机操作系统的内核。这是与虚拟机一个重大的差别,每个虚拟机有独立的操作系统内核镜像,而docker并不包括操作系统内核镜像,所有docker中的程序的运行和调度,完全依赖主机的操作系统的调度。容器只起着隔离的作用。
(2)容器的优势
容器镜像占用的硬盘大小比虚拟机小很多,甚至可以小到10MB,可以轻松限制容器的内存和CPU使用率。与部署应用需要部署整个操作系统的虚拟机相比,容器非常轻巧且启动迅速。这样让我们可以快速扩展容器并添加相同的容器。
由于rootfs里打包的不只是应用,而是应用程序在文件系统中的所有文件和目录,也就意味着,应用以及它运行所需要的所有依赖,都被封装在了一起。这就赋予了容器所谓的一致性:无论在本地、云端,还是在一台任何地方的机器上,用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就能被重现出来(除了操作系统内核文外)
容器对于持续集成和持续部署(CI / CD)实施也是极好的选择。他们通过在开发人员之间分发和合并镜像来促进协作开发。
(3)容器的劣势
容器仍无法提供与虚拟机相同的安全性和稳定性。
如果容器里的应用程序需要配置内核参数、跟内核进行直接的交互,这些都是操作的宿主机操作系统的内核,它对于该机器上的所有容器来说是一个“全局变量”,牵一发而动全身。
由于容器之间共享主机的内核,因此不能像虚拟机一样完全隔离。容器是进程级的隔离,而不是操作系统级别的隔离,一个容器可以通过影响宿主机内核的稳定性来影响其他容器。
一旦容器执行了任务,它就会关闭并删除其中的所有数据,这可能会影响其他容器对该数据的读写。如果希望数据保留下来,则必须使用"数据卷"进行保存,这需要在主机上进行手动配置。
另外,Docker的本质是Linux rootf镜像,它的运行需要Linux内核的支撑,如果需要windows环境中安装docker环境,需要首先构建Linux的环境,即需要先安装虚拟机。
第4章 Docker的主要功能
(1)Docker镜像的存储、上传、下载
(2)Docker镜像的制作
(3)Docker镜像的启动与运行
(4)Docker镜像的操作、维护、管理
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122652769
以上是关于[云原生专题-6]:容器 - Docker概述以及虚拟机的比较的主要内容,如果未能解决你的问题,请参考以下文章
[云原生专题-8]:容器 - docker远程镜像仓库管理上传下载存储镜像与常见常用知名镜像
[云原生专题-17]:容器 - docker自带的集群管理工具swarm - 简介原理架构
[ 云原生 | 容器 ] 虚拟化技术之容器与 Docker 概述