命名空间( namespace)是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便 利。 利用这一特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在 独立的操作系统环境中一样。 命名空间机制保证了容器之间彼此互不影响。 在操作系统中,包括内核、文件系统、网络、进程号( Process ID, PID)、用户号( User ID, UID)、 进程间通信( Inter Process Communication, IPC)等资源,所有的资源都是应用进 程直接共享的。 要想实现虚拟化,除了要实现对内存、 CPU、网络 IO、硬盘 IO、存储空间 等的限制外,还要实现文件系统、网络、 PID、 UID、 IPC 等的相互隔离。 前者相对容易实现一些,后者则需要宿主主机系统的深入支持。 随着 Linux 系统对于命名空间功能的逐步完善,现在已经可以实现这些需求,让进 程在彼此隔离的命名空间中运行。 虽然这些进程仍在共用同一个内核和某些运行时环境 (runtime,例如一些系统命令和系统库),但是彼此是不可见的,并且认为自己是独占系统的。

1.进程命名空间

[root@master ~]# ps -ef |grep nginx
root : ? :: nginx: master process nginx -g daemon off;
: ? :: nginx: worker process
root : pts/ :: grep --color=auto nginx
root 3月05 ? :: nginx: master process nginx -g daemon off;
3月05 ? :: nginx: worker process
root 3月05 ? :: nginx: master process nginx -g daemon off;
3月05 ? :: nginx: worker process
[root@master ~]# ps -ef |grep
root : ? :: containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/cdac05a904db952bca89c487ea12f9f58ce4599428e769e6faeaaf1091d8610c -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root : ? :: nginx: master process nginx -g daemon off;
root : pts/ :: grep --color=auto
[root@master ~]# ps -ef |grep
root 2月19 ? :: /usr/bin/containerd

2.IPC命名空间

容器中的进程交互还是采用了 Linux 常见的 进程间交互方法( Interprocess Communication, IPC),包括信号量、消息队列和共享内存等方式。 PID 命名空间和 IPC 命名空间可以组合起来一起 使用,同一个 IPC 命名空间内的进程可以彼此可 见,允许进行交互;不同空间的进程则无法交互。

3.网络命名空间

有了进程命名空间后,不同命名空间中的进程号可以相互隔离,但是网络端口还是共享本地 系统的端口 。 通过网络命名空间,可以实现网络隔离。一个网 络命名空间为进程提供了一个完全独立的网络协议校 的视图。 包括网络设备接口 、 IPv4 和 IPv6 协议、 IP 路由表、 防火墙规则、 sockets 等, 这样每个容器的网 络就能隔离开来。 Docker 采用虚拟网络设备(Virtual Network Device, VND)的方式,将不同命名空间的网络设备连接到一 起。 默认情况下, Docker 在宿主机上创建多个虚机网 桥(如默认的网桥 dockerO ),容器中的虚拟网卡通过网 桥进行连接。

4.挂载命名空间
类似于 chroot, 挂载 ( Mount, MNT) 命名空间可以将一个进程的根文件系统限制到一 个特定的目录下。 挂载命名空间允许不同命名空间的进程看到的本地文件位于宿主机中不同路径下,每 个命名空间中的进程所看到的文件目 录彼此是隔离的。 例如, 不同命名空间中的进程, 都认 为自己独占了一个完整的根文件系统( rootfs), 但实际上,不同命名空间中的文件彼此隔离, 不会造成相互影响 ,同时也无法影响宿主机文件系统中的其他路径。

5. UTS 命名空间 UTS (UNIX Tim e-sharing System) 命名空间允许每个容器拥有独立的主机名和域名 ,从 而可以虚拟出一个有独立主机名和网络空间的环境, 就跟网络上一台独立的主机一样。 如果没有于动指定主机名称, Docker 容器的主机名就是返回的容器 ID 的前 6 字节前缀, 否则为指定的用户名:

6. 用户命名空间 每个容器可以有不同的用户和组 id, 也就是说, 可以在容器内使用特定的内部用户执行 程序,而非本地系统上存在的用户 。 每个容器内部都可以有最高权限的 root 帐号,但跟宿主主机不在一个命名空间。 通过使 用隔离的用户命名空间, 可以提高安全性,避免容器内的进程获取到额外的权限;同时通过使用不同用户也可以进一步在容器内控制权限.

4.namespace的更多相关文章

  1. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. C++ namespace

    namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...

  3. C++ 之namespace常见用法

    一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...

  4. using namespace std 和 using std::cin

    相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...

  5. Why Namespace? - 每天5分钟玩转 OpenStack(102)

    上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...

  6. struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path

    1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...

  7. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  8. AMD and CMD are dead之Why Namespace?

    缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...

  9. 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法

    这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...

  10. C、C++: 引用、指针、实例、内存模型、namespace

    // HelloWorld.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...

随机推荐

  1. Charles 抓包工具绿化过程记录

    1.下载官方的软件,并安装. 下载地址:https://www.charlesproxy.com/latest-release/download.do 根据需求下载即可 2.使用在线破解工具生成jar ...

  2. Bootstrap学习(一):Bootstrap简介

    一.Bootstrap简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更 ...

  3. 从code review到Git commit log

    最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...

  4. I2C地址问题

    #define     MAX_17040_BATTERY_I2C_ADDR        (0x36) 设备地址 #define     MAX_17040_BATTERY_WRITE_ADDR   ...

  5. A2D JS框架 - AOP封装

    AOP在js中的实现,先看看用法吧: var A2D = $.noConflict();//不要误会,此乃我自己写的A2D框架,非jQuery function fn1(name, age) { co ...

  6. OO博客作业3:第9-11周作业总结

    一.总结介绍规格化设计的大致发展历史和为什么得到了人们的重视 1.规格化设计的大致发展历史 规格化设计,又称契约式设计,最早由Bertrand Meyer于1986年提出,出自于<面向对象软件构 ...

  7. Educational Codeforces Round 52 (Rated for Div. 2) -C

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  8. 软件工程启程篇章:C#和四则运算生成与运算

    0x01 :序言 I leave uncultivated today, was precisely yestoday perishes tomorrow which the person of th ...

  9. Imbalanced Array CodeForces - 817D (思维+单调栈)

    You are given an array a consisting of n elements. The imbalance value of some subsegment of this ar ...

  10. Django之路由分发反向解析

    Django路由分发|反向解析 当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路 ...