- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有谁知道 docker 如何决定哪个 NIC 将与 docker0 网络一起工作?我有一个具有两个接口(interface)(eth0 和 ens34)的节点,但是,只有通过 eth0 的请求才会转发到容器。
当我的虚拟机配置好并安装了 Docker 后,我开始了一个非常愚蠢的测试:我创建了一个 centos 虚拟机,在上面安装了 netcat 并提交了图像。然后我启动了一个监听端口 8080 的守护进程容器。我使用了:
docker -it -p 8080:8080 --name nc-server nc-server nc -vv -l 8080
所以我尝试从同一网络中的另一个节点连接到监听端口 8080 的容器(与接口(interface) ens34 具有相同的 IP 地址)。它没有用。
而当我从另一台机器向 eth0 的 IP 地址发送请求时,我在容器中看到了一些 react (通信正常)。我正在“拖尾”它的输出:
docker logs -ft nc-server
我对这个实验的结论:eth0(主网卡)和 docker0 之间存在某种神秘的关系,发送到 ens34(10.)接口(interface)的请求永远不会转发到 veth/docker0接口(interface),只有通过 eth0 (9.*) 的请求。这是为什么?
此外,我知道如果我使用 --net=host 我可以让一切正常工作,但我不想使用它...不知何故感觉不对,使用 HOST 是标准做法吗Docker容器中的模式?有什么注意事项吗?
--
更新:我在禁用 iptables 后设法让它工作:
service iptables stop
但是,我还是不明白发生了什么。以下信息应该与了解正在发生的事情相关:
配置文件
[root@mydockervm2 myuser]# ifconfig | grep -A 1 flags
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
--
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.21.18 netmask 255.255.255.0 broadcast 10.1.21.255
--
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 9.32.145.99 netmask 255.255.255.0 broadcast 9.32.148.255
--
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
--
veth8dbab2f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::3815:67ff:fe9b:88e9 prefixlen 64 scopeid 0x20<link>
--
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
网络统计
[root@mydockervm2 myuser]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 9.32.145.1 0.0.0.0 UG 0 0 0 eth0
9.32.145.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.1.21.0 0.0.0.0 255.255.255.0 U 0 0 0 ens34
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens34
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
过滤器
[root@mydockervm2 myuser]# iptables -t filter -vS
-P INPUT ACCEPT -c 169 106311
-P FORWARD ACCEPT -c 0 0
-P OUTPUT ACCEPT -c 110 13426
-N DOCKER
-N DOCKER-ISOLATION
-A FORWARD -c 0 0 -j DOCKER-ISOLATION
-A FORWARD -o docker0 -c 0 0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -c 0 0 -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -m physdev --physdev-is-bridged -c 0 0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -c 0 0 -j ACCEPT
-A DOCKER-ISOLATION -c 0 0 -j RETURN
自然
[root@mydockervm2 myuser]# iptables -t nat -vS
-P PREROUTING ACCEPT -c 28 4818
-P INPUT ACCEPT -c 28 4818
-P OUTPUT ACCEPT -c 8 572
-P POSTROUTING ACCEPT -c 8 572
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -c 2 98 -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -c 0 0 -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 8080 -c 0 0 -j MASQUERADE
-A DOCKER -i docker0 -c 0 0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -c 0 0 -j DNAT --to-destination 172.17.0.2:8080
想法?
最佳答案
首先,排除显而易见的问题并确保其他网络上的主机知道如何路由到您的机器以到达容器网络。为此,检查
netstat -nr
在源主机上并确保您的 docker 子网以您的 docker 主机作为网关列出,或者处理上游流量的默认路由器知道您的主机。
如果流量被路由但被阻止,那么您将进入转发和 iptables
。对于转发,以下应显示 1:
cat /proc/sys/net/ipv4/ip_forward
确保您的本地主机使用相同的 netstat 命令显示通往您的容器网络的网桥路由,应该有一行表示 docker0 接口(interface)和您的 docker 子网作为目的地:
netstat -nr
对于iptables,查看是否有接口(interface)特定的nat或者filter规则需要调整:
iptables -t filter -vS
iptables -t nat -vS
如果您的转发规则默认为 DROP 而不是 ACCEPT,您可能需要添加一些日志记录,或者如果您认为流量是可信的(例如,主机在另一个防火墙后面),则只需更改默认以接受流量。
综上所述,直接在主机上公布端口是容器的一种相当普遍的做法。对于私有(private)的东西,您可以在其内部网络上设置多个容器,这些容器可以相互通信,但不能与其他容器通信,并且您只使用 -p
标志在主机上公开真正向世界其他地方开放的端口运行(或 docker-compose 中的端口选项)。
关于linux - 如何配置 Docker 以使用我的 ens34 网络接口(interface)(而不是 eth0)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757759/
I have list of languages in array as shown below; I currently have english js file as import and use
我在 IE8 中使用 Google Charts 时无限出现以下错误 SCRIPT70: Permission denied format+en,default+en,ui+en,corechart+
你好, 我正在使用 Windows XP sp2 作为我的开发平台, 我在显示 时遇到问题货币符号 . 你看,对于马来西亚来说,正确的货币符号是 RM , 但是当我使用 uiCulture="ms"c
我最近从一台装有 Windows 10 和 VS 2017 的计算机换成了一台装有 Windows 8.1 和 VS 2017 的计算机。我正在处理一段代码,它有这样一行。 Thread.Curren
自从我绞尽脑汁重写 htaccess 以来已经有一段时间了。我想将所有页面从 example.com/en/XXX 重定向到 example.com/en。我正在执行重定向循环或错误 500。 是否可
我有一个国际化的 C#/WPF 应用程序(某些语言的资源字符串)。 目前我正在为资源文件使用以下代码:default.resx、de-DE、fr-FR、es-ES、pt-BR、pt-PT、nl-NL等
我正在尝试做一些非常简单的事情。 场景如下:我有一个整个网站与支持推送状态的浏览器配合得很好。该网站的工作基础是该语言是“实际页面”,例如: /en/whatever/etc = index.en.
在我对 NLP 的研究中,更具体地说是在 spacy 库中,我对此感到困惑,from spacy.lang.en import English() 和有什么不一样和 spacy.load('en')以
如何用 JavaScript 自动替换浏览器地址栏中的url 来自 company.com/en/services/ 至 company.com/en/#services ? 示例:当
上下文: 我们正在开发一个 iOS 应用程序,其中包含 Math/Maths 这个词。这需要根据设备的语言是英语还是英式英语进行更改。 问题: 所以,我有两个 en-GB 和 en-US 的 Info
这个问题在这里已经有了答案: What's the difference between html[lang="en"] and html:lang(en) in CSS? (6 个答案) 关闭
我从 the PocketSphinx tutorial 中读取了以下代码 config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm
使用 htaccess mod_rewrite 我想将任何不以 example.com/en 开头的 URL 重写为/en/* 例如 example.com/about-us 到 example.co
我有一个 C# 应用程序,它必须在具有不同文化设置的机器上运行。我认为没问题,它只会在启动时查找机器上当前的文化,并为我做所有事情。好吧,不,它会让人感觉有些不对劲。 我有一台 Windows XP
我通过将每条记录推送到验证阶段,然后将其放入数据库来处理记录。验证步骤之一需要检查某些列是否为日期。我使用 DateTime.TryParse(s, out DateTime) 执行此操作,假设这将使
在开发者机器上(cassini) new DateTime(2012,3,14).ToString("d") 结果 14/03/2012 这是正确的,但是当部署到完整的 IIS 服务器时,结果是 03
为什么第一行代码会抛出“String was not recognizes as a valid DateTime.”异常? en-GB 似乎与 en-US 不兼容,但奇怪的是与 zh-CN 和 ru
之间有什么区别?和 ?破折号后面还有哪些其他值? 根据 w3.org “任何两个字母的子代码都被理解为 [ISO3166] 国家代码。”这是否意味着任何 value listed under th
CSS 语言伪类允许我们为不同的语言指定不同的样式,如下所示: html:lang(en) .foo { ... } 但是,这在 IE7 中不起作用,所以我一直在使用属性选择器: html[lang=
我想知道如果我选择使用 UWP 应用程序的默认语言作为“ en ”而不是“ en-US ”,并仅为“ en ”文化提供本地化资源,而不为“ en-US ”提供本地化资源。 考虑到应用程序中没有太多文本
我是一名优秀的程序员,十分优秀!