Docker-原理之namespace

321 阅读5分钟

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile

Docker镜像

Docker仓库

Docker原理(本小结属于)

Docker网络&存储&日志

Docker-Compose

Docker番外篇

在Linux系统中,namespace(命名空间)是内核的一个特性,它允许创建隔离的环境,从而为进程提供独立的全局系统资源视图。这对于容器化技术(如Docker和rkt)至关重要,因为它们依赖命名空间来实现应用程序之间的隔离。

Docker 使用了多种 Linux 命名空间(namespaces)来提供容器之间的隔离。以下是 Docker 主要使用的命名空间类型。

UTS (CLONE_NEWUTS)

允许设置主机名和域名,从而让容器拥有独立的主机名,这对于多租户环境或模拟不同服务器的服务非常有用。

如果我运行容器的时候,可以通过-h参数指定主机名,否则他就会是使用容器的id前面12位(docker ps看到的容器id)作为主机名。隔离以后的才能实现不同的容器都可以有不同或者相同的主机名。

IPC (CLONE_NEWIPC)

隔离 System V IPC 和 POSIX 消息队列,确保不同容器中的进程不能直接通过这些机制进行通信,除非明确配置允许。

简单点来说,就是不同的容器里面的进程不能使用一些进程间通信的方式,比如共享内存,信号等。这个比较抽象简单说明下作为了解吧。

PID (CLONE_NEWPID)

创建独立的进程 ID 空间,这样每个容器内的进程可以有自己的 PID 空间,即使两个容器中有相同 PID 的进程也互不影响。这有助于提高安全性并简化容器内应用程序的管理。

每个容器都有1号进程,但是这个1号进程在主机上实际是一个普通进程。

容器进程

宿主机进程

Network (CLONE_NEWNET)

提供网络接口、IP 地址、路由表等网络资源的隔离。每个容器可以获得自己独立的网络栈,包括 loopback 接口和 eth0 接口等。

简单点来就是每个容器都可以有自己的ip地址,然后还可以基于这个地址和其他主机容器进行通信(稍后详细讲)

Mount (CLONE_NEWNS)

隔离文件系统的挂载点,使得每个容器可以拥有自己的文件系统层次结构,而不会影响主机或其他容器的文件系统。

每个容器里面都有自己Linux的目录树,而且还可以是不同的操作系统的目录树。

User (CLONE_NEWUSER)

允许用户和组 ID 在不同的命名空间之间映射,实现用户 ID 的隔离。这意味着在容器内部以普通用户身份运行的进程可以在宿主机上被视为非特权用户,增加了安全性。

简单点说就是容器里面root并非宿主机root,在标准的Linux里面root总共有42个capabilities(能力),不同的版本的内核数量略有不同,在而容器里面这些capabilities被阉割了,大概只有10多个。也就是容器里面的root被攻破,也不会影响宿主机。

上面讲的都比较抽象,下面我们讲一个命令:nsenter,他可以进入不同的命名空间。我们通过这个方式来进入这个容器,这个也是在实际运维中唯一可能会用到的namespace的知识。

首先找到这个容器的详细ID。

#等于进入容器执行 ls命令
#适合容器里面没有bash或者sh(也就无法exec进入)
nsenter --target 14251 -m

#进入容器网络命令空间,等于在容器里面执行 ip a
#适合需要在容器里面没有抓包命令的适合使用主机进行抓包
nsenter --target 14251 -n

#直接显示容器的主机名
[root@localhost ~]# nsenter --target 14251 -u
[root@50cc86df335f ~]# 

其他有兴趣可以去研究下,实际上我用得最多就是-n,其他几乎没有使用需求。

当然其实也有一部分是未隔离的,比如内核,proc,和时间等。曾经踩过的坑就是在容器里面修改时间,把宿主机时间给修改掉,导致其他业务容器出现异常。这个操作需要容器开启了特权模式才可以,这个参数并没有讲,是因为不建议在容器运行里面添加这个参数:--privileged。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。