iptables中的DOCKER链是如何工作的?

iptables中的DOCKER链是如何工作的?,docker,nginx,iptables,Docker,Nginx,Iptables,我是docker的新手 最近我遇到了一些奇怪的情况。 我在OCI(Oracle云基础设施)中创建了ubuntu实例。 当我在这个ubuntu实例中启动nginx进程时,从外部网络访问失败。 当我使用docker容器启动nginx时,从外部网络访问成功 经过一些搜索,我发现iptables中的输入链不允许tcp 80。 此外,docker将更新我的iptables以在预路由链中添加规则。 下面是命令sudoiptables-nL-tnat的结果 Chain PREROUTING (policy A

我是docker的新手

最近我遇到了一些奇怪的情况。
我在OCI(Oracle云基础设施)中创建了ubuntu实例。
当我在这个ubuntu实例中启动nginx进程时,从外部网络访问失败。
当我使用docker容器启动nginx时,从外部网络访问成功

经过一些搜索,我发现iptables中的输入链不允许tcp 80。
此外,docker将更新我的iptables以在预路由链中添加规则。
下面是命令sudoiptables-nL-tnat的结果

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
但正如您在DOCKER链中所看到的,我认为退货规则总是比DNAT规则应用得更早。
这意味着,DOCKER chain不做任何事情

有人能解释一下吗?
一个可能的假设是,不管规则的顺序如何,返回规则都是最后应用的。(但我不确定这是不是真的)


谢谢

返回规则实际上将首先应用,但并不意味着忽略其他规则。还有另外两个变量IN和OUT描述规则的输入和输出

您可以将
-v
添加到命令中以显示它

$ iptables -nL -v -t nat

......
Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
   12   720 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0
 1691  107K DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8601 to:172.17.0.2:8601
......