当前位置: 首页 > news >正文

【docker】namespace 命名空间

Linux 的 Namespace、CGroups 和 UnionFS 三大技术支撑了 Docker 的实现。
在 Linux 系统中,namespace 是在内核级别以一种抽象的形式来封装系统资源的,通过将系统资
源放在不同的 namespace 中,来实现资源隔离的目的。设置了不同 namespace 的程序,就可以
享有彼此独立的一份系统资源。
Linux 中当前可用的命名空间如下:
当前系统使用到的命名空间有,cgroup ns:隔离 CGroup 视图。ipc ns: 隔离进程间通信资源。
mnt ns: 隔离文件系统挂载点。net ns: 隔离网络资源。pid ns: 隔离进程 ID。user ns: 隔离用户
和用户组 ID。uts ns: 隔离主机名和域名。pid_for_children: 当前进程的子进程将继承的 PID ns。
下面通过从非管理账户 user1 的角度来具体理解命名空间的工作原理。
首先配置 user1 用户的 sudo 免密,并添加 dockers 组,这组操作请自行完成。
以 user1 用户登录新的会话,运行一个名字 conns 的 alpine 容器
我们知道,conns 容器包含有一个精简但完整的文件系统:
将 conns 容器的文件系统导出,在当前目录创建一个 rootfs 目录,并将导出的 conns 文件系统解压到这个目录:
这么做的目的就是要手工创建一个资源隔离的类似容器对象。
接下来使用 chroot 命令把当前 shell 的 root 切换到刚创建的文件系统。
好了,新的文件系统好像是独立的 root 文件系统,但是看 ip link 命令显示的网络信息:
再看系统进程信息:
可以发现,除了挂载点之外的网络、进程等资源在“模拟容器”中都能看到,这些资源没有隔离
回到 user1 用户,使用 unshare 命令隔离出一组新的命名空间集合。unshare 命令用于创建一个
新 ns 集合,并在其中启动一个 Bash shell,实现资源隔离,这是 Linux 容器技术的基础之
特别要说明的是,如果此时我们在其他终端上检查主机中的进程时,会看到,即使上面的用户 root, 在进程之外,也是在普通用户 user1 的凭据下执行的:
unshare --map-root-user 创建了一个新的 User 命名空间,将容器内的 root 映射到主机上的普通用户 user1。因此,主机看到的进程凭据是映射后的 user1,而非真实的 root
回到“模拟容器”环境,如果想要显示当前正在运行的进程,结果先显示的是主机中的所有进程:
因为,ps 命令依赖 /proc 文件系统获取进程信息。默认情况下,新创建的 PID 命名空间并未挂载独立的 /proc,因此仍读取主机全局的 /proc,导致看到所有进程。因此需要将 procfs 虚拟文件系统挂载到 当前的/proc 目录,就可在新的 PID 命名空间中实现进程的隔离:
继续,我们在容器外部创建一个网络设备并将其放入命名空间:
回到“模拟容器”环境,会看到有一个新的网络设备出现了:
http://www.lryc.cn/news/611865.html

相关文章:

  • LangChain4j检索增强生成RAG
  • Anthropic于本周一推出了其旗舰模型的升级版Claude Opus 4.1
  • 第十八天:C++进制之间的转换
  • 17.9 ChatGLM3-6B开源!32K长文本+推理提速45%,多任务性能飙升29.4%
  • Transwell 细胞迁移与侵袭实验:从原理到操作的详细指南
  • VSCode:基础使用 / 使用积累
  • QML开发:QML中的基本元素
  • 大数据之Flume
  • AT32的freertos下modbus TCP移植
  • #C语言——学习攻略:探索内存函数--memcpy、memmove的使用和模拟实现,memset、memcmp函数的使用
  • flex布局:容器的justify-content属性
  • CEH、OSCP、CISP、CISSP 四大网络安全认证攻略
  • 【hot100】无重复字符的最长子串-Python3
  • duiLib 编译时复制资源目录到exe同级目录
  • 推动本地流智能:基于 Apache Kafka 与 Flink 的实时机器学习实践
  • 无需SCADA/OPC,实现直接与西门子PLC Web API通讯实现数据读写(一)
  • Mysql如何迁移数据库数据
  • 【自动驾驶】《Sparse4Dv3 Advancing End-to-End 3D Detection and Tracking》论文阅读笔记
  • 工业协议转换终极武器:EtherCAT转PROFINET网关的连接举例
  • Spring Boot全局异常处理与日志监控实战指南
  • 从Navisworks到定制化BIM系统:HOOPS Exchange如何实现高效3D格式解析?
  • 【公考】----申论篇
  • 测试单节点elasticsearch配置存储压缩后的比率
  • 20250806给PRO-RK3566开发板在Buildroot系统下扩大rootfs分区2GB
  • 移动端网页调试实战,跨设备兼容与触控交互问题排查全流程
  • Class30数据增广
  • 【docker】完整 Dockerfile 示例和构建运行指南
  • SmartX 用户建云实践|宝信软件:搭建“双架构”私有云平台,灵活满足多种业务需求
  • Bug 记录:SecureRandom.getInstanceStrong()导致验证码获取阻塞
  • Python爬虫 urllib 模块详细教程:零基础小白的入门指南