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的端口映射。有用例吗?
答案 0 :(得分:3)
Docker主机可能具有多个NIC。在数据中心中,这可能过于隔离流量,例如管理,存储和应用程序/公共。在您的笔记本电脑上,这可能用于无线和有线接口。还有虚拟NIC,可用于回送(127.0.0.1)和VPN隧道。
当您在port publish命令中未指定IP时,默认情况下docker将绑定到主机上的所有接口。在IPv4中,通常将其表示为0.0.0.0,这意味着可以在任何接口上侦听(这就是为什么我不将连接到该地址的原因,因为没有将连接到的原因。 em>任何IP)。使用指定的IP地址,您可以手动指定要使用的接口。您为什么要指定这个?我能想到的几个原因:
尽管有很多可能的原因,除了侦听安全性的环回之外,这些用例很少见,大多数用户都离开了docker侦听所有接口。