5:网络管理

六、网络模式

1、Docker支持的5种网络模式

  • bridge:默认网络,docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
  • host:容器不会获得一个独立的network namespace,而是与宿主机共用一个。
  • other container:与指定的容器使用同一个network namespace,网卡配置也都是相同的。
  • none:获取独立的network namespace,但不为容器进行任何网络配置。
  • 自定义:默认与bridge网络一样。

 

2、Bridge网络

Docker COntainer的bridge桥接模式可以说是目前docker开发者最常使用的,也是默认的网络模式。Bridge桥接模式为Docker Contaniner创建独立的网络栈,保证容器内的进程组使用独立的网络环境,实现容器内、容器与宿主机之间的网络栈隔离。另外Docker通过宿主机上的网桥(docker0)来连通容器内部的网络栈与宿主机的网络栈,实现容器与宿主机乃至外界的网络通信。另Docker桥接模式和VMware的桥接网络不同,Docker桥接模式使用NAT方式使容器可以访问外部网络。

docker pull busybox    #l拉去一个busybox容器
docker container run -itd --name bs1 busybox   #以默认bridge网络启动这个容器
docker container exec -it bs1 sh
/ # ifconfig          #发现只能看到容器独立的网络
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04  
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

3、Host网络

Docker Container中的host模式与bridge桥接模式有很大的不同。最大的区别当属,host模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的Docker Container会和host宿主机共享同一个网络namespace,故Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的IP地址即为宿主机eth0的IP地址。

docker container run -itd --name bs2 --net host busybox   #以host网络启动这个busybox容器
docker container exec  -it bs2 sh    #进入容器终端
ifconfig     #查看容器网络,发现宿主机的网络也可以看见。说明host网络和宿主机同一个namespace
br-cc8c283d0bc8 Link encap:Ethernet  HWaddr 02:42:EE:46:1A:B0  
          inet addr:172.18.0.1  Bcast:172.18.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:eeff:fe46:1ab0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:876 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1077 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2261014 (2.1 MiB)  TX bytes:632025 (617.2 KiB)

docker0   Link encap:Ethernet  HWaddr 02:42:C9:D1:28:F2  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:c9ff:fed1:28f2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:648 (648.0 B)

ens160    Link encap:Ethernet  HWaddr 00:50:56:94:9C:A7  
          inet addr:192.168.1.201  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::f4d7:9ff7:5c05:de61/64 Scope:Link
          inet6 addr: fe80::d63b:13e4:bed3:409a/64 Scope:Link
          inet6 addr: fe80::f642:b8ec:84b:906a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:466447 errors:0 dropped:34 overruns:0 frame:0
          TX packets:207953 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:410820478 (391.7 MiB)  TX bytes:18078772 (17.2 MiB)

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:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:5592 (5.4 KiB)  TX bytes:5592 (5.4 KiB)

vetha135fc9 Link encap:Ethernet  HWaddr 16:1E:83:34:6D:6F  
          inet6 addr: fe80::141e:83ff:fe34:6d6f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2247 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2367 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3256309 (3.1 MiB)  TX bytes:1159983 (1.1 MiB)

vetha8d4716 Link encap:Ethernet  HWaddr 5A:CA:DC:36:A4:33  
          inet6 addr: fe80::58ca:dcff:fe36:a433/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1290 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1389 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:527958 (515.5 KiB)  TX bytes:984411 (961.3 KiB)

vethb829428 Link encap:Ethernet  HWaddr 56:4F:74:3E:98:EA  
          inet6 addr: fe80::544f:74ff:fe3e:98ea/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:648 (648.0 B)

 

4、Other Container网络

Docker Container的other container网络模式是Docker中一种较为特别的网络模式。之所以称为“Other Contaniner”,是因为这个模式下的Docker Container,会使用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处于bridge桥接模式与host模式之间。

Docker Container共享其他容器的网络环境,则至少这两个容器不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。

 

5.none网络

Docker Container的第四种网络模式是none模式。顾名思义,网络环境为none,即不为Docker Container配置网络的网络环境。一旦Docker Container采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。

docker container run -itd --name bs4 --net none busybox    #以none网络启动这个busybox容器
docker container exec -it bs4 sh
/ # ifconfig         #只有lo网络设备
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Docker网络详解:http://www.infoq.com/cn/articles/docker-source-code-analysis-part7

 

七、容器网络访问原理

 1、容器bridge网络模式访问实现

Docker主要通过netfilter/iptables实现网络通信。

iptables由netfilter和iptables组成,netfilter组件是linux内核集成的信息包过滤系统,它维护一个信息包过滤表。这个表用于控制信息包过滤处理的规则集。而iptables只是一个在用户空间的工具,用于增删改查这个过滤表的规则

docker run -itd  -p 80:80 --name web1 nginx    #创建一个nginx容器,将80端口映射出来
iptables -t nat -nL       #查看iptables nat转发表
Chain POSTROUTING (policy ACCEPT)        #容器访问外部转发项
target     prot opt source               destination         
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0        
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:80

Chain DOCKER (2 references)              #外部访问容器转发项
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.3:80
posted @ 2018-03-14 18:08  Wesley·zk  阅读(522)  评论(0)    收藏  举报