揭开容器的神秘面纱:帮助初学者深入了解容器技术

戳蓝字“CSDN云计算”关注我们哦!


本文转载自:Docker 


640?


简介

640?


无论你是学生,还是公司的开发人员,或是软件爱好者,相信你都听说过容器。 你可能还听说容器是轻量级虚拟机,但这究竟意味着什么,容器究竟是如何工作的,以及它们为什么如此重要呢?
本文将带你深入了解容器,它们的关键技术思想,以及它们的应用。 除了计算机科学的基本概念之外,你不需要该领域的其它任何先决知识。


内核和操作系统

640


你的笔记本电脑以及其它所有计算机都是基于CPU,持久存储(磁盘驱动器,SSD),内存,网卡等硬件构建的。
要与此硬件进行交互,操作系统中被称为内核的软件将充当硬件与系统其余部分之间的桥梁。内核负责调度要运行的进程(程序),管理设备(在磁盘和内存上读写地址)等等。
操作系统的其余部分用于引导和管理用户进程的运行用户空间,并将不断与内核进行交互。
640?内核是操作系统的一部分,并与硬件接口。 整个操作系统都位于“内核空间”中,而用户程序则位于“用户空间”中。 内核空间负责管理用户空间。


虚拟机

640?


假定你有一台运行MacOS的计算机和一个可以在Ubuntu上运行的应用程序。一个常见的解决方案是在运行Ubuntu的MacOS计算机上启动虚拟机,然后在那里运行你的程序。
虚拟机由某些特定的硬件和内核虚拟化组成,运行客户操作系统。称为管理程序的软件创建虚拟化硬件,其可以包括虚拟磁盘,虚拟网络接口,虚拟CPU等。虚拟机还包括可以与此虚拟硬件通信的宾客内核。
管理程序可以托管,这意味着它是一些在主机操作系统(MacOS)上运行的软件,如示例中所示。它也可以是裸机,直接在机器硬件上运行(替换你的操作系统)。无论哪种方式,管理程序方法都被认为是重量级的,因为它需要虚拟化多个部分(如果不是全部硬件和内核)。
当同一台机器上需要有多个隔离组时,为每个组运行一个VM太繁重且浪费资源,不是一个好方法。
640?开销不按比例
VM需要硬件虚拟化才能实现机器级隔离,而容器则只需要在同一操作系统内进行隔离操作。 随着隔离空间数量的增加,开销差异变得非常明显。 普通的笔记本电脑可以运行数十个容器,但很难运行一台VM。


cgroups

640


2006年,Google的工程师发明了Linux“控制组”,缩写为cgroups。这是Linux内核的一项功能,可隔离和控制用户进程的资源使用情况。
这些进程可以放入命名空间,实质上是共享相同资源限制的进程集合。计算机可以有多个命名空间,每个命名空间都具有内核强制执行的资源属性。
我们可以管理每个命名空间的资源分配,以便限制一组进程可以使用的总CPU,RAM等的数量。例如,后台日志聚合应用程序可能需要限制其资源,以免意外地压倒它正在记录的实际服务器。
虽然不是原始功能,但Linux中的cgroup最终被重新设计为包含命名空间隔离的功能。命名空间隔离本身并不新鲜,Linux已经有多种命名空间隔离。一个常见的例子是进程隔离,它将每个单独的进程分开并防止诸如共享内存之类的事情。
cgroup隔离是一种更高级别的隔离,可确保cgroup命名空间中的进程独立于其他命名空间中的进程。下面概述了一些重要的命名空间隔离功能,为我们对容器的隔离奠定了基础。
  • PID(进程标识符)命名空间:这可确保一个命名空间内的进程不知道其他命名空间中的进程。

  • 网络命名空间:隔离网络接口控制器,iptables,路由表和其他低级网络工具。

  • 挂载命名空间:已挂载文件系统,因此命名空间的文件系统范围仅限于已挂载的目录。

  • 用户名空间:将命名空间内的用户限制为仅限该命名空间,并避免跨命名空间的用户ID冲突。


简单地说,每个命名空间看起来都是它自己的机器。


