Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker-原理之namespace

Docker-原理之namespace

作者头像
运维小路
发布于 2024-12-09 02:54:21
发布于 2024-12-09 02:54:21
10900
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#等于进入容器执行 ls命令
#适合容器里面没有bash或者sh(也就无法exec进入)
nsenter --target 14251 -m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#进入容器网络命令空间,等于在容器里面执行 ip a
#适合需要在容器里面没有抓包命令的适合使用主机进行抓包
nsenter --target 14251 -n
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#直接显示容器的主机名
[root@localhost ~]# nsenter --target 14251 -u
[root@50cc86df335f ~]# 

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker 基础技术之 Linux namespace 详解
Docker 是“新瓶装旧酒”的产物,依赖于 Linux 内核技术 chroot 、namespace 和 cgroup。本篇先来看 namespace 技术。 Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离。实现资源隔离的核心技术就是 Linux namespace。这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace)。 隔离意味着可以抽象出多个轻量级的内核(容器进程),这些进程可以充
Linux云计算网络
2018/03/28
1.9K0
Docker 基础技术之 Linux namespace 详解
Docker原理之Namespaces
在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。
栗筝i
2022/12/01
7190
Docker原理之Namespaces
【云原生 • Docker】Docker核心UTS Namespace原理实践
Docker三大支柱核心技术:Namespace、Cgroups和UnionFS,这节通过一个UTS Namespace简单实践小案例,更加直观理解Namespace资源隔离技术。
Reactor2020
2023/04/20
9631
【云原生 • Docker】Docker核心UTS Namespace原理实践
Docker 之NameSpace与Cgroup
一、比较docker容器技术与传统虚拟化技术 Docker容器技术是一个与传统的虚拟化技术有些本质上的差别,传统的虚拟化技术,是站硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Docker则是在OS的基础上进行虚拟,所以,Docker轻量很多,因此其资源占用、性能消耗相比传统虚拟化都有很大的优势。
小手冰凉
2020/08/02
3.1K0
微服务重要的容器技术Docker的核心实现技术
Docker 作为一种容器虚拟化技术,应用了操作系统的多项底层支持技术。其中的技术层包含Linux操作系统的命名空间Namespace,控制组,联合文件系统,Linux网络虚拟化。
用户2196435
2018/10/18
5680
Docker 技术鼻祖 Linux Namespace 入门系列:Namespace API
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让他重新引起了大家的注意。
米开朗基杨
2020/02/14
2.4K0
Docker 技术鼻祖 Linux Namespace 入门系列:Namespace API
Docker Notes-namespace
摘要: Docker Notes系列为学习Docker笔记,本文是学习namespace 资源隔离的笔记
itliusir
2018/08/03
5410
Docker Notes-namespace
打开云原生大门:了解Linux命名空间的奥秘和Docker容器隔离技术
RootFS (Root File System),即根文件系统,是 Docker 容器启动时内部进程所能感知到的整个文件系统结构的起点,可以简单理解为 Docker 容器的根目录。 它是容器运行环境的基础,承载着容器运行所需的一切资源。
Lion 莱恩呀
2025/05/02
960
打开云原生大门:了解Linux命名空间的奥秘和Docker容器隔离技术
容器底层 --- 超细节的 Namespace 机制讲解
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。这种隔离机制和 chroot 很类似,chroot 是把某个目录修改为根目录,从而无法访问外部的内容。Linux Namesapce 在此基础之上,提供了对 UTS、IPC、Mount、PID、Network、User 等的隔离机制,如下所示。
syy
2020/12/03
3.3K0
容器底层 --- 超细节的 Namespace 机制讲解
深入探索-Docker 的底层实现原理
cgroups(Control Groups)是 Linux 内核中的一种特性,它可以将进程分组并限制它们对系统资源(如 CPU、内存、磁盘和网络)的使用。Docker 使用 cgroups 来实现容器的资源隔离和限制,例如限制容器可以使用的 CPU 核心数量和内存大小。
五分钟学SRE
2023/12/05
5470
深入探索-Docker 的底层实现原理
Linux Namespace浅析
Linux对Namespace的操作,主要是通过clone、setns和unshare这3个系统调用来完成的,clone创建新进程时,接收一个叫flags的参数,这些flag包括CLONE_NEWNS、CLONE_NEWIPC、CLONE_NEWUTS、CLONE_NEWNET(Mount namespace)、CLONE_NEWPID和CLONE_NEWUSER,用于创建新的namespace,这样clone创建出来新进程之后就属于新的namespace了,后续新进程创建的进程默认属于同一namespace。
luoxn28
2020/02/17
1.6K0
Linux Namespace浅析
docker容器技术基础之linux cgroup、namespace
接触过docker的同学多多少少听过这样一句话“docker容器通过linux namespace、cgroup特性实现资源的隔离与限制”。今天我们来尝试学习一下这两个东西。
用户8851537
2021/07/21
1.4K0
【重识云原生】第六章容器6.1.5节——Docker核心技术Namespace
        Linux Namespace是Linux提供的一种内核级别环境隔离的方法。很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等系统资源的隔离机制。在此机制下,这些系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要创建新的Namespace,只需要在调用clone时指定相应的flag。Linux Namespaces机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同container内的进程属于不同的Namespace,彼此透明,互不干扰。
江中散人_Jun
2022/09/27
1K0
【重识云原生】第六章容器6.1.5节——Docker核心技术Namespace
Docker底层原理
本人菜鸡一枚,这里对docker底层原理也只是简单的描述了一下,想要深入研究的小伙伴,建议可以看其他文章
大忽悠爱学习
2022/05/10
4750
Docker底层原理
Docker的资源隔离(NameSpace)
Docker通过namespace(命名空间)实现资源隔离。Namespace是Linux系统提供的资源隔离机制,只有在同一个namespace下的进程可以互相联系,但无法感受外部进程的存在,从而实现资源隔离。
空洞的盒子
2024/02/28
5621
为什么构建容器需要 Namespace
Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
Se7en258
2021/05/18
1.6K0
为什么构建容器需要 Namespace
彻底搞懂容器技术的基石: namespace (上)
目前我们所提到的容器技术、虚拟化技术(不论何种抽象层次下的虚拟化技术)都能做到资源层面上的隔离和限制。
Jintao Zhang
2021/12/13
1.4K0
彻底搞懂容器技术的基石: namespace (上)
【K8s】Kubernetes 网络之 Pod 网络调试
在实际工作中,我们经常会遇到一些疑似网络方面的故障问题,从而需要对 Kubernetes 集群中的 Pod 进行网络调试。
行者Sun
2024/12/27
1640
【K8s】Kubernetes 网络之 Pod 网络调试
04 . Docker安全与Docker底层实现
跟其他添加Docker容器的第三方工具一样(比如网络拓扑和文件系统共享),有很多类似的机制,在不改变Docker内核情况下就可以加固现有的容器.
iginkgo18
2020/09/27
1K0
04 . Docker安全与Docker底层实现
[docker](一)docker-namespaces资源隔离和cgroups资源限制
Docker容器本质上是宿主机上的进程。Docker通过namespaces实现了资源隔离,通过cgroups实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
baron
2019/11/18
1.6K0
相关推荐
Docker 基础技术之 Linux namespace 详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验