文档章节

系统管理员必读的容器入门指南

RancherLabs
 RancherLabs
发布于 08/12 10:46
字数 1745
阅读 25
收藏 0

“容器”无疑是近年IT业界的buzzword,不过,在不同语境下,它对不同的人有不同的含义。在本文中,我将从Linux容器、容器镜像、写时复制等方面来阐释容器的具体含义。

Linux容器

传统意义上的Linux容器实际上只是Linux系统上的普通进程。这些进程组使用资源约束(控制组,即[cgroups])、Linux安全约束(Unix权限、功能、SELinux、AppArmor、seccomp等)和命名空间(PID、网络、挂载等)与其他进程组隔离开来。

如果你启动一个Linux系统并且查看使用cat /proc/PID/cgroup的任意进程,你将看到在cgroup中的某一进程。如果你查看 /proc/PID/status,则会看到其功能。如果你查看/ proc / self / attr / current,你将会获取SELinux的标签们。如果你查看/proc/PID/ns,你会在其中看到一系列命名空间的进程。

所以,如果你将容器定义为具有资源限制、Linux安全约束以及命名空间的进程,那么根据这一定义,Linux系统上的每个进程都运行在容器中。这就是为什么有人说“Linux即容器,容器即Linux”。而容器运行时则是修改这些资源限制、安全约束以及命名空间,并且可以启动容器的程序。

容器镜像

Docker引入了容器镜像的概念,这是一个标准的TAR文件,它包含了:

  • Rootfs (容器根文件系统):在操作系统上带有根目录(/)标识的目录,例如:/usr 、/var 、 /home 等等。

  • JSON文件(容器配置):JSON文件会来规定如何运行rootfs,例如:当容器启动时应该在rootfs中运行什么指令或entrypoint,应该为容器设置什么样的环境变量,容器的工作目录是什么等等。

Docker基础镜像由根文件系统和JSON文件组成,可以通过在基础镜像的根文件系统中安装所需的内容,以更新JSON文件,并且新建一个镜像层,通过这种方式可以制作一个新的镜像。

容器镜像的定义最终由Open Container Initiative(OCI)标准化为OCI镜像规范。

用于构建容器镜像的工具被称为容器镜像构建器(如Dockerfile),有时容器引擎也能够完成构建容器镜像的工作,当然也可以使用一些可以构建容器镜像的独立工具。

Docker获取了这些容器镜像(tarballs)然后将他们上传到一个web服务中,你可以从中拉取他们。然后Docker会开发一个协议以便你顺利拉取这些镜像,而这一web服务便被称为容器镜像仓库。

容器引擎可以从容器镜像仓库中拉取镜像,然后将其重组到容器存储上。此外,容器引擎也能启动容器运行时(如下图)。

Copy On Write(COW)

容器存储通常是一个写时复制(COW)分层文件系统。当你从镜像仓库中拉取一个镜像时,首先,你要从镜像中提取rootfs并且将其放到磁盘上。如果你的镜像由多层组成,那么在COW文件系统中需要将下载的每一层镜像文件储存在不同的层中。COW文件系统允许每一层分开存储,这将分层镜像的共享最大化了。容器引擎通常支持不同类型的容器存储,如overlay、devicemapper、 btrfs、 aufs和 zfs等。

容器运行时

容器引擎将容器镜像下载到容器存储中后,它需要创建一个容器运行时的配置文件。这一配置文件结合了来自调用程序/用户的输入以及容器镜像规范的内容。举个例子,调用程序可能想要对正在运行的容器进行指定的安全性修改、添加环境变量或者将volumes挂载到容器上,这些都是调用程序输入的内容。

容器运行时配置和分解的rootfs同样也被OCI标准化为OCI运行时规范。

最后,容器引擎启动读取运行时规范的容器运行时,修改Linux cgroup、Linux安全约束以及命名空间,并且启动容器命令以创建PID1(Process ID1)。此时,容器引擎可以将stdin / stdout传回调用程序并控制容器(如,停止、启动、附加等)。

请注意,许多新的容器运行时正在让Linux的不同部分来隔离容器。人们先可以使用KVM分离(如迷你虚拟机)运行容器,或者可以使用其他hypervisor策略(例如,拦截容器进程中的所有系统调用)。既然我们已经拥有一个标准的运行时规范,那么就能够通过相同的容器引擎启动这些工具。甚至Windows也可以使用OCI运行时规范来启动Windows容器。

容器编排引擎

