Docker基础: Linux内核命名空间之(3)net namespace
发布日期:2021-06-30 20:22:38 浏览次数:2 分类:技术文章

本文共 5309 字,大约阅读时间需要 17 分钟。

作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。

在本文中我们将会使用unshare命令来演示Linux内核的net Namespace是如何动作的。

Namespace的历史

Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前就有推出。而在Linux的2.6之后的版本Namespace就逐步的被加了进来。

Linux Namespace的6大类型

项番 类型 功能说明
No.1 MNT Namespace 提供磁盘挂载点和文件系统的隔离能力
No.2 IPC Namespace 提供进程间通信的隔离能力
No.3 Net Namespace 提供网络隔离能力
No.4 UTS Namespace 提供主机名隔离能力
No.5 PID Namespace 提供进程隔离能力
No.6 User Namespace 提供用户隔离能力

Ubuntu版本

root@ubuntu:~# uname -aLinux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linuxroot@ubuntu:~#

事前确认

确认当前进程PID

root@ubuntu:~# echo $$32968root@ubuntu:~#

确认当前进程的各个namespace

root@ubuntu:~# ls -l /proc/$$/nstotal 0lrwxrwxrwx 1 root root 0 Sep 15 10:23 cgroup -> cgroup:[4026531835]lrwxrwxrwx 1 root root 0 Sep 15 10:23 ipc -> ipc:[4026531839]lrwxrwxrwx 1 root root 0 Sep 15 10:23 mnt -> mnt:[4026531840]lrwxrwxrwx 1 root root 0 Sep 15 10:23 net -> net:[4026531957]lrwxrwxrwx 1 root root 0 Sep 15 10:23 pid -> pid:[4026531836]lrwxrwxrwx 1 root root 0 Sep 15 10:23 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Sep 15 10:23 uts -> uts:[4026531838]root@ubuntu:~#

内容说明

项番 内容说明
No.1 linux会在/proc下创建所对应的进程相关的信息,ns则为Namespace的信息
No.2 $$为当前进程PID,/proc/$$/ns下的Namespace的个数回随着Linux内核的高低不同显示的个数不同,因为Linux所支持的Namespace不是一次到位的
No.3 net -> net:[4026531957],不同的Namespace都有不同的编号,比如32968的net的namespace的编号就是4026531957
No.4 关于Cgroup会单独在后面进行说明

事前确认

确认到当前bash中的网络状况

root@ubuntu:~# echo $$32968root@ubuntu:~# ifconfigens33     Link encap:Ethernet  HWaddr 00:0c:29:53:bc:5a          inet addr:192.168.32.38  Bcast:192.168.32.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fe53:bc5a/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:186462 errors:0 dropped:0 overruns:0 frame:0          TX packets:94316 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000          RX bytes:250341662 (250.3 MB)  TX bytes:12197262 (12.1 MB)lo        Link encap:Local Loopback          inet addr:127.0.0.1  Mask:255.0.0.0          inet6 addr: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:158056 errors:0 dropped:0 overruns:0 frame:0          TX packets:158056 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1          RX bytes:18862784 (18.8 MB)  TX bytes:18862784 (18.8 MB)root@ubuntu:~#

ping确认

root@ubuntu:~# ping -w1 www.baidu.comPING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=23.1 ms--- www.a.shifen.com ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 23.188/23.188/23.188/0.000 msroot@ubuntu:~#

使用unshare隔离net namespace

root@ubuntu:~# echo $$32968root@ubuntu:~# unshare --net /bin/bashroot@ubuntu:~#

好像没有任何变化,其实这个已经不是刚才我们的32968进程了,而是一个新的进程,通过确认$$就能确认

root@ubuntu:~# echo $$33886root@ubuntu:~#

再来确认一下,33614和32968两个进程的关系,我们能清楚地看到这是父子关系的两个进程,虽然都是bash

admin01@ubuntu:~$ ps -ef |grep 32968 |grep -v greproot      32968  32967  0 10:16 pts/0    00:00:00 -suroot      33886  32968  0 13:45 pts/0    00:00:00 /bin/bashadmin01@ubuntu:~$ pstree 32968bashqqqbashadmin01@ubuntu:~$

确认

在被隔离了net namespace的bash中确认ifconfig状况。

root@ubuntu:~# echo $$33886root@ubuntu:~# ifconfigroot@ubuntu:~#

使用ip命令确认

root@ubuntu:~# ip addr1: lo: 
mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00root@ubuntu:~#

所以这个状态明显可以看出是被隔离了的namespace,因为这样连127.0.0.1也ping不通

root@ubuntu:~# ping -w1 127.0.0.1connect: Network is unreachableroot@ubuntu:~#

将lo启动起来

root@ubuntu:~# ip link set lo uproot@ubuntu:~# ip add1: lo: 
mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft foreverroot@ubuntu:~#

本地可以ping通了

root@ubuntu:~# ping -w1 127.0.0.1PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.179 ms64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.050 ms--- 127.0.0.1 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.050/0.114/0.179/0.065 msroot@ubuntu:~#

这样的话,基本上就创建了一个类似Docker的network中的none的类型的隔离了

新net Namespace编号

/proc/$$/ns下面会列出当前的namespace信息,我们来看看一下这个使用unshare隔离了net namespace的信息

root@ubuntu:~# echo $$33886root@ubuntu:~# ll /proc/$$/nstotal 0dr-x--x--x 2 root root 0 Sep 15 13:45 ./dr-xr-xr-x 9 root root 0 Sep 15 13:45 ../lrwxrwxrwx 1 root root 0 Sep 15 13:55 cgroup -> cgroup:[4026531835]lrwxrwxrwx 1 root root 0 Sep 15 13:45 ipc -> ipc:[4026531839]lrwxrwxrwx 1 root root 0 Sep 15 13:45 mnt -> mnt:[4026531840]lrwxrwxrwx 1 root root 0 Sep 15 13:45 net -> net:[4026532507]lrwxrwxrwx 1 root root 0 Sep 15 13:45 pid -> pid:[4026531836]lrwxrwxrwx 1 root root 0 Sep 15 13:45 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Sep 15 13:45 uts -> uts:[4026531838]root@ubuntu:~#

与之前进行比较,我们可以清晰地发现,除了net的namespace编号之外,其余都没有改变。

其他相关

内容 URL
在CentOS7上使用LXC管理容器
如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers)
Docker 1.12新功能探索(9):network基础
Docker 1.12新功能探索(10):network基础

转载地址:https://liumiaocn.blog.csdn.net/article/details/52549595 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Docker基础: Linux内核命名空间之(4)uts namespace
下一篇:Docker基础: Linux内核命名空间之(2) ipc namespace

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月06日 17时01分23秒