【问题标题】:Docker publishing ports to multiple IPsDocker 将端口发布到多个 IP
【发布时间】:2023-03-20 18:46:01
【问题描述】:

如果我的主机有两个 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) 第二个命令因“地址已在使用”而失败或
B) some_other_container 的 80 端口暴露在 192.168.0.2 上,而 some_container 的 80 端口暴露在 192.168.0.3 上?

如果是 A),那么我怎样才能使这项工作以这样一种方式工作,即“some_container”总是在 192.168.0.3 上暴露其端口 80,而“some_other_container”总是以“-p”开头(不能指定 IP)在 192.168.0.2 上暴露其端口?

【问题讨论】:

    标签: networking docker docker-compose


    【解决方案1】:

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

    $ 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 内运行。我必须能够拍摄 VM 的快照,并使用完全相同的 Docker 配置从快照创建一个新快照。我可以在启动第二个 VM 之前更改 docker 守护进程绑定 IP,但我无法找到如何更改现有容器的绑定 IP 的方法...
    • 这是一个非常独特的问题,不要认为有一个简单的解决方案。 Docker 并不神奇,当您更改盒子上的 IP 时,当前绑定在该 IP 上的所有内容都可能出现问题,可以肯定 Docker 将包含在该列表中。认为你最好要么反弹容器(如果不是整个守护进程),或者使用可以中继所有流量的代理,以便它可以侦听所有接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2020-04-20
    • 2014-09-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多