Linux 容器

640?


Linux cgroups为一种名为Linux容器(LXC)的技术铺平了道路。 LXC实际上是我们今天所知的第一个实现容器的主要实现,利用cgroup和命名空间隔离来创建具有独立进程和网络空间的虚拟环境。
从某种意义上说,这允许独立和隔离的用户空间。 容器的概念直接来自LXC。 事实上,早期版本的Docker直接构建在LXC之上。
Docker
Docker是最广泛使用的容器技术,也是大多数人在引用容器时的意思。 虽然还有其他开源容器技术(如CoreOS的rkt)和大型公司构建自己的容器引擎(如谷歌的lmctfy),但Docker已成为容器化的行业标准。 它仍然建立在Linux内核和最近的Windows提供的cgroups和命名空间之上。640图片来源:Docker
Docker容器由多层镜像组成,二进制文件一起打包到一个包中。 基本镜像包含容器的操作系统,该操作系统可以与主机的操作系统不同。
容器的操作系统是镜像形式。 这不是主机上的完整操作系统,不同之处在于镜像只是操作系统的文件系统和二进制文件,而完整的操作系统包括文件系统,二进制文件和内核。
在基础镜像的顶部是多个镜像,每个镜像构建容器的一部分。 例如,在基本镜像的顶部可以是包含apt-get依赖性的镜像。 最重要的可能是包含应用程序二进制文件的镜像,依此类推。
很酷的部分是如果有两个带有镜像层a,b,c和a,b,d的容器,那么你只需要在本地和存储库中存储每个镜像层a,b,c,d的一个副本。 这是Docker的联合文件系统。
640?
由散列标识的每个镜像只是构成容器的许多可能镜像层之一。但是,容器仅由其顶级镜像标识,该镜像具有对父镜像的引用。此处显示的两个顶级镜像(镜像1和镜像2)共享前三个图层。镜像2具有两个附加的配置相关层,但与镜像1共享相同的父镜像。
引导容器时,将从repo下载镜像及其父镜像,创建cgroup和命名空间,并使用该镜像创建虚拟环境。在容器内,镜像中指定的文件和二进制文件似乎是整个计算机中的唯一文件。然后启动容器的主进程,并将容器视为活动状态。
Docker还有其他一些非常酷的功能,例如写入时复制,卷(容器之间的共享文件系统),docker守护程序(管理机器上的容器),版本控制的存储库(如容器的Github)等等。要了解有关它们的更多信息并查看有关如何使用Docker的一些实际示例,这篇Medium上的文章[1]非常有用。
640命令行客户端(1)告诉计算机上的进程名为docker daemon(2)该做什么。 守护程序从注册表/存储库中提取图像(3)。 这些镜像在本地计算机上缓存(4),并且可以由守护程序启动以运行容器(5)。 图片来源:Docker。


为什么使用容器

640


除了工艺隔离外,容器还具有许多其他有益的特性。
容器可作为一个独立的单元,可以在任何支持它的地方运行。在每个实例中,容器本身都是完全相同的。如果主机操作系统是CentOS,Ubuntu,MacOS,甚至是像Windows这样的非UNIX系统都无关紧要——从容器内部看操作系统将是容器指定的任何操作系统。因此,你可以确定你在笔记本电脑上构建的容器也将在公司的服务器上运行。
容器还充当标准化的工作或计算单元。一个常见的范例是每个容器运行单个Web服务器,数据库的单个分片或单个Spark工作程序等。然后,为了扩展应用程序,你只需要扩展容器的数量。
在这个范例中,每个容器都有一个固定的资源配置(CPU,RAM,线程数等),并且扩展应用程序需要只扩展容器的数量而不是单个资源原语。当应用程序需要按比例放大或缩小时,这为工程师提供了更容易的抽象。
容器也是实现微服务架构的一个很好的工具,每个微服务只是一组协作容器。例如,可以使用单个主容器和多个从容器来实现Redis微服务。
这种(微)服务导向架构具有一些非常重要的属性,使工程团队可以轻松创建和部署应用程序(有关更多详细信息,请参阅我之前的文章[2])。


