Docker将端口发布到多个IP地址

3
如果我拥有一个有两个IP地址的主机,比如192.168.0.2和192.168.0.3,并且我运行这样一个容器:
docker run -p 192.168.0.3:80:80 some_container

然后我像这样运行另一个容器:

docker run -p 80:80 some_other_container

那么会发生什么?
A) 第二个命令将失败并显示“地址已在使用” OR B) some_other_container 的端口80在192.168.0.2上被暴露,而some_container的端口80在192.168.0.3上被暴露?
如果是A),那么我该如何才能让“some_container”始终在192.168.0.3上暴露其端口80,并且使用“-p”启动的“some_other_container”始终在192.168.0.2上暴露其端口?
1个回答

0

第一个问题很容易通过快速测试来回答:

$ docker run -itd -p 127.0.0.1:80:80 nginx
acdf03bd196d2241d4f776ff701eab6222cc80bfb1b4dd06bc65af0a3625e602
$ docker run -itd -p 80:80 nginx
b75938101d9c8a28b0d7d220b0046a4f8884fb82e9bc337c65d48a214bc3e54f
docker: Error response from daemon: driver failed programming external connectivity on endpoint lonely_kirch (c144b82f83c7ab1c527c25d9a6807d37069a7382181f9bf98bb1b1cd93976313): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.

除非你想重写Linux网络堆栈(不建议),否则我认为你的选择是要么将IP传递给第二个运行命令,要么将默认IP传递给Docker守护程序(dockerd -ip 192.168.0.2),或者选择一个不同的端口。


谢谢,我了解到可以将IP传递给Docker守护进程,这就是我要做的。唯一的问题(我在原始问题中没有提到)是我还想能够在不重新创建容器的情况下更改这些IP。Docker将在虚拟机内运行。我必须能够对VM进行快照,并从快照创建一个具有完全相同Docker配置的新VM。我可以在启动第二个VM之前更改docker守护程序绑定IP,但我还没有找到一种方法来更改现有容器的绑定IP... - Stefan D
这是一个非常独特的问题,我认为没有简单的解决方案。Docker并不是魔法,当您更改盒子上的IP时,当前绑定在该IP上的所有内容都可能会出现问题,我相信Docker也会包括在其中。我认为最好的方法要么是弹跳容器(如果不是整个守护程序),要么使用代理,您可以通过它来中继所有流量,以便它可以监听所有接口。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接