作为开源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相关推荐

  1. Docker基础: Linux内核命名空间之(1) mnt namespace

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

  2. Docker基础: Linux内核之Cgroups(1)

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

  3. Linux内核基础——Linux内核基础编程

    任务一.模块编程 子任务1.编写最简单的内核模块,并将其加载到内核中 hello.c #include<linux/module.h> #include<linux/kernel.h ...

  4. docker需要linux内核版本,docker与宿主机内核版本

    1. 楼主的问题1我也产生过,虽然问法不一样,起初我也是想,如果就是运行在centos的服务器上,是否还需要FROM cetnos.但是既然所有书上一开始都说了要pull centos(ubuntu) ...

  5. RCU基础 - linux内核锁(七)

    一.前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现.第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能 ...

  6. docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...

    我有一个Makefile,一些使用PCI设备的C代码 all: g++ -o executable main.cpp dragon.pb.cc -std=c++11 -O3 -I/usr/includ ...

  7. [Linux 基础] -- Linux 内核中的 MFD 子系统

    一.MFD全称 Multi-function Device:多功能设备 二.为何会出现 MFD 子系统 由于出现了一类具有多种功能的外围设备或 cpu 内部集成的硬件模块 三.有哪些多功能设备 3.1 ...

  8. 22岁精神小伙居然利用 Linux 内核漏洞实现 Docker 逃逸

    1 前言 Docker是时下使用范围最广的开源容器技术之一,具有高效易用等优点.由于设计的原因,Docker天生就带有强大的安全性,甚至比虚拟机都要更安全,但如此的Docker也会被人攻破,Docke ...

  9. linux内核网络基础,linux网络内核基础.doc

    linux网络内核基础 linux内核网络栈代码的准备知识 1. linux内核ipv4网络部分分层结构:BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以 ...

最新文章

  1. 微信支付:小微商户申请入驻第二步:图片上传
  2. 西安电子科技大学第16届程序设计竞赛 F题
  3. Docker的网络模式和跨主机通信
  4. mysql的partition分区
  5. MySQL高级 大批量插入数据
  6. 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解
  7. ASP.NET Web API随记汇总
  8. spark 流式计算_流式传输大数据:Storm,Spark和Samza
  9. 【Python】pandas模块中更改Series的数据类型
  10. JSP中include的动态引入和静态引入
  11. 基于python的学生信息管理系统
  12. 优秀的 HTML5 网站设计案例欣赏
  13. 阿里云储存OSS(服务端签名后前端直传)
  14. 如何将PDF转换成xls格式的表格
  15. 统计学基础12-秩和检验
  16. 日知录(16):CAD基础工具
  17. 图片转文字怎么转?这些方法我只告诉你
  18. sql脱敏(身份证、姓名、手机号)
  19. 网页设计技巧大全(摘抄)
  20. 常见职位的英文简称_常见职位英文缩写()

热门文章

  1. 阻抗测量模型 和阻抗谱分析
  2. JAVA基础入门学习编程
  3. 服装网上销售“美国版”——互动+体验=成功
  4. 医疗器械检测测试工装研究
  5. Redist 6.2 zset的写入(源码),最后介绍一下skiplist的结构
  6. 你的人生你定义!享你所想,无惧冒险
  7. 【教程】搜索引擎高级语法
  8. 每日一道leetcode(python)844. 比较含退格的字符串
  9. 2.1 TGA图像文件格式解析
  10. 【Nav2中文网】十一、迁移指南 (四)Galactic到Humble