编排

640?


自从Linux容器出现以来,用户一直试图在许多虚拟机上部署大型应用程序,其中每个进程都在自己的容器中运行。这样做需要能够在数百个虚拟机中有效地部署数十到数千个容器,并管理他们的网络,文件系统,资源等。今天Docker使它更容易,因为它公开了抽象来定义容器网络,文件卷系统,资源配置等。
但是仍然需要一个工具来:
  • 真实地采取规范并将容器分配给机器(调度)

  • 真实地通过Docker在机器上启动指定的容器

  • 处理升级/回滚/系统不断变化的性质

  • 应对容器崩溃等故障

  • 创建集群资源,如服务发现,VM间网络,集群入口/出口等。


这组问题涉及在一组(可能是瞬态的或不断变化的)容器之上构建的分布式系统的编排,人们已经建立了一些非常奇妙的系统来解决这个问题。
在下一篇文章中,我将深入讨论Kubernetes(主流的开源编排器)的实现,以及两个同样重要但鲜为人知的Mesos和Borg。
相关链接:
  1. https://medium.freecodecamp.org/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b

  2. https://hackernoon.com/how-microservices-saved-the-internet-30cd4b9c6230?gi=d7bc571ea278



推荐阅读

  • 5G大规模商用来临之前,你必须知道的几个知识点

  • “离开360时,它只给了我一块钱”

  • AI找Bug,一键快速预测

  • 原子互换:一统公链江湖的神来之笔

  • 春晚鬼畜 B 站日排行最高,赵本山:我的时代还没有结束!

  • PDF翻译神器,再也不担心读不懂英文Paper了

  • 新闻联播也可以拿来做数据分析?

  • 高晓松侃5G!2019开年大讲揭示运营商的秘密


1.微信群:

添加小编微信:color_ld,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


2.征稿:

投稿邮箱:liudan@csdn.net;微信号:color_ld。请备注投稿+姓名+公司职位。

640?wx_fmt=png喜欢就点击“好看”吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程休眠2

package com.wuming.state;import java.text.SimpleDateFormat; import java.util.Date;//模拟倒计时 public class TestSleep2 {public static void main(String[] args) {/* try {tenDown();} catch (InterruptedException e) {e.printStackTrace();}*//* 109876…

C语言 文件读写 fseek 函数 - C语言零基础入门教程

目录 一.fseek 函数简介二.fseek 函数实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fseek 函数简介 fseek 函数用来移动文件流的读写位置;就好比播放器,可以直接拖拽到精彩的时间点一样,fseek 函数…

微服务精华问答 | 微服务有什么优点和不足呢?

戳蓝字“CSDN云计算”关注我们哦!过去几年来,“微服务架构”这个术语出现了,它描述了一种将软件应用程序设计为可独立部署的服务套件的特定方式。尽管这种架构风格没有确切的定义,但围绕业务能力,自动化部署&#xff0…

C语言 文件读写 ftell 函数 - C语言零基础入门教程

目录 一.ftell 函数简介二.ftell 函数实战三.ftell 函数经典使用四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.ftell 函数简介 C 语言函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数,ftell 函数声明如下&a…

线程礼让详细讲解

