zoukankan      html  css  js  c++  java
  • docker的ubuntu容器,为什么能在centos或redhat的宿主机上运行?

    docker是利用linux的namespace隔离技术为基础,通过共享Linux内核实现的。

    简单说,docker容器是缩小型的linux。是在宿主机基础上,把内核隔离出来的。因为不论什么发行版(ubuntu-apt ,,,centos-yum)内核都一样,就是软件安装包管理方式不同,可定制的界面不同。

    一、共享内核

    首先需要区分Linux内核与Linux发行版

    • Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等...

    • Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等...

    CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核(内核是统一唯一的), 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS使用yum命令安装软件, 而Ubuntu使用apt-get命令安装软件。

    因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。

    Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块:

    • Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。

    • Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。

    在CentOS上运行基于Ubuntu镜像的容器时, 容器使用了CentOS主机的内核以及Ubuntu镜像, Ubuntu镜像中安装了Ubuntu的各种软件(apt-get)。

    二、隔离机制

    简单来说,Linux Namespace 是操作系统内核在不同进程间实现的一种「环境隔离机制」。

    举例来说:现在有两个进程A,B。他们处于两个不同的 PID Namespace 下:ns1, ns2。在ns1下,A 进程的 PID 可以被设置为1,在 ns2 下,B 进程的 PID 也可以设置为1。但是它们两个并不会冲突,因为 Linux PID Namespace 对 PID 这个资源在进程 A,B 之间做了隔离。A 进程在 ns1下是不知道 B 进程在 ns2 下面的 PID 的。

    这种环境隔离机制是实现容器技术的基础。因为在整个操作系统的视角下,一个容器表现出来的就是一个进程。

    Linux 一共构建了 6 种不同的 Namespace,用于不同场景下的隔离:

    1. Mount - isolate filesystem mount points
    2. UTS - isolate hostname and domainname
    3. IPC - isolate interprocess communication (IPC) resources
    4. PID - isolate the PID number space
    5. Network - isolate network interfaces
    6. User - isolate UID/GID number spaces
  • 相关阅读:
    Windows下获取逻辑cpu数量和cpu核数量
    QtScript, QML, Quick1, Quick2, Declarative 之间的关系
    将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
    QPixmap的缓冲区
    Qt+QZXing编写识别二维码的程序
    ASP.NET 5:依赖注入
    angularJS之使用指令封装DOM操作
    Windows 10技术布局,谈微软王者归来
    Microsoft dotnetConf 2015
    Net社区虚拟大会
  • 原文地址:https://www.cnblogs.com/lxgbky/p/12973931.html
Copyright © 2011-2022 走看看