Docker基础: Linux内核命名空间之(3)net namespace
作为开源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:~#
事前确认
确认当前进程PID
root@ubuntu:~# echo $$
32968
root@ubuntu:~#
确认当前进程的各个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:~#
内容说明
项番 | 内容说明 |
---|---|
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:5ainet addr:192.168.32.38 Bcast:192.168.32.255 Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fe53:bc5a/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:186462 errors:0 dropped:0 overruns:0 frame:0TX packets:94316 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:250341662 (250.3 MB) TX bytes:12197262 (12.1 MB)lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:158056 errors:0 dropped:0 overruns:0 frame:0TX packets:158056 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1RX bytes:18862784 (18.8 MB) TX bytes:18862784 (18.8 MB)root@ubuntu:~#
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:~#
使用unshare隔离net namespace
root@ubuntu:~# echo $$
32968
root@ubuntu:~# unshare --net /bin/bash
root@ubuntu:~#
好像没有任何变化,其实这个已经不是刚才我们的32968进程了,而是一个新的进程,通过确认$$就能确认
root@ubuntu:~# echo $$
33886
root@ubuntu:~#
再来确认一下,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:~$
确认
在被隔离了net namespace的bash中确认ifconfig状况。
root@ubuntu:~# echo $$
33886
root@ubuntu:~# ifconfig
root@ubuntu:~#
使用ip命令确认
root@ubuntu:~# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@ubuntu:~#
所以这个状态明显可以看出是被隔离了的namespace,因为这样连127.0.0.1也ping不通
root@ubuntu:~# ping -w1 127.0.0.1
connect: Network is unreachable
root@ubuntu:~#
将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 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
root@ubuntu:~#
本地可以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:~#
这样的话,基本上就创建了一个类似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:~#
与之前进行比较,我们可以清晰地发现,除了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 |
Docker基础: Linux内核命名空间之(3)net namespace相关推荐
- Docker基础: Linux内核命名空间之(1) mnt namespace
作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分.物有本末,事有终始.知所先后,则近道矣.理解Linux的这两大特性将有助于我们更 ...
- Docker基础: Linux内核之Cgroups(1)
作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分.物有本末,事有终始.知所先后,则近道矣.理解Linux的这两大特性将有助于我们更 ...
- Linux内核基础——Linux内核基础编程
任务一.模块编程 子任务1.编写最简单的内核模块,并将其加载到内核中 hello.c #include<linux/module.h> #include<linux/kernel.h ...
- docker需要linux内核版本,docker与宿主机内核版本
1. 楼主的问题1我也产生过,虽然问法不一样,起初我也是想,如果就是运行在centos的服务器上,是否还需要FROM cetnos.但是既然所有书上一开始都说了要pull centos(ubuntu) ...
- RCU基础 - linux内核锁(七)
一.前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现.第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能 ...
- docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...
我有一个Makefile,一些使用PCI设备的C代码 all: g++ -o executable main.cpp dragon.pb.cc -std=c++11 -O3 -I/usr/includ ...
- [Linux 基础] -- Linux 内核中的 MFD 子系统
一.MFD全称 Multi-function Device:多功能设备 二.为何会出现 MFD 子系统 由于出现了一类具有多种功能的外围设备或 cpu 内部集成的硬件模块 三.有哪些多功能设备 3.1 ...
- 22岁精神小伙居然利用 Linux 内核漏洞实现 Docker 逃逸
1 前言 Docker是时下使用范围最广的开源容器技术之一,具有高效易用等优点.由于设计的原因,Docker天生就带有强大的安全性,甚至比虚拟机都要更安全,但如此的Docker也会被人攻破,Docke ...
- linux内核网络基础,linux网络内核基础.doc
linux网络内核基础 linux内核网络栈代码的准备知识 1. linux内核ipv4网络部分分层结构:BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以 ...
最新文章
- 微信支付:小微商户申请入驻第二步:图片上传
- 西安电子科技大学第16届程序设计竞赛 F题
- Docker的网络模式和跨主机通信
- mysql的partition分区
- MySQL高级 大批量插入数据
- 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解
- ASP.NET Web API随记汇总
- spark 流式计算_流式传输大数据:Storm,Spark和Samza
- 【Python】pandas模块中更改Series的数据类型
- JSP中include的动态引入和静态引入
- 基于python的学生信息管理系统
- 优秀的 HTML5 网站设计案例欣赏
- 阿里云储存OSS(服务端签名后前端直传)
- 如何将PDF转换成xls格式的表格
- 统计学基础12-秩和检验
- 日知录(16):CAD基础工具
- 图片转文字怎么转?这些方法我只告诉你
- sql脱敏(身份证、姓名、手机号)
- 网页设计技巧大全(摘抄)
- 常见职位的英文简称_常见职位英文缩写()