繁体   English   中英

何时执行基于主机IP的端口映射,例如“ -p host-ip:port:port”

[英]When to perform host-ip based port mapping like “-p host-ip:port:port”

Docker提供了一种在容器和主机之间映射端口的方法。

根据官方文档,在端口映射时也可以提及host-ip。

-p 192.168.1.100:8080:80将容器中的TCP端口80映射到Docker主机上的端口8080,以连接到主机IP 192.168.1.100

我尝试了该选项,以了解使用/不使用主机IP的区别。

  • 仅使用-p 80:80
$ docker run -itd -p 80:80 nginx:alpine
$ curl localhost:80
$ curl 127.0.0.1:80
$ curl 0.0.0.0:80
$ curl 192.168.0.13:80
$ ps -ef | grep docker-proxy
16723 root      0:00 /usr/local/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.1 -container-port 80
$

所有curl命令都返回输出。

  • 使用像-p 192.168.0.13:80:80这样的host-ip
$ docker run -itd -p 192.168.0.13:80:80 nginx:alpine
$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused
$ curl 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
$ curl 0.0.0.0:80
curl: (7) Failed to connect to 0.0.0.0 port 80: Connection refused
$ curl 192.168.0.13:80 # return output
$ ps -ef | grep docker-proxy
4914 root      0:00 /usr/local/bin/docker-proxy -proto tcp -host-ip 192.168.0.13 -host-port 80 -container-ip 172.17.0.2 -container-port 80
$

192.168.0.13:80以外,所有curl命令均失败。

除了我在这里提到的以外,是否还有其他区别。

想知道何时使用基于主机IP的端口映射。 有没有用例?

一个Docker主机可能具有多个NIC。 在数据中心中,这可能过于隔离流量,例如管理,存储和应用程序/公共。 在您的笔记本电脑上,这可能用于无线和有线接口。 还有虚拟NIC,用于回送(127.0.0.1)和VPN隧道。

当您在port publish命令中未指定IP时,默认情况下docker将绑定到主机上的所有接口。 在IPv4中,这通常表示为0.0.0.0,这意味着可以在任何接口上侦听(这就是为什么我不连接该地址,因为没有连接任何IP的原因)。 使用指定的IP地址,您可以手动指定要使用的接口。 您为什么要指定这个? 我能想到的几个原因:

  • 仅侦听127.0.0.1以阻止外部访问
  • 侦听0.0.0.0以显式绑定到所有IPv4接口(可以更改docker的默认行为,因此某些情况可能是必需的)。
  • 侦听一个物理NIC,从而允许其他NIC被同一端口上的其他服务绑定。
  • 如果该应用程序不适用于IPv6,则仅在IPv4接口上侦听。

尽管有很多可能的原因,除了监听环回以确保安全性之外,这些用例很少见,大多数用户都离开了docker监听所有接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM