命名空间( 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. 漏洞扫描,linux配置规范处理

    #!/bin/bash ## set shortest length of password filename=/etc/login.defs if [ -f "$filename" ...

  2. 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)

    转载目的,主要是为了理解lVIRT虚拟内存.RES常驻内存.共享内存SHR.SWAP和实际程序应用如何对应的. 在Linux命令行中执行top命令,可以查询到所有进程使用的VIRT虚拟内存.RES常驻 ...

  3. 跨平台Redis可视化工具Web Redis Manager

    一.简介 最近因为工作需要,使用了一些单机版Redis的界面化管理工具,使用过程中那惨痛的体验真的只有用过的人才能体会:为此本人和小伙伴准备动手一个Redis可视化工具,但是因为小伙伴最近工作比较忙, ...

  4. JS判断当前设备是 PC IOS Andriod

    JS判断当前设备是 PC IOS Andriod <script > window.onload = function(){ var isPc = IsPC(); var isAndroi ...

  5. 算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)

    昨天面试被问到这道算法题,一时没有回答上来,今天思考了一下,参阅了网上的教程,做了一个JAVA版本的实现. 方案一: 新建一个N*L的数组,将原始数组拼接存放在这个大数组中,再调用Arrays.sor ...

  6. Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)

    本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.“功夫的 ...

  7. 03-HTML之body标签

    body标签 HTML标签按作用主要分为两类:字体标签和排版标签 HTML标签按级别主要分为两类:文本级标签和容器级标签 文本级标签:p.span.a.b.i.u.em.文本标签里只能放文字.图片.表 ...

  8. hibernate延迟加载org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.javakc.hibernate.onetomany.entity.DeptEntity.emp, could not initialize proxy - no Session

    public static void main(String[] args) {  DeptEntity dept = getDept("402882e762ae888d0162ae888e ...

  9. JEECG 单点登录 SSO

    jeecg中用户登录的唯一性-CSDN问答https://ask.csdn.net/questions/656639 JEECG 集成KiSSO单点登录实现统一身份认证 - zhangdaiscott ...

  10. c#+linux+mono+Redis集群(解决无法连接Redis的问题)

    在linux环境中使用mono来执行c#的程序, 在连接redis的时候遇到了无法连接数据库的错误.如下: Unhandled Exception:StackExchange.Redis.RedisC ...