Docker命名空间
- 格式:pdf
- 大小:122.64 KB
- 文档页数:2
Docker命名空间
想学习更多Docker相关知识请看博主的个⼈博客地址:
命名空间
命名空间( 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