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

时间:2019-06-25 04:38:15

标签: docker

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

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

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

我尝试了该选项,以了解使用/不使用host-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
$

curl以外的所有192.168.0.13:80命令都失败了。

除了我在这里提到的以外,还有其他区别吗?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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