Docker容器技术的核心
容器技术的核心
所谓容器,其实是由Linux Namespace、Linux Cgroups和rootfs三种技术构建出来的进程的隔离环境
对于Docker项目来说,其实最核心就是为待创建的用户进程:
- 启动Linux Namespace配置
- 设置指定的Cgroups参数
- 切换进程的根目录(Change Root)
1. Namespace机制
PID Namespace实现创建(clone)出来的进程,认为自己的当前容器里PID为1的进程,看不到宿主机的真正的进程,也看不到其他PID的具体情况
Mount Namespcace实现被隔离的进程只能看到当前Namespace的挂载点信息
Network Namespace实现让被隔离进程看到当前Namespace的网络设备和配置
Linux提供了UTS、IPC、User的Namespace
总结 :Namespce技术修改了应用进程看待整个计算机的“视图”,只能看到某些指定的内容
Namespace隔离机制的不足:
多个容器使用的是同一个宿主机的操作系统内核,windowns上运行Linux容器,或者在低版本的Linux宿主机上运行高版本的Linux容器,是不行的
2. Cgroups
虽然进程被隔离起来了,但是它所能使用的资源,比如CPU、内存,是可以被宿主机上的其他进程占用的,也可以将所有的资源耗尽,而Cgroups解决了这个问题
Cgroups全称是Linux Control Group,主要作用就是限制一个进程能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。
Cgroups的缺点:
/proc文件不知道用户通过Cgroups给容器做了什么资源限制,所以当我们在容器里执行top命令的时候,看到的其实是宿主机的CPU和内存数据
3. rootfs
容器的根目录通常会挂载一个完整的文件系统,在容器启动后就可以用ls /查看根目录所有的内容,
这个挂载在容器根目录,为容器提供隔离后执行环境的文件系统,就是rootfs(容器镜像),
容器镜像中,通过会包括如下目录和文件
bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var
rootfs只是一个操作系统的所有文件和目录,并不包含内核,通过Mount Namespace和rootfs,可以构建出一个完善的文件系统隔离环境,其中使用了chroot和pivot_root两个系统调用切换进程根目录的能力。
在mount namespace被创建后,父进程会把自己的文件结构复制给子进程,而子进程中新的namespace所有的mount操作都只影响自身的文件系统,不对外界产生任何影响。
每次修改rootfs,新的rootfs和旧的就不同了,Docker公司为了解决rootfs的增量修改的功能,创新的提出了层的概念
容器中的层的概念
在rootfs的基础上,Docker公司创新的使用了多个增量rootfs联合挂载一个完整rootfs的方案
例如,C目录是由A和B挂载得到,拥有A和B的所有文件
层分为三种,如下图
1.只读层
位于rootfs最下面,挂载方式是只读,这些层以增量的方式分别包含了操作系统的一部分
2.可读写层
挂载方式为rw,比如,当删除只读的一个xx文件时,这个删除操作实际只是在可读写层创建了一个名叫.wh.xx的文件,当两个层联合挂载后,xx文件会被.wh.xx文件遮挡,相当于“消失了”
在容器中修改文件时,Docker会从上到下在各镜像层中查找文件。找到后会把此文件复制到容器层(可读写层),这就是Copy on Write
3. init层
以一个-init结尾的层,在只读和读写层之间,用来存放/etc/hosts、/etc/resolve.conf等信息,这此文件本来是属于操作系统层的一部分,但是用户往往需要在运行时指定hostname,所以就需要在可读写层修改,这些修改往往保对当前容器有效,我们并不想在docker commit的时候,把这些和读写层一起提交,于是就有了这一层
参考链接:https://coolshell.cn/articles/17010.html
Docker容器技术的核心的更多相关文章
- Docker容器技术的核心原理
目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...
- k8s 核心功能 - 每天5分钟玩转 Docker 容器技术(116)
本节带领大家快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新. 部署应用 执行命令: kubectl run kubernetes-bootcamp \ --im ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)
本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usag ...
- 如何快速部署 Prometheus?- 每天5分钟玩转 Docker 容器技术(85)
上一节介绍了 Prometheus 的核心,多维数据模型.本节演示如何快速搭建 Prometheus 监控系统. 环境说明 我们将通过 Prometheus 监控两台 Docker Host:192. ...
- 学习 Kubernetes 的 Why 和 How - 每天5分钟玩转 Docker 容器技术(114)
这是一个系统学习 Kubernetes 的教程,有下面两个特点: 系统讲解当前最流行的容器编排引擎 Kubernetes包括了安装部署.应用管理.网络.存储.监控.日志管理等多各个方面. 重实践并兼顾 ...
- 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数 ...
- 定时执行 Job - 每天5分钟玩转 Docker 容器技术(135)
Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job.CronJob 配置文件示例如下: ① batch/v2alpha1 是 ...
- Docker容器技术的PaaS云平台架构设计***
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...
随机推荐
- Jquery 小结
1. 名词解释 实例对象:var p1=new Person(); p1就是实例对象 构造:function Person(){} 原型对象:在 JavaScript 中,每当定义一个对象(函数也是 ...
- ansible-yum
#yum 需要在vim /etc/ansible/hosts里面给执行的主机配置 远程调用python的路径不知道为什么默认值认识python2.6.6 vim /etc/ansible/hosts ...
- .NET读写DBF
C# 读写DBF分为两种模式,一种为OLEDB驱动,需要安装一个文件“VFPOLEDBSetup.msi”: 一种为Odbc模式,这种几乎上不需要安装Odbc驱动 我这边用的是第一种. /// < ...
- Asp.Net MVC SingleServiceResolver类剖析
SingleServiceResolver一般用于类工厂创建和注入点接口留白.类工厂创建比如Controller控制依赖于此类的创建,注入点留白实质上是依赖注入所对外预留的接口. 以第二个特性为例. ...
- c#小灶——初识c#
提到c#,就不得不说.net,.net是微软开发的一个平台,简单来说,在这个平台上,可以编写.运行程序.可能很多人觉得这个平台离我们很遥远,其实不然,这个平台就一直在我们的windows操作系统里,默 ...
- 调试过程中发现按f5无法走进jdk源码
debug 模式 ,在fis=new FileInputStream(file); 行打断点 调试过程中发现按f5无法走进jdk源码 package com.lzl.spring.test; impo ...
- maysql的自增字段
因为mysql中的自增字段与oracle数据库是不一样的,所以在这里唠嗑一下mysql的自增字段 1.添加自增字段 1.1 在创建表时添加 create table emp( empno ) auto ...
- 【Java例题】3.1 7、11、13的倍数
1.找出1~5000范围内分别满足如下条件的数: (1) 7或11或13的倍数 (2) 7.11,或7.13或11.13的倍数 (3) 7.11和13的倍数. package chapter3; pu ...
- iText实现pdf导出
/** * AsianTest.java */ import java.io.FileOutputStream; import java.io.IOException; import com.lowa ...
- Markdown 基本语法(后面继续补充)
1.1 Markdown 基础语法 有序内容和无序内容 有序内容:输入1.然后按tab键 无序内容:输入' * ' 或 ' - ' 然后后按tab键 字体的样式 *** 内容 *** 加粗加斜(中间没 ...