码迷,mamicode.com
首页 > Web开发 > 详细

Docker基础 Linux内核命名空间之(3)net namespace

时间:2019-01-20 15:10:59      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:命名空间   mit   挂载点   roo   x86_64   run   .sh   received   启动   

作为开源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 -a
Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu:~#
  • 1
  • 2
  • 3

事前确认

确认当前进程PID

root@ubuntu:~# echo $$
32968
root@ubuntu:~#
  • 1
  • 2
  • 3

确认当前进程的各个namespace

root@ubuntu:~# ls -l /proc/$$/ns
total 0
lrwxrwxrwx 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:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

内容说明

项番内容说明
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 $$
32968
root@ubuntu:~# ifconfig
ens33     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:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

ping确认

root@ubuntu:~# ping -w1 www.baidu.com
PING 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 0ms
rtt min/avg/max/mdev = 23.188/23.188/23.188/0.000 ms
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用unshare隔离net namespace

root@ubuntu:~# echo $$
32968
root@ubuntu:~# unshare --net /bin/bash
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4

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

root@ubuntu:~# echo $$
33886
root@ubuntu:~#
  • 1
  • 2
  • 3

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

admin01@ubuntu:~$ ps -ef |grep 32968 |grep -v grep
root      32968  32967  0 10:16 pts/0    00:00:00 -su
root      33886  32968  0 13:45 pts/0    00:00:00 /bin/bash
admin01@ubuntu:~$ pstree 32968
bashqqqbash
admin01@ubuntu:~$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

确认

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

root@ubuntu:~# echo $$
33886
root@ubuntu:~# ifconfig
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4

使用ip命令确认

root@ubuntu:~# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4

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

root@ubuntu:~# ping -w1 127.0.0.1
connect: Network is unreachable
root@ubuntu:~#
  • 1
  • 2
  • 3

将lo启动起来

root@ubuntu:~# ip link set lo up
root@ubuntu:~# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> 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 forever
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

本地可以ping通了

root@ubuntu:~# ping -w1 127.0.0.1
PING 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 ms
64 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 999ms
rtt min/avg/max/mdev = 0.050/0.114/0.179/0.065 ms
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

新net Namespace编号

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

root@ubuntu:~# echo $$
33886
root@ubuntu:~# ll /proc/$$/ns
total 0
dr-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:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

其他相关

内容URL
在CentOS7上使用LXC管理容器 http://blog.csdn.net/liumiaocn/article/details/52348219
如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers) http://blog.csdn.net/liumiaocn/article/details/52337479
Docker 1.12新功能探索(9):network基础 http://blog.csdn.net/liumiaocn/article/details/52296347
Docker 1.12新功能探索(10):network基础 http://blog.csdn.net/liumiaocn/article/details/52318289

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

Docker基础 Linux内核命名空间之(3)net namespace

标签:命名空间   mit   挂载点   roo   x86_64   run   .sh   received   启动   

原文地址:https://www.cnblogs.com/firsttry/p/10294789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!