docker-compose: 在容器中打开端口但不从主机绑定它

docker-compose: open port in container but not bind it from host

(注意:整个问题是因为我读错了docker网络的IP地址。my-network172.22.0.0/16 127.22.0.0/16。我稍微修改了 OP 以反映我遇到的原始问题)

我使用 docker-compose 创建了一个服务(一个小型​​网络服务器)。网络部分定义为

services:
  service:
    image: ... (this image uses port 9000)
    ports:
      - 9000:9000
networks:
  default:
    name: my-network

docker-compose up 之后,我观察到:

现在我想仅使用 172.22.0.2:9000 来限制来自主机的访问。我觉得如果我不将容器的 9000 端口绑定到主机的 9000 端口,这应该是可能的。然后我从 docker-compose.yml 中删除了 ports: 9000:9000 部分。现在我观察:

我想:因为宿主机和容器都在一个桥接网络中my-network并且已经获得了它们的IP地址。 Web 服务器应该仍然可以从 127.22.0.2:9000 访问。但事实并非如此。

我的问题:

您对网络的理解是正确的。从 docker-compose.yml 中删除端口绑定将从主机中删除暴露的端口。由于主机也是虚拟网络的一部分 my-network,其 IP 与容器位于同一子网中,因此您的服务应该可以直接使用容器 IP 从主机访问。

但我认为,这实际上是一个简单的错字,而不是

127.22.0.0/16

你居然有

172.22.0.0/16

作为 my-network 的子网!这是默认配置中 docker 使用的典型子网,而 127.0.0.0/8 is always bound to the loopback device!

所以连接到 127.22.0.2 实际上会将你连接到 localhost - 这与你遇到的症状一致:

  • 连接到 127.22.0.2:9000 仅当端口在主机上公开时才有效
  • 你总是可以打印 127.22.0.2 因为它是环回地址