UTS:主机名和域名docker
User:用户网络
Mount挂载文件系系统oop
IPC:进程间通讯code
pid:进程id接口
Net:网络进程
网络名称空间主要实现“协议栈”和“网络设备”的隔离,一个设备能够单独关联给一个单独的名称空间使用,其余名称空间就看不到这个设备了,这使得每一个名称空间均可以配置一个单独的ip与外界通讯,ip
可是若是网络设备不够为网络设备使用了,咱们的内核能够模拟出来一个交换机,并模拟一对接口,一个接到一个名称空间,一个接到交换机,get
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,既能够扮演交换设备,又能够扮演网卡设备,io
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。