我知道默认情况下docker创建一个虚拟网桥docker0
,并且所有容器网络都链接到docker0
。
如上图所示:
eth0
与vethXXX
vethXXX
链接到docker0
的机器与链接到交换机的机器相同但是docker0
和主机之间是什么关系eth0
呢?进一步来说:
问题2可能有点令人困惑,我将保留在那里并进一步解释:
eth0
。如何将其转发到容器?我的意思是,必须有一些存储信息的地方,我该如何检查呢?提前致谢!
阅读答案和官方网络文章后,我发现下图更准确,docker0
并且eth0
没有直接链接,而是可以转发数据包:
http://dockerone.com/uploads/article/20150527/e84946a8e9df0ac6d109c35786ac4833.png
默认docker0
网桥和主机以太网设备之间没有直接链接。如果--net=host
对容器使用该选项,则主机和容器网络堆栈将被链接。
当数据包从容器流到docker0时,如何知道将其转发到eth0,然后再转发到外部世界?
该docker0
桥梁有.1
分配给它的泊坞窗网的地址,这通常是一个或172.17围绕172.18东西。
$ ip address show dev docker0
8: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:03:47:33:c1 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
为容器分配了连接到docker0
桥的veth接口。
$ bridge link
10: vethcece7e5 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master docker0 state forwarding priority 32 cost 2
在默认Docker网络上创建的容器接收该.1
地址作为其默认路由。
$ docker run busybox ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 src 172.17.0.3
Docker使用NAT MASQUERADE从那里进行出站通信,它将遵循主机上的标准出站路由,该默认出站路由可能默认为eth0
。
$ iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
iptables处理连接跟踪并返回流量。
当外部数据包到达eth0时,为什么将其转发到docker0然后转发到容器?而不是处理它或丢弃它?
如果您询问返回的出站流量,请参阅上面的iptables。
如果您是指新的入站流量,则默认情况下不会将数据包转发到容器中。实现此目的的标准方法是设置端口映射。Docker启动一个守护程序,该守护程序侦听端口X上的主机,然后转发到端口Y上的容器。
我不确定为什么NAT也没有用于入站流量。尝试将大量端口映射到容器中时遇到了一些问题,导致将真实世界的接口完全映射到容器中。
问题内容: 我考虑这个问题已有一段时间了,似乎找不到答案。Node.js和V8有什么关系?可以在没有V8的情况下使用Node.js吗? 问题答案: Node.js和V8有什么关系? V8是node.js内的Javascript引擎,用于解析和运行Javascript。Chrome内部使用了相同的V8引擎,以在Chrome浏览器中运行javascript。Google开源了V8引擎,node.js的
问题内容: 我可以看到,由于selenium 2.0,WebDriver和Selenium RC打包在一起供下载。现在,我主要使用WebDriver,但是是否可以不时地将Selenium RC引入测试脚本中?Selenium RC有什么功能但是WebDriver没有,反之亦然? 问题答案: 您可能应该在这里开始研究(尽管您可能已经对此进行了研究):http : //seleniumhq.org/d
问题内容: 已关闭 。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗? 添加详细信息并通过编辑此帖子来澄清问题。 5年前关闭。 改善这个问题 和之间有什么区别? 据我了解,一个将JSON加载到字典中,另一个则加载到对象中。 问题答案: 接受一个对象并产生一个字符串: 将采用类似文件的对象,从该对象读取数据,然后使用该字符串创建一个对象: 需要注意的是与文件和对象,而之间的转换和相互转
这个问题似乎与帮助中心定义的范围内的编程无关。 据我所知,两者都有相同的目的。除了来自Spring MVC和来自JAX-RS这一事实。对此有什么见解吗?
我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s
我有Wildfly 14.0.1,由于在序列化/反序列化时RESTEASY采用的JSONB默认实现Yasson中出现错误(bug),我不得不将Yasson的版本从1.0.1升级到1.0.4。 当我在Wildfly模块中更改版本时,以下是我在日志中出现的错误: 我不明白Yasson和Primefaces之间有什么关系,因为日志里什么都没有。我所知道的是,在Yasson 1.0.1中我不会得到这个错误