容器编排引擎,相比其他容器工具而言,则处于更高的级别。容器编排是用于协调多个不同节点上的容器执行工具。容器编排引擎可以通过与容器引擎通信以管理容器,如启动容器并且将其网络连接在一起。它还能够监控容器以及在负载增加时启动其他容器。

Kubernetes是目前使用最为广泛的容器编排引擎,被大量的中小型企业用户用于开发或生产环境,并且已经成为业界公认的容器编排管理的标准框架。但是原生的Kubernetes因其学习曲线陡峭对于大多数开发人员而言很难直接上手使用。Rancher作为一个开源的企业级Kubernetes容器管理平台,其简洁直观的界面风格和操作体验可以极大程度地解决这一问题。并且Rancher实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,能统一纳管位于不同基础架构上的Kubernetes集群。此外,Rancher也将用户的安全问题放在首位。Kubernetes于8月6日发布新的补丁版本之后,Rancher反应迅速,在1天之后发布了全新版本Rancher 2.2.7,修复了新近的CVE并支持Kubernetes新版本。

访问Rancher Github主页,了解更多新版本信息:

https://github.com/rancher/rancher/releases

© 著作权归作者所有

RancherLabs
粉丝 93
博文 252
码字总数 549249
作品 0
深圳
程序员
私信 提问
Java工程师看过来:入门到高级书单都在这!

关于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是,多!看!书!Java程序员你们准备好了吗?我们大圣众包(www.dashengzb.cn)双手奉上Java程序员必读之热门书单。 入...

大圣众包
2017/01/18
0
0
A Year Of Books - 2016 Javaer书单

A Year Of Books – 2016 Javaer书单 (PS:欢迎留言推荐,很多来自白衣大哥的推荐) 1. OS & Networking 《编码 : 隐匿在计算机软硬件背后的语言》 《Linux内核设计与实现 第3版》 《WireShark...

泥沙砖瓦浆木匠
2016/04/25
151
2
25款大数据入门与实战电子书+视频教程(全程干货)

本资源由菜鸟窝大数据教研团队整理的,共有1.3GB学习资源(电子书)含Hadoop大数据与挖掘实战、Hbase实战、Spark大数据处理技术、Spark高级数据分析、大数据存储MongoDB实战、大数据架构师指...

菜鸟窝
08/06
0
0
Python进阶必读博文视频教程汇总

昨天翻到了一本在github开源的书: Intermediate Python. 就有了此文, 梳理了一下一些之前翻到利于python学习的博文、视频等. 英文的 super Python’s super() considered super! rhettinger是...

小懒人23
2016/05/06
124
0
java程序员从入门到精通

前言 java路漫漫,这是一份针对java服务端开发入门与进阶指南。 建议: 尽量用 google 查找技术资料。 有问题在 stackoverflow 找找,大部分都已经有人回答。 多看官方的技术文档。 ibm deve...

rock912
2016/07/04
129
4

没有更多内容

加载失败,请刷新页面

加载更多

Red Hat Enterprise Linux 7.7 下载

Red Hat Enterprise Linux 7.7 下载 链接: https://pan.baidu.com/s/1JzerTht7seAu93S2H9pljQ 提取码: n8tv 链接: https://pan.baidu.com/s/14csR7RO6S0rb_GjOiA4U8w 提取码: 6s5o —————......

zzimac
8分钟前
2
0
五、数据库连接池

[TOC] 1.基本介绍 <u>无连接池的问题</u> 程序开发的过程中每次使用一个Connection对象都会向底层申请一个对象,用完再关闭连接,这使得每个Connection对象的利用率很低,以至于浪费了资源,...

清醒以敬
9分钟前
2
0
哈希算法的四个应用场景

第一个应用是唯一标识,哈希算法可以对大数据做信息摘要,通过一个较短的二进制编码来表示很大的数据. 第二个应用是用于校验数据的完整性和正确性. 第三个应用是安全加密,我们讲到任何哈希算...

无名氏的程序员
12分钟前
2
0
Spring Boot and Rabbit MQ 异常的时候消息的状态

我们有一个处理消息的方法。 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢。 根据我们的实际情况的观察,如果出现了异常。 但是你没有捕获或者处理异常,这个消息会一直存...

honeymoose
20分钟前
3
0
SpringBoot + WebSocket 开发笔记

1. 服务端的实现,我尝试了两种方式: 第一种是用“@ServerEndPoint”注解来实现,实现简单; 第二种稍显麻烦,但是可以添加拦截器在WebSocket连接建立和断开前进行一些额外操作。   不管用...

Airship
22分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部