为Docker容器分配多个IP地址

uttx8gqw  于 2022-12-11  发布在  Docker
关注(0)|答案(1)|浏览(684)

我的计算机上有多个专用ipv4地址(每个地址绑定到一个单独的公共IP地址)
10.0.0.4 10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8
当我运行我的应用程序时,它使用每个IP地址来执行一些请求,一切都工作正常,正如预期的那样。然而,当我试图在Docker中运行它时,我的应用程序声称它无法绑定到IP地址。我相信这是因为Docker网络是隔离的。
我想知道如何通过一个docker-compose.yml文件将这些ipv4地址“公开”给我的服务。

h7appiyu

h7appiyu1#

您说得对,Docker得网络隔离确实涉及到了:您的应用程序将看到一个不可预测的IP地址,Docker提供了一个NAT层,将主机的网络地址转换为该地址。
最常见的设置方法是将应用程序设置为绑定到0.0.0.0“所有接口”。Compose ports:设置采用可选的IP地址部分,默认值也为0.0.0.0。您可以有多个ports:以同一容器端口为目标,只要主机IP和端口对不与其他绑定端口或非Docker服务冲突。
举一个假设的例子:

version: '3.8'
services:
  app:
    image: registry.example.com/app
    environment:
      # Tell the application to listen on all interfaces, port 8080
      BIND_ADDR: '0.0.0.0:8080'
    ports:
      # As the default HTTP service on the first IP address
      - '10.0.0.4:80:8080'
      # On its own port on the last IP address
      - '10.0.0.8:8080:8080'
      # And not on any of the other IP addresses at all

另一种方法是使用network_mode: host禁用Docker的网络堆栈。在这种模式下,您的应用程序将直接看到所有主机接口,并且如果它有特定的逻辑来选择性地绑定到它们,这将像程序不在容器中运行一样工作。但是,这也禁用了所有其他Docker网络功能:您不能隐藏或重新Map端口,也不能通过主机名与其他容器通信,只能通过它们发布的端口。我通常不鼓励主机联网,但对于这种特殊情况,这可能是一种合理的方法。

相关问题