礼让线程,让正执行的线程停止,但不阻塞 将线程从运行状态转为就绪状态 让cpu重新调度,礼让不一定成功,看cpu心情 package com.wuming.state;public class TestYield {public static void main(String[] args) {MyYield myYield…

C语言 文件读写 fgetc 函数 - C语言零基础入门教程

目录 一.fgetc 函数简介二.fgetc 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fgetc 函数简介 fgetc 函数用于从文件流中读取一个字符&#xff0c;其原型为&#xff1a; #include <stdio.h> #include <stdlib.h> /…

Gartner预测2019年全球IT支出将达到3.8万亿美元

戳蓝字“CSDN云计算”关注我们哦&#xff01;【2019年1月29日】全球领先的信息技术研究和顾问公司Gartner表示&#xff0c;2019年全球IT支出将达到3.76万亿美元&#xff0c;较2018年增长3.2%。Gartner研究副总裁John-David Lovelock表示&#xff1a;“尽管经济衰退传闻、英国脱…

多线程join,强制执行完

想象成插队 package com.wuming.state; //测试join public class TestJoin implements Runnable{/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the objects* <code>run<…

C语言 文件读写 fputc 函数 - C语言零基础入门教程

目录 一.fputc 函数简介二.fputc 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fputc 函数简介 fputc 函数是将字符 c 写到文件指针 stream 所指向的文件的当前写指针的位置&#xff0c;声明如下&#xff1a; #include <stdi…

多线程观测状态

package com.wuming.state;import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;//观察测试线程的状态 public class TestState {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() -> {for (int i 0; i < 5; i) {t…

4个最受欢迎的大数据可视化工具!

戳蓝字“CSDN云计算”关注我们哦&#xff01;想像阅读书本一样阅读数据流&#xff1f;这只有在电影中才有可能发生。 在现实世界中&#xff0c;企业必须使用数据可视化工具来读取原始数据的趋势和模式。大数据可视化是进行各种大数据分析解决的最重要组成部分之一。 一旦原始数…

C语言 文件读写 fgets 函数 - C语言零基础入门教程

目录 一.fgets 函数简介二.fgets 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fgets 函数简介 fgets 函数功能为从指定的流中读取数据&#xff0c;每次读取一行。其原型为: #include <stdio.h> #include <stdlib.h>…

边缘计算与物联网精华问答 | 边缘计算和物联网有什么关系?

戳蓝字“CSDN云计算”关注我们哦&#xff01;随着物联网时代到来&#xff0c;云计算平台将面临着海量设备接入、海量数据等高难度挑战,这使得云计算中心实时返回数据决策也变成了不可能的任务。于是&#xff0c;边缘计算开始进入到公众的视线。1Q&#xff1a;边缘计算和物联网有…

C语言 文件读写 fputs 函数 - C语言零基础入门教程

目录 一.fgets 函数简介二.fgets 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fgets 函数简介 fgets 函数功能为从指定的流中读取数据&#xff0c;每次读取一行。其原型为: #include <stdio.h> #include <stdlib.h>…

守护线程讲解

线程分用户线程和守护线程 虚拟机必须确保用户线程执行完毕 虚拟机不用等待守护线程执行完毕 后台记录操作日志&#xff0c;监控内存&#xff0c;垃圾回收 package com.wuming.state; //测试守护线程 //上帝守护你 public class TestDaemon {public static void main(Strin…

要闻君说:FaceTime的服务究竟坑有多大?CNCF 技术监督委员会首添中国面孔,来自阿里!高通华为暂和解……...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。终于等到了工作日的最后一天&#xff0c;内心狂喜&#xff0c;想必有的看官已经放假啦。十分感谢小伙伴们长达一月的陪伴&#xff0c…

C语言 fprintf 函数 - C语言零基础入门教程

目录 一.fprintf 函数简介二.fprintf 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fprintf 函数简介 fprintf 是 C / C 中的一个格式化库函数&#xff0c;位于头文件 中&#xff0c;其作用是格式化输出到一个流文件中&#xff1…

线程同步机制

同步&#xff1a;多个线程操作同一个资源 并发&#xff1a;同一个对象被多个线程同时操作 多个线程进入线程对象等待池形成队列&#xff0c;队列锁能保证线程安全性

云漫圈 | 漫画:什么是加密算法?

戳蓝字“CSDN云计算”关注我们哦&#xff01;文章来自&#xff1a;程序员小灰作者&#xff1a;小灰加密算法的历史加密算法最早诞生在什么时候&#xff1f;是在计算机出现之后吗&#xff1f;不不不&#xff0c;早在古罗马时期&#xff0c;加密算法就被应用于战争当中。在大规模…

C语言 sprintf 函数 - C语言零基础入门教程

目录 一.sprintf 函数简介二.sprintf 函数使用三.sprintf/fprintf/printf 函数区别四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.sprintf 函数简介 sprintf 函数用于将格式化的数据写入字符串&#xff0c;其原型为&#xff1a; #include…