docker之namespace

本文深入探讨Linux中的网络命名空间(network namespace)概念,解析如何利用Veth Pair技术实现在不同命名空间间建立网络连接,以及如何配置IP地址使虚拟机内的网络互相通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机网络底层通过硬件网卡进行通信

Linux中的网卡

网卡是计算机网络能够进行通信的硬件支撑,拥有唯一的MAC地址

1 查看网卡[网络接口]

01-ip link show

/sys/class/net (保存网卡信息的文件)

03-ip a

 

2 ip a 结果属性解读

状态:UP/DOWN/UNKOWN等

link/ether:MAC地址

inet:绑定的IP地址

 

3 给网卡添加IP地址

当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试

(1)ip addr add 192.168.0.100/24 dev eth0

(2)删除IP地址

ip addr delete 192.168.0.100/24 dev eth0

 

4 网卡启动与关闭

重启网卡 :service network restart / systemctl restart network

启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down

 

Network Namespace:网络的隔离

在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的

ip netns list:查看当前机器上的network namespace

network namespace的管理

ip netns list #查看

ip netns add ns1 #添加

ip netns delete ns1 #删除

 

通过了解network namespace技术,我们可以了解到两台机器之间是如何进行通信的,以及宿主机和虚拟机之间是如何进行通信的

 

namespace

(1)创建一个network namespace

ip netns add ns1

 

(2)查看该namespace下网卡的情况

ip netns exec ns1 ip a

 

(3)启动ns1上的lo网卡

ip netns exec ns1 ifup lo

or

ip netns exec ns1 ip link set lo up

 

(4)再次查看,可以发现state变成了UNKOWN

ip netns exec ns1 ip a

和linux的ip a一样,只不过这里指定了查看哪个网卡

 

(5)再次创建一个network namespace,执行启动操作

ip netns add ns2

ip netns exec ns2 ifup lo

 

如下所示,我们使用network namespace隔离了网络,那么在一个centos里面再创建一个centos也就不足为奇了,因为一个系统本质就是网络和IO的组成

我们隔离出来了两个网络,每个都有自己的网卡信息

(6)此时如果我们想让两个namespace网络连通起来,(也就是然两个网卡进行通信,相当于两个机器进行通信)

veth pair (Virtual Ethernet Pair)命令,是一个成对的端口,可以实现上述功能

(7)创建一对link,也就是接下来要通过veth pair连接的link

ip link add veth-ns1 type veth peer name veth-ns2

添加 veth-ns1 和 veth-ns2通过 veth peer进行link

其实这两个link相当于两个适配器接口,用于桥接两个namespace

 

(8)查看link情况

ip link

 

(9)将veth-ns1加入ns1中,将veth-ns2加入ns2中(将适配器嵌入网卡)

ip link set veth-ns1 netns ns1

ip link set veth-ns2 netns ns2

 

(10)查看宿主机和ns1,ns2的link情况

ip link

ip netns exec ns1 ip link

ip netns exec ns2 ip link

 

(11)此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件(现在网卡有了,适配器也有了,就差ip地址就可以进行通信了),下面的两个命令给两个namespace添加ip地址

ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1

ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2

 

(12)再次查看,发现state是DOWN,并且还是没有IP地址

ip netns exec ns1 ip link

ip netns exec ns2 ip link

 

(13)启动veth-ns1和veth-ns2

ip netns exec ns1 ip link set veth-ns1 up

ip netns exec ns2 ip link set veth-ns2 up

 

(14)再次查看,发现state是UP,同时有IP

ip netns exec ns1 ip a

ip netns exec ns2 ip a

 

(15)此时两个network namespace互相ping一下,发现是可以ping通的

ip netns exec ns1 ping 192.168.0.12

ip netns exec ns2 ping 192.168.0.11

 

到此为止我们已经实现了在宿主机上的虚拟机内部,创建的两个namespace之间相互进行通信

 

 

### Docker Namespace 的使用与原理 Docker 利用了 Linux 内核中的命名空间(Namespaces)机制,提供了容器间的隔离能力。通过不同的命名空间类型,Docker 能够实现资源的独立分配和管理[^1]。 #### 1. 命名空间的主要作用 Linux 命名空间是一种轻量级虚拟化技术,它允许操作系统将全局资源分割成多个相互隔离的部分。每个部分都可以被单独配置和访问,从而形成一种逻辑上的隔离环境。这种隔离使得不同进程组之间无法感知彼此的存在,进而增强了系统的安全性与稳定性[^4]。 #### 2. Docker 中常用的命名空间类型 以下是 Docker 容器运行过程中所依赖的核心命名空间: - **PID (Process ID) Namespace**: 隔离进程 ID 号码空间,使每个容器拥有自己独立的一套 PID 编号体系。即使两个容器内部存在相同编号的进程也不会发生冲突[^5]。 - **NET (Network) Namespace**: 提供网络接口、IP 地址以及路由表等方面的隔离功能。借助 NET Namespace,各个容器可分别设置其专属的网卡设备并定义相应的通信规则。 - **MNT (Mount) Namespace**: 控制文件系统的挂载点范围,确保各容器仅能看到属于自身的目录结构而不受宿主机或其他容器的影响。 - **UTS (UNIX Timesharing System) Namespace**: 支持更改主机名称而不会影响到其他容器或者宿主机本身的操作系统实例^,^ [^5]. - **IPC (Inter Process Communication) Namespace**: 对信号量(semaphores),消息队列(message queues),共享内存(shared memory segments)等 IPC 资源实施分区处理以便于跨应用间的数据交换更加安全可靠. - **USER (User ID Mapping) Namespace**: 实现用户身份映射转换服务,让非特权用户也能创建具有 root 权限级别的子进程同时保持较低风险级别操作权限. #### 3. 创建新命名空间的方法 当启动一个新的 Docker 容器时,默认会启用上述大部分类型的命名空间来构建完整的隔离环境。开发者也可以手动指定某些特定选项来自定义所需的行为模式。例如: ```bash unshare --fork --pid --mount-proc /bin/bash ``` 此命令演示了如何利用 `unshare` 工具生成一个全新的 PID 和 MOUNT 名字域组合而成的新 shell session 。其中参数含义如下: - `--fork`: 同步执行后续指令而非阻塞当前线程等待完成. - `--pid`: 开启新的 PROCESS GROUP NAME SPACE . - `--mount-proc`: 将 proc filesystem remounted inside the new mount namespace so that it reflects information about processes within this pid namespace only. 同样地,在 docker run 命令行里可以通过加 `-it`, `--network=none`, etc., 参数进一步调整默认行为以满足特殊需求场景下的定制化要求. --- ### 总结 综上所述,Docker 运用多种 linux kernel namespaces 技术手段达成高效便捷的应用程序封装部署解决方案的同时还兼顾到了性能优化考量因素; 不但简化了传统 IT 架构下繁杂冗长的手动配置流程而且极大地提高了软件版本迭代更新效率降低了运维成本开支.^,^[^2]^,^[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值