docker的虚拟网络结构:docker
host建立一个虚拟bridge,每一个container对应一个虚拟网络设备(TAP设备),与bridge一块儿构成一个虚拟网络,并经过虚拟bridge相互通讯。网络
Host的物理网络设备eth0做为内部虚拟网络的NAT网关,container经过eth0访问外部网络。ssh
# ifconfigtcp
docker0 Link encap:Ethernet HWaddr 56:84:7A:FE:97:99 url
inet addr:127.0.0.2 Bcast:0.0.0.0 Mask:255.0.0.0code
eth0 Link encap:Ethernet HWaddr 00:50:56:28:39:2C blog
inet addr:172.16.213.129 Bcast:172.16.213.255 Mask:255.255.255.0ip
veth4d69 Link encap:Ethernet HWaddr A2:7D:7B:61:CA:2F get
inet6 addr: fe80::a07d:7bff:fe61:ca2f/64 Scope:Link博客
UP BROADCAST RUNNING MTU:1500 Metric:1
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.56847afe9799 no veth4d69
(1)host内部container内部互访
经过虚拟网桥完成,比较简单。
(2)container经过NAT访问外部网络
-t nat -A POSTROUTING -s 127.0.0.0/8 ! -d 127.0.0.0/8 -j MASQUERADE
上面127.0.0.0/8是内部container的网络,若是目标地址非内部虚拟网络,则进行NAT转换。
(3)外部网络访问container
一般来讲,与虚拟机同样,咱们的容器是用来服务的,这就须要让外部网络可以访问container,这经过DNAT来实现。
-t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 49153 -j DNAT --to-destination 127.0.0.3:22
127.0.0.3:22是内部container的ip和sshd端口,在host上映身为49153端口。
# docker port test_sshd 22
0.0.0.0:49153
实际上,docker的网络结构就是VMWare/KVM的NAT模式。在实际运营中,虚拟机通常会与host在同一个网络,因此采用下面这种桥接模型,而对于docker,因为container内网是不暴露给外部的,因此采用NAT方式。
KVM Bridge示意图:
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0019d1891e2f no eth0
vnet0
做者:YY哥
出处:http://www.cnblogs.com/hustcat/ 本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。