Fix and update

This commit is contained in:
baohua
2026-02-09 11:34:35 -08:00
parent e669ee0fe8
commit 63377d0431
136 changed files with 2146 additions and 262 deletions

View File

@@ -1,5 +1,7 @@
## 命名空间
命名空间Namespace Linux 内核的一个强大特性为容器提供了隔离的运行环境
### 什么是 Namespace
> **Namespace Linux 内核提供的资源隔离机制它让容器内的进程仿佛运行在独立的操作系统中**
@@ -35,19 +37,25 @@ Linux 内核提供了以下几种 NamespaceDocker 容器使用了全部:
### PID Namespace
PID Namespace 负责进程 ID 的隔离使得容器内的进程彼此不可见
#### 作用
隔离进程 ID让每个容器有自己的进程编号空间
#### 效果
运行以下命令
```bash
## 宿主机上查看进程
$ ps aux | grep nginx
root 12345 0.0 0.1 nginx: master process
root 12346 0.0 0.1 nginx: worker process
## 容器内查看进程
$ docker exec mycontainer ps aux
PID USER COMMAND
1 root nginx: master process ← 在容器内是 PID 1
@@ -64,12 +72,16 @@ PID USER COMMAND
### NET Namespace
NET Namespace 负责网络栈的隔离包括网卡路由表和 iptables 规则等
#### 作用
隔离网络栈每个容器拥有独立的网络环境
#### 效果
具体内容如下
```
宿主机 容器
┌─────────────────────┐ ┌─────────────────────┐
@@ -89,12 +101,16 @@ PID USER COMMAND
### MNT Namespace
MNT Namespace 负责文件系统挂载点的隔离确保容器看到独立的文件系统视图
#### 作用
隔离文件系统挂载点每个容器有自己的根目录
#### 效果
具体内容如下
```
宿主机文件系统: 容器内看到的:
/ / ← 容器的根目录
@@ -120,18 +136,24 @@ PID USER COMMAND
### UTS Namespace
UTS Namespace 主要用于隔离主机名和域名
#### 作用
隔离主机名和域名让每个容器可以有自己的主机名
#### 效果
运行以下命令
```bash
## 宿主机
$ hostname
my-server
## 容器内
$ docker run --hostname mycontainer ubuntu hostname
mycontainer
```
@@ -142,6 +164,8 @@ UTS = "UNIX Time-sharing System",是历史遗留的名称。
### IPC Namespace
IPC Namespace 用于隔离进程间通信资源 System V IPC POSIX 消息队列
#### 作用
隔离 System V IPC POSIX 消息队列
@@ -161,12 +185,16 @@ UTS = "UNIX Time-sharing System",是历史遗留的名称。
### USER Namespace
USER Namespace 允许将容器内的用户 ID 映射到宿主机的不同用户 ID
#### 作用
隔离用户和组 ID实现权限隔离
#### 效果
具体内容如下
```
容器内 宿主机
┌─────────────────┐ ┌─────────────────┐
@@ -189,16 +217,21 @@ UTS = "UNIX Time-sharing System",是历史遗留的名称。
#### 实验 1UTS Namespace
运行以下命令
```bash
## 创建新的 UTS namespace 并启动 shell
$ sudo unshare --uts /bin/bash
## 修改主机名(只影响这个 namespace
$ hostname container-test
$ hostname
container-test
## 退出后查看宿主机主机名(未改变)
$ exit
$ hostname
my-server
@@ -206,14 +239,19 @@ my-server
#### 实验 2PID Namespace
运行以下命令
```bash
## 创建新的 PID 和 MNT namespace
$ sudo unshare --pid --mount --fork /bin/bash
## 挂载新的 /proc
$ mount -t proc proc /proc
## 查看进程(只能看到当前 shell
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 8960 4516 pts/0 S 10:00 0:00 /bin/bash
@@ -222,11 +260,15 @@ root 8 0.0 0.0 10072 3200 pts/0 R+ 10:00 0:00 ps aux
#### 实验 3NET Namespace
运行以下命令
```bash
## 创建新的网络 namespace
$ sudo unshare --net /bin/bash
## 查看网络接口(只有 lo
$ ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00