六种名称空间:
UTS:主机名和域名
User:用户
Mount挂载文件系系统
IPC:进程间通信
pid:进程id
Net:网络
网络名称空间主要实现“协议栈”和“网络设备”的隔离,一个设备可以单独关联给一个单独的名称空间使用,其他名称空间就看不到这个设备了,这使得每个名称空间都可以配置一个单独的ip与外界通信,
但是如果网络设备不够为网络设备使用了,我们的内核可以模拟出来一个交换机,并模拟一对接口,一个接到一个名称空间,一个接到交换机,
docker网络
docker安装后自动提供三种网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1d7c5fcc9190 bridge bridge local
b3ec0cad3ccc host host local
2c634f206126 none null local
bridge表示桥接式网络(net桥)他会在本机之上创建一个纯软件的交换机,叫docker0,既可以扮演交换设备,又可以扮演网卡设备,
host表示让容器使用宿主机的网络名称空间
none表示null 表示为空,没有任何网卡,封闭式接口只有lo接口
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:72:1c:ca brd ff:ff:ff:ff:ff:ff
inet 10.192.45.116/21 brd 10.192.47.255 scope global dynamic enp0s3
valid_lft 2875sec preferred_lft 2875sec
inet6 fe80::a00:27ff:fe72:1cca/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:58:26:e8:42 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:58ff:fe26:e842/64 scope link
valid_lft forever preferred_lft forever
13: vethcc71d75@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 86:ad:5a:89:e7:46 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::84ad:5aff:fe89:e746/64 scope link
valid_lft forever preferred_lft forever
15: vethe5b386c@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 3a:43:31:9c:5b:0f brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::3843:31ff:fe9c:5b0f/64 scope link
valid_lft forever preferred_lft forever
vethcc71d75@if12和vethe5b386c@if14这两个是我们创建的一对网卡的一半,我们有两个容器,一半在容器里,一半在本机上
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd141921d661 haoran/httpd:v0.2 "/bin/httpd -f -h /d…" 3 hours ago Up 3 hours t2
e0f415751ebb haoran/httpd:v0.1-1 "sh" 3 hours ago Up 3 hours t1
使用brctl命令就可以看的明白了
[root@localhost ~]# yum -y install bridge-utils
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02425826e842 no vethcc71d75
vethe5b386c
可以看到docker0关联了两个设备vethcc71d75和vethe5b386c
每创建一个容器启动并分配ip以后,在主机上会生成一个iptables规则
[root@iZ2zefbrqggvke1qw0kd0hZ ~]# iptables -t nat -vnL
Chain POSTROUTING (policy ACCEPT 8020 packets, 581K bytes)
pkts bytes target prot opt in out source destination
274 17427 MASQUERADE all -- * !docker0 172.18.0.0/16 0.0.0.0/0
*从任何接口进来
!docker0只要不从docker0进来
原地址来个172.18.0.0/16这个网段的
0.0.0.0/0 无论到达任何主机
MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。