mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 11:54:37 +00:00
Fix and update
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
## 命名空间
|
||||
|
||||
命名空间(Namespace)是 Linux 内核的一个强大特性,为容器提供了隔离的运行环境。
|
||||
|
||||
### 什么是 Namespace
|
||||
|
||||
> **Namespace 是 Linux 内核提供的资源隔离机制,它让容器内的进程仿佛运行在独立的操作系统中。**
|
||||
@@ -35,19 +37,25 @@ Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:
|
||||
|
||||
### 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",是历史遗留的名称。
|
||||
|
||||
#### 实验 1:UTS 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
|
||||
|
||||
#### 实验 2:PID 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
|
||||
|
||||
#### 实验 3:NET 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
|
||||
|
||||
Reference in New Issue
Block a user