首页 Docker教程Docker-名称空间Namespace技术

Docker经典入门学习教程

Docker-cgroup介绍

运维派是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai

名称空间 Namespace 技术

一个宿主机运行了N个容器,多个容器共用一个OS,必然带来的以下问题:

-怎么样保证每个容器都有不同的文件系统并且能互不影响?
-一个docker主进程内的各个容器都是其子进程,那么实现同一个主进程下不同类型的子进程?各个进程间通信能相互访问(内存数据)吗?

-每个容器怎么解决IP及端口分配的问题?

-多个容器的主机名能一样吗?

-每个容器都要不要有root用户?怎么解决账户重名问题?

namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

隔离类型 功能 系统调用参数 内核版本
MNT Namespace(mount) 提供磁盘挂载点和文件系统的隔离能力 CLONE_NEWNS Linux 2.4.19
IPC Namespace(Inter-Process Communication) 提供进程间通信的隔离能力 CLONE_NEWIPC Linux 2.6.19
UTS Namespace(UNIX Timesharing System) 提供主机名隔离能力 CLONE_NEWUTS Linux 2.6.19
PID Namespace(Process Identification) 提供进程隔离能力 CLONE_NEWPID Linux 2.6.24
Net Namespace(network) 提供网络隔离能力 CLONE_NEWNET Linux 2.6.29
User Namespace(user) 提供用户隔离能力 CLONE_NEWUSER Linux 3.8
MNT Namespace

每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。

例如:

根目录:

范例:

启动三个容器用于以下验证过程:

Debian系统安装基础命令:

验证容器的根文件系统:

和宿主机共享内核

IPC Namespace

一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器直接访问其他容器的数据

UTS Namespace

UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识,其中包含了主机名hostname 和域名domainname ,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。

范例:

PID Namespace

Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID namespace进程隔离(比如PID编号重复、器内的主进程生成与回收子进程等)。

Docker-名称空间Namespace技术插图

范例:

例如:下图是在一个容器内使用top命令看到的PID为1的进程是nginx::

Docker-名称空间Namespace技术插图(1)

容器内的Nginx主进程与工作进程:

Docker-名称空间Namespace技术插图(2)

那么宿主机的PID究竟与容器内的PID是什么关系?

容器PID追踪:

查看宿主机上的PID信息

Docker-名称空间Namespace技术插图(3)

查看容器中的PID信息:

Docker-名称空间Namespace技术插图(4)

NET Namespace

每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,

Docker使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。

Docker-名称空间Namespace技术插图(5)

查看宿主机的网卡信息

Docker-名称空间Namespace技术插图(6)

查看宿主机桥接设备

通过brctl show命令查看桥接设备:

Docker-名称空间Namespace技术插图(7)
Docker-名称空间Namespace技术插图(8)

逻辑网络图:

Docker-名称空间Namespace技术插图(9)

宿主机iptables规则:

Docker-名称空间Namespace技术插图(10)
Docker-名称空间Namespace技术插图(11)

范例:

User Namespace

各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?

User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互补影响、永不相见。

Docker-名称空间Namespace技术插图(12)

本文链接:http://www.yunweipai.com/34731.html

Docker经典入门学习教程

Docker-cgroup介绍

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部