Docker 入门前置:容器虚拟化基础之Namespace 空间隔离

文章目录

    • Namespace
    • [一、dd 命令详解](#一、dd 命令详解)
    • [二、mkfs 命令详解](#二、mkfs 命令详解)
    • [三、df 命令详解](#三、df 命令详解)
    • [四、mount 命令详解](#四、mount 命令详解)
    • [五、unshare 命令详解](#五、unshare 命令详解)

Namespace

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

Namespace 相关参数与说明

namespace 系统调用参数 被隔离的全局系统资源 引入内核版本
UTS CLONE_NEWUTS 主机名和域名 2.6.19
IPC CLONE_NEWIPC 信号量、消息队列和共享内存 - - 进程间通信 2.6.19
PID CLONE_NEWPID 进程编号 2.6.24
Network CLONE_NEWNET 网络设备、网络栈、端口等 2.6.29
Mount CLONE_NEWNS 文件系统挂载点 2.4.19
User CLONE_NEWUSER 用户和用户组 3.8

容器环境下的隔离效果

  • UTS:每个容器能看到自己的hostname,拥有独立的主机名和域名。
  • IPC:同一个IPC namespace 的进程之间能互相通讯,不同的IPC namespace 之间不能通信。
  • PID:每个PID namespace 中的进程可以有其独立的PID,每个容器可以有其PID 为 1 的root 进程。
  • Network:每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号。
  • Mount:每个容器能看到不同的文件系统层次结构。
  • User:每个container 可以有不同的user 和group id。

隔离两个进程的实现思路

  1. 首先容器进程与进程之间需要隔离,所以需要PID 隔离
  2. 首先容器A 进程不能读取容器B 进程通讯内容需要隔离信号量等,所以需要IPC 隔离
  3. 首先容器A 进程不能读取容器B 进程的文件,所以需要Mount 隔离
  4. 首先容器A 进程不能读取容器B 进程的socket,所以需要网络隔离、主机隔离
  5. Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。

一、dd 命令详解

Linux dd 命令用于读取、转换并输出数据。

dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

语法:dd OPTION

常见参数

参数 说明
if=文件名 输入文件名,默认为标准输入,即指定源文件
of=文件名 输出文件名,默认为标准输出,即指定目的文件
ibs=bytes 一次读入bytes个字节,即指定一个块大小为bytes个字节
obs=bytes 一次输出bytes个字节,即指定一个块大小为bytes个字节
bs=bytes 同时设置读入/输出的块大小为bytes个字节
cbs=bytes 一次转换bytes个字节,即指定转换缓冲区大小
skip=blocks 从输入文件开头跳过blocks个块后再开始复制
seek=blocks 从输出文件开头跳过blocks个块后再开始复制
count=blocks 仅拷贝blocks个块,块大小等于ibs指定的字节数
conv=ascii 转换ebcdic为ascii
conv=ebcdic 转换ascii为ebcdic
conv=ibm 转换ascii为alternate ebcdic
conv=block 把每一行转换为长度为cbs,不足部分用空格填充
conv=unblock 使每一行的长度都为cbs,不足部分用空格填充
conv=lcase 把大写字符转换为小写字符
conv=ucase 把小写字符转换为大写字符
conv=swap 交换输入的每对字节
conv=noerror 出错时不停止
conv=notrunc 不截短输出文件
conv=sync 将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
--help 显示帮助信息
--version 显示版本信息

案例

shell 复制代码
# 生成1个镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240
# 将testfile文件中的所有英文字母转换为大写,然后转成为testfile_1文件
dd if=testfile_2 of=testfile_1 conv=ucase

二、mkfs 命令详解

用于在设备上创建Linux文件系统,俗称格式化,比如我们使用U盘的时候可以格式化。

语法:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

常见参数

参数 说明
-t fstype 指定要建立何种文件系统;如ext3,ext4
filesys 指定要创建的文件系统对应的设备文件名
blocks 指定文件系统的磁盘块数
-V 详细显示模式
fs-options 传递给具体的文件系统的参数

实例

shell 复制代码
# 将sda6分区格式化为ext4格式
mkfs -t ext4 /dev/sda6
# 格式化镜像文件为ext4
mkfs -t ext4 ./fdimage.img

三、df 命令详解

Linux df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

语法:df [OPTION]... [FILE]...

常见参数

参数 说明
-a, --all 包含所有的具有 0 Blocks 的文件系统
-h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)
-H, --si 很像 -h,但是用 1000 为单位而不是用 1024
-t, --type=TYPE 限制列出文件系统的 TYPE
-T, --print-type 显示文件系统的形式

案例

shell 复制代码
# 查看磁盘使用情况
df -h
# 查看磁盘的系统类型
df -Th

四、mount 命令详解

mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。

Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载),不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。挂载的实质是为磁盘添加入口(挂载点)。

语法:mount [-l] mount [-t vfstype] [-o options] device dir

常见参数

参数 说明
-l 显示已加载的文件系统列表
-t vfstype 加载文件系统类型支持常见系统类型的ext3,ext4,iso9660,tmpfs,xfs等,大部分情况可以不指定,mount 可以自己识别
-o loop 用来把一个文件当成硬盘分区挂接上系统
-o ro 采用只读方式挂接设备
-o rw 采用读写方式挂接设备
device 要挂接(mount)的设备
dir 挂载点的目录

案例

shell 复制代码
# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
# 将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4

五、unshare 命令详解

unshare 主要能力是使用与父程序不共享的名称空间运行程序。

语法:unshare [options] program [arguments]

常用参数

参数 说明
-i, --ipc 不共享 IPC 空间
-m, --mount 不共享 Mount 空间
-n, --net 不共享 Net 空间
-p, --pid 不共享 PID 空间
-u, --uts 不共享 UTS 空间
-U, --user 不共享用户
-V, --version 版本查看
--fork 执行 unshare 的进程 fork 一个新的子进程,在子进程里执行 unshare 传入的参数
--mount-proc 执行子进程前,将 proc 优先挂载过去

案例

shell 复制代码
# hostname 隔离
root@139-159-150-152:~# unshare -u /bin/bash
root@139-159-150-152:~# hostname test1
root@139-159-150-152:~# hostname
test1
root@139-159-150-152:~# exit
exit
root@139-159-150-152:~# hostname
139-159-150-152
root@139-159-150-152:
相关推荐
想进部的张同学2 小时前
RK3588 + Docker + GStreamer 实现 RTSP 推流(MJPEG AVI → H.264),VLC 成功拉流
docker·音视频·h.264
编码如写诗2 小时前
【k8s】Centos从零开始使用containerd部署k8s1.30.14+KubeSphere
容器·kubernetes·centos
SMF19192 小时前
【Vmware】windows物理机共享文件给vm虚拟机中的Centos系统
linux·运维·centos
本妖精不是妖精2 小时前
CentOS 7 安装 Node.js v18.x 完整教程
linux·centos·node.js
txinyu的博客2 小时前
静态库 & 动态库
linux·运维·服务器
阮松云2 小时前
Centos挂载分区扩容记录
linux·运维·centos
AC赳赳老秦2 小时前
Docker+DeepSeek:生成镜像优化Dockerfile与容器健康检查脚本
android·运维·人工智能·机器学习·docker·容器·deepseek
fcm192 小时前
导出已有的docker容器
docker·容器·eureka
鱼香rose__2 小时前
Linux远程登录-SSH
linux·运维·ssh