惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - YY哥

在github上写博客 从veth看虚拟网络设备的qdisc 深入学习golang(5)—接口 深入学习golang(4)—new与make 深入学习golang(3)—类型方法 深入学习golang(2)—channel 深入学习golang(1)—数组与切片 Docker实践(6)—CentOS7上部署Kubernetes CoreOS实践(2)—在coreos上安装Kubernetes Docker实践(5)—资源隔离 CoreOS实践(1)—CoreOS初体验 Docker实践(4)—network namespace与veth pair Ceph monitor故障恢复探讨 环回接口(loopback interface)的新认识 Docker实践(3)—浅析device mapper的thin provision Docker实践(1)—入门 gpg的一些常用操作 Open vSwitch实践——VLAN CentOS6.5下安装Open vSwitch
Docker实践(2)—虚拟网络
YY哥 · 2014-08-01 · via 博客园 - YY哥

1 docker(container)的虚拟网络

docker的虚拟网络结构:

NewImage 

host创建一个虚拟bridge,每个container对应一个虚拟网络设备(TAP设备),与bridge一起构成一个虚拟网络,并通过虚拟bridge相互通信。

Host的物理网络设备eth0作为内部虚拟网络的NAT网关,container通过eth0访问外部网络。

# ifconfig

docker0   Link encap:Ethernet  HWaddr 56:84:7A:FE:97:99 

          inet addr:127.0.0.2  Bcast:0.0.0.0  Mask:255.0.0.0

eth0      Link encap:Ethernet  HWaddr 00:50:56:28:39:2C 

          inet addr:172.16.213.129  Bcast:172.16.213.255  Mask:255.255.255.0

veth4d69  Link encap:Ethernet  HWaddr A2:7D:7B:61:CA:2F 

          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

2与虚拟机的比较

实际上,docker的网络结构就是VMWare/KVM的NAT模式。在实际运营中,虚拟机一般会与host在同一个网络,所以采用下面这种桥接模型,而对于docker,由于container内网是不暴露给外部的,所以采用NAT方式。

KVM Bridge示意图:

 NewImage

# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.0019d1891e2f       no              eth0

                                                                        vnet0


作者:YY哥 
出处:http://www.cnblogs.com/hustcat/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。