1.容器其实不是什么新技术,说白了就是namespace对资源进行隔离,再加UFS实现分层镜像,以及cgroup实现资源限制。这些技术,都是linux中已有的技术,而且有些技术很早之前就有了。

2.上面说了,容器就是用了隔离+分层+限制技术,所以和虚拟机是完全不同的东西,虚拟机那是真真正正的一个操作系统。

3.在/roc/pid/ns下,保存着每一个进程对应的namespace,一共6种,分别是:① 进程通信ns(ipc)、② 挂载ns(mnt)、③pid ns、④网络ns(net)、⑤用户ns(user)、⑥隔离hostname和NIS domain name的uts。

一个进程属于哪个namespace,那么就建立一个链接到该namespace。比如下面,我有一个容器,它里面有两个进程,7344和7327:

$ docker top nginx   ↵
UID PID PPID C STIME TTY TIME CMD
root : pts/ :: nginx: master process nginx -g daemon off;
: pts/ :: nginx: worker process

看一下这两个在同一个容器中的进程他们的namespace以及cgroup:

sudo ls -l /proc//ns                                         ↵
total
lrwxrwxrwx root root Jan : cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx root root Jan : ipc -> 'ipc:[4026532496]'
lrwxrwxrwx root root Jan : mnt -> 'mnt:[4026532494]'
lrwxrwxrwx root root Jan : net -> 'net:[4026532499]'
lrwxrwxrwx root root Jan : pid -> 'pid:[4026532497]'
lrwxrwxrwx root root Jan : pid_for_children -> 'pid:[4026532497]'
lrwxrwxrwx root root Jan : user -> 'user:[4026531837]'
lrwxrwxrwx root root Jan : uts -> 'uts:[4026532495]'
udo ls -l /proc//ns                                          ✔
total
lrwxrwxrwx Jan : cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx Jan : ipc -> 'ipc:[4026532496]'
lrwxrwxrwx Jan : mnt -> 'mnt:[4026532494]'
lrwxrwxrwx Jan : net -> 'net:[4026532499]'
lrwxrwxrwx Jan : pid -> 'pid:[4026532497]'
lrwxrwxrwx Jan : pid_for_children -> 'pid:[4026532497]'
lrwxrwxrwx Jan : user -> 'user:[4026531837]'
lrwxrwxrwx Jan : uts -> 'uts:[4026532495]'

发现是相同的,说明他们是在同一个namespace中的。

然后我们来看看普通的进程(容器外的),zsh和systemd这连个进程:

sudo ls -l /proc//ns                                            ↵
[sudo] password for xlinliu:
total
lrwxrwxrwx root root Jan : cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx root root Jan : ipc -> 'ipc:[4026531839]'
lrwxrwxrwx root root Jan : mnt -> 'mnt:[4026531840]'
lrwxrwxrwx root root Jan : net -> 'net:[4026532000]'
lrwxrwxrwx root root Jan : pid -> 'pid:[4026531836]'
lrwxrwxrwx root root Jan : pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx root root Jan : user -> 'user:[4026531837]'
lrwxrwxrwx root root Jan : uts -> 'uts:[4026531838]'
ls -l /proc/$$/ns                                                 ✔
total
lrwxrwxrwx xlinliu xlinliu Jan : cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx xlinliu xlinliu Jan : ipc -> 'ipc:[4026531839]'
lrwxrwxrwx xlinliu xlinliu Jan : mnt -> 'mnt:[4026531840]'
lrwxrwxrwx xlinliu xlinliu Jan : net -> 'net:[4026532000]'
lrwxrwxrwx xlinliu xlinliu Jan : pid -> 'pid:[4026531836]'
lrwxrwxrwx xlinliu xlinliu Jan : pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx xlinliu xlinliu Jan : user -> 'user:[4026531837]'
lrwxrwxrwx xlinliu xlinliu Jan : uts -> 'uts:[4026531838]'

发现也是一样的,说明他们也是在同意namespace下。另外我们还可以看到有一个 pid_for_children ,这是什么呢?这是因为pid namespace是可以嵌套的,父级可以看到子级的进程的pid,但子级看不到父集,正式因为这样,所以我们在宿主机中,是可以看到所有容器的进程的,并且每个进程都有pid。 比如上面的nginx容器,他的CMD进程在容器里的pid是1,但是在宿主机中也可以看到它,pid是7344。

参考:

1 DOCKER基础技术:LINUX NAMESPACE(上) 以及 DOCKER基础技术:LINUX NAMESPACE(下)

Linux Namespace和Cgroup

DOCKER基础技术:AUFS

DOCKER基础技术:DEVICEMAPPER

linux 网络虚拟化: network namespace 简介

关于docker的理解随记的更多相关文章

  1. Docker个人理解总结

    最新在学习Docker,记录下自己对Docker的理解. 一.Docker是什么? 1. Docker是一个能够把开发的应用程序自动部署到容器的开源引擎. 2.Docker使用Google公司推出的G ...

  2. 用前端姿势玩docker【一】Docker通俗理解常用功能汇总与操作埋坑

    前言 首先一句话表达个人对docker的理解:与传统虚拟技术基于硬件及物理资源的虚拟化相比,Docker更加轻量化,docker为基于操作系统或内核级别的虚拟化,并且提供了从各种机制与操作以满足从开发 ...

  3. docker 深入理解之cgroups

    cgroups 资源限制 cgroups 是什么 cgroups 最初名为process container,有Google工程师Paul Menage和Rohit Seth于 2006 年提出,后由 ...

  4. 初识docker与理解

    因最近公司的一个新项目,有一个业务场景是需要给多个甲方的服务器配置运行环境与部署,所以考虑使用docker来实现环境配置的统一 1.docker是什么 docker是一种容器虚拟化技术的实现,相当于在 ...

  5. Docker入门——理解Docker的核心概念

    1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...

  6. docker的理解

    作者:刘允鹏链接:https://www.zhihu.com/question/28300645/answer/67707287来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  7. docker&k8s填坑记

    本篇主要用于记录在实施docker和kubenetes过程中遇到的一个问题和解决办法. 本节部分内容摘自互联网,有些部分为自己在测试环境中遇到到实际问题,后面还会根据实际情况不断分享关于docker/ ...

  8. docker 深入理解之namespace

    namespace 名称空间 docker容器主要通过资源隔离来实现的,应该具有的6种资源隔 namespace 的六项隔离 namespace 系统调用参数 隔离的内容 UTS CLONE_NEWU ...

  9. docker简单理解

    Docker是开源的一个基于轻量级虚拟化技术的容器引擎项目.它通过分层镜像标准化和内核虚拟化技术,使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的 ...

随机推荐

  1. Android-Sqlite-SQL操作增删改查

    一想到Android到数据库,只需要想到一个类 SQLiteOpenHelper,然后写一个类继承 SQLiteOpenHelper,重写构造方法,对数据库进行配置 public class MySQ ...

  2. [C#]创建Windows用户及组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  3. git@oschina使用入门(图形界面版)

    首先,如果你想使用git@oschina ,你的电脑上必须先有git工具:你可以从这里获取谷歌提供的git.exe http://git-scm.com/当然,如果你能熟练通过命令行操作git,那么这 ...

  4. 好看的table样式

    收藏个好看的table样式 <style type="text/css">table.gridtable { font-family: verdana,arial,sa ...

  5. .Net上传图片压缩质量,不改变尺寸

    图片上传有很多情况需要考虑,例如:生成缩略图.压缩尺寸.压缩质量.压缩尺寸质量.添加水印等等常见情况.最近遇到图片质量压缩不改变大小的问题,参考:听浪 #region 图片压缩 /// <sum ...

  6. GO学习笔记 - 没有参数的 return 语句返回各个返回变量的当前值,这种用法被称作“裸”返回。

    Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用. 返回值的名称应当具有一定的意义,可以作为文档使用. 没有参数的 return 语句返回各个返回变量的当前值.这种用法被称作“裸”返回 ...

  7. zTree第二章,各种常见setting设置和方法

    具体详见API文档: http://www.treejs.cn/v3/api.php --------------------------------------------------------- ...

  8. PHP中关于foreach的笔试题

    1,php与C++的不同之处是PHP中变量没有局部作用域,只有函数作用域和全局作用域.如下函数,在php中,$name的作用域是函数test():在C++中$name的作用域是for循环体,for循环 ...

  9. leetcode-695-Max Area of Island(BFS)

    题目描述: Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land ...

  10. 支付宝支付下载对账单bug反馈整理

    支付宝官方给广大开发朋友们,留了一个下载账单的API接口,供大家下载指定日期的账单数据.先来看下这个页面: 点我前往官方说明文档 $aop = new AopClient (); $aop->g ...