命名空间

命名空间( namespace )是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便利,利用这 特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统环境中一样 命名 间机制保证了容器之间彼此互不影响。

在操作系统中,包括内核、文件系统、网络、进程号( Process ID, PID )、用户号( UserID, UID 进程间通信( Inter Process Communication, IPC )等资源,所有的资源都是应用进程直接共享的 要想实现虚拟化,除了要实现对内存、 CPU 、网络 IO 、硬盘 IO 、存储空间等的限制外,还要实现文件系统、网络、 PID UID IPC 等的相互隔离 前者相对容易实现一些,后者则需要宿主主机系统的深入支持。

随着 Linux 系统对于命名空间功能的逐步完善,现在已经可以实现这些需求,让进程在彼此隔离的命名空间中运行 虽然这些进程仍在共用同 个内核和某些运行时环境(runtime ,例如一些系统命令和系统库),但是彼此是不可见的,并且认为自己是独占系统的

Docker 容器每次启动时候,通过调用 func setNamespaces(daemon *Daemon, s *specs. Spec, c *container.Container) error 方法来完成对各个命名 间的配置

进程命名空间

Linux 通过进程命名 理进程号,对于同 进程(同 task struct ),在不同的命名空间中,看到的进程号不相同 个进程命名 间有一套 自己的进程号管理方法 进程命名空间是一个父子关系的结构,子空间中的进程对于父 间是可见的 fork 出的 个进程,在父命名空间和子命名空间将分别对应不同的进程号 例如,查看 Docker 服务主进程( dockerd )的进程号是 3393 ,它作为父进程启动了 docker containerd 进程,进程号为 3398,

代码如下所示:

$ ps - ef lgrep docker
root 3393 1 0 Jan18 ? 00 43 02 /usr/bin/dockerd - H fd : // -H tcp://
127 . 0 . 0 . 1 : 2375 -H unix:///var/run/docker.sock
root 3398 3393 0 Jan18 ? 00 : 34 : 31 docker containerd config /var/ru口/
docker /conta nerd/conta nerd toml

新建一个 Ubuntu 容器,执行 sleep 命令 此时 docker containerd 进程作为父进程,会为每个容器启动一个 docker containerd shim 程,作为该容器内所有进程的根进程

$ docker ru --name test d ubuntu :l6 . 04 sleep 9999
$ ps -ef lgrep docker
root 21535 3398 0 06 : 57 ? 00 : 00 : 00 docker-containerd-shim

从宿主机上查看新建容器的进程的父进程 ,正是 docker-containerd shim 进程:

$ ps -e f lgrep sleep
root 21569 21535 0 06 : 57 ? 00 : 00 : 00 sleep 9999

而在容器内的进程空 间中 则把 docker containerd-shim 进程作为 号根进程(类似宿主系统 号根进程 idle), while 进程的进程号则变为 (类似宿主系统中 号初始化进程/sbin/init 容器内只能看到 docker containerd iim 程往下的子进程空间,而无法获知宿主机上的进程信息:

$ docker exec -it 3a bash c ’ ps ef ’
UID PID PPID C STIME TTY TI ME CMD
root 1 0 0 06 : 57 ? 00 : 00 : 00 sleep 9999

IPC 命名空间

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

网络命名空间

有了进程命名空间后,不同命名空间中的进 17-2 宿主机与容器内进程空间的关系 程号可以相互隔离,但是网络端口还是共享本地

系统的端口

通过网络命名空间,可以 现网络隔离。一个网络命名空间为进程提供了一个完全独立的网络协议校的视图 包括网络设备接口 1Pv4 1Pv6 协议械 IP路由 表、 防火墙规则 sockets 等, 这样 容器的网络就能隔离开来

Docker 采用虚拟网络设备(Virtual Network Device, VND )的方式,将不同命名 间的网络设备连接到一起,默认情况下, Docker 在宿 机上创建多个虚机网桥(如 认的网桥 dockerO)容器中的虚拟网卡通过网桥进行连接。

使用 docker network ls 令可以查看 当前系统中的网桥:

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
337120b7e82e lO_ default bridge local
7b0bc9cdc8a0 bridge bridge local
8f57993d438b host host local
6d9342f43ffc none null local

使用 brctl 工具(需要 bridge utils 工具包 ,还可以 到连 到网桥 拟网口的信息 默认分配一个网桥上的虚拟网口, 并将 dockerO IP 地址设 默认的网关, 容器发起的网络流 通过宿主机的 iptab es 规则进行转发

$ brctl show

挂载命名空间

类似于 cbro 挂载 Mount MNT 空间可以将一个进 的根文件系 限制到

个特定的目录下

挂载命名 间允许不同命名空 间的进程 到的 位于宿主机中不同路 ,每

个命名 间中的进程所看到的文件目 彼此是隔离的 例如, 同命名空间中的进程, 都认为自己独占了 个完 的根文件系统( rootfs 际上,不同命名空间中的文件彼此不受任何影响,同时也无法 响宿主机文件系统中的 他路径

UTS 命名空间

UTS (UNIX T im e -sh aring System 命名 间允许 容器 有独立的主机 和域 ,从而可以虚拟出一个有独 主机 和网络空间的环境 就跟网 台独 的主机一样

如果没有于动指定主机名称 Docker 器的主机名就是返回的容器 ID 的前 节前缀,否则为指定的用户名:

$docker run - -name testl -d ubuntu : l6 . 04 /bin/sh -c ”while t rue ; do echo h e llo
worl d ; sl eep l ; done "
alb7bdc9609ad52c6ca7cd39dl69d55ae32f8523lee22da063la20c94d7aa8db
$docker [contai ner] inspect -f {{ ". Config . Hostname ” }} testl
alb7bdc9609a
$ docker run --hostname test2 --name test2 -d ubuntu: 16 . 04 /bin/sh c ” while
true ; do echo hello world; sleep l; done ”
140573f8582584d8e 331368288a96a8838f4a7ed0ff7ee50824f8lbc0459677a
$docker [contai ner] inspect -f {{ .Config.Hostn ne ” }} test2
test2

用户命名空间

每个容器可以有不同的用户和组 id 也就是说 可以在 器内使用特定的内部用户执行程序,而非本地系统上存在的用户

每个容器内部都可以有 高权限的 root 帐号,但跟宿主主机不在一个命名 通过使用隔离的用户命名 可以提高安全 ,避 容器内的进程获取 外的权限;同时通过使用不同用户也可以进一步在容器内控制权限

例如,下面的命令在容器内创建了 test 用户,只有普通权限,无法访问更高权限的资源:

$ docker run --rm --it ubuntu :l6 . 04 bash
root@6da1370b22a0: /# cat /pro c/1/enviro
PATH=/usr/local/sbin : /usr/local/bin: /usr/sbin: /usr/bin : /sb工口: lb nHOSTNAME=6dal37
Ob22a0TERM=xtermHOME=/root
root@6da1370b22a0 : /# useradd ms /bin/bash test
root@6da13 70b22a0 : /# su test
test@6da1370b22a0 : /$ cat /proc/1/environ
cat: /proc/1/environ: Pe ssion denied

Docker命名空间的更多相关文章

  1. docker命名空间、控制组及联合文件系统概念

    基本架构 命名空间 控制组 联合文件系统 docker底层依赖的核心技术主要包括操作系统的命名空间(Namespace).控制组(Control Groups).联合文件系统(Union File S ...

  2. Docker学习(1) 初识

    Docker的使用场景 1 使用Docker容器开发,测试,部署服务 2 创建隔离的运行环境 3 搭建测试环境 4 构建多用户的平台及服务(PaaS)基础设施 5 提供软件即服务(SaaS)应用程序 ...

  3. docker容器跨主机网络overlay

    前提:已部署好docker服务服务预计部署情况如下10.0.0.134 Consul服务10.0.0.135 host1  主机名mcw510.0.0.134 host2  主机名mcw6host1与 ...

  4. Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)

    作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...

  5. Docker底层架构之命名空间

    前言 命名空间是 Linux 内核一个强大的特性.每个容器都有自己单独的命名空间,运行在其中的 应用都像是在独立的操作系统中运行一样.命名空间保证了容器之间彼此互不影响.相应的命名空间功能如下: pi ...

  6. [Linux网络、命名空间、veth设备对、docker的host模式、container模式、none模式、brideg模式、网桥的增删查,容器与网桥的连接断开]

    [Linux网络.命名空间.veth设备对.docker的host模式.container模式.none模式.brideg模式.网桥的增删查,容器与网桥的连接断开] 网络名称空间 为了支持网络协议栈的 ...

  7. 为什么不同命名空间的docker容器可以相互通信?

    一.什么是容器网络栈 所谓容器能看见的"网络栈",被隔离在自己的Network Namespace当中 1.网卡(network interface) 2.回环设备(loopbac ...

  8. Docker背后的内核知识:命名空间资源隔离---亲测

    参考URL: https://linux.cn/article-5057-1.html 实现代码(网络和用户空间只是看懂了) 实际上,Linux内核实现namespace的主要目的就是为了实现轻量级虚 ...

  9. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

随机推荐

  1. Effective Python读书笔记

    有些位置可能翻译理解的不到位,各位看官如有疑问,欢迎留言赐教. Pythonic Thinking 大家经常用Pythonic来形容python语法风格的编程方式:简单优美,没有之一:通过import ...

  2. Journal of Proteome Research | Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiation (男性特有的H3K4脱甲基酶基因(KDM5D)下调会损伤心肌细胞分化) | (解读人:徐宁)

    文献名:Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiatio ...

  3. c# Dictionary<string, object> 转JSON字符串

    JavaScriptSerializer jss = new JavaScriptSerializer(); Dictionary<string, object> dict = new D ...

  4. Redis源码分析: String(SDS)容量调整分析

    整体思路: 1 惰性缩容.不释放空间,留给到期释放等机制释放. 2 加倍扩容.在需要空间达1M之前按新空间两倍分配空间,否则按新空间大小+1M分配.注意,1M=1024*1024*Char.Char可 ...

  5. hdu1035 机器人走格子,格子指明方向,问几步走出格子或者是否有形成圈

    只要根据格子的方向选择下一步搜索的方向即可,退出条件是出界或者进入环中,进入环中的条件也很好确定,就是一个点走了两次,由于路径是固定的,这就会陷入无限循环. #include<iostream& ...

  6. wr720n v4 折腾笔记(一):安装Openwrt

    好久没有写过文章了,今天先来个引子:wr720n v4版本安装openwrt 最近弄了个路由器wr720n,想抓包做点东西,于是就先从刷固件openwrt开始吧. 所需工具: 1.wr720n v4路 ...

  7. [暴力枚举]Codeforces Vanya and Label

    Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出

    在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...

  9. 从源码学习Java并发的锁是怎么维护内部线程队列的

    从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍.我们知道AQS能够通过内置的 ...

  10. WordPress 迁移站点更换域名为新域名

    使用 wp-cli 工具搜索替换域名的方式更换 WordPress 域名 wp-cli 是一个命令行工具,可以让我们通过命令行安装.更新 WordPress,对 WordPress 执行一些批量操作, ...