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

推荐订阅源

V
Vulnerabilities – Threatpost
V
V2EX
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
Y
Y Combinator Blog
C
Check Point Blog
爱范儿
爱范儿
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
雷峰网
雷峰网
IT之家
IT之家
WordPress大学
WordPress大学
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
罗磊的独立博客
S
SegmentFault 最新的问题
S
Security Affairs
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Google DeepMind News
Google DeepMind News
B
Blog
O
OpenAI News
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
Hacker News: Ask HN
Hacker News: Ask HN
博客园_首页
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Help Net Security
Help Net Security
月光博客
月光博客
J
Java Code Geeks
L
LangChain Blog
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 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/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。