如果 docker-compose.yml 文件中没有端口映射定义,则禁用 IP 转发

disable IP forwarding if no port mapping definition in docker-compose.yml file

我正在学习docker网络。我创建了一个启动两个 tomcat 容器的简单 docker-compose 文件:

version: '3'
services:
    tomcat-server-1:
        container_name: tomcat-server-1
        image: .../apache-tomcat-10.0:1.0
        ports:
            - "8001:8080"

    tomcat-server-2:
        container_name: tomcat-server-2
        image: .../apache-tomcat-10.0:1.0

在我用 docker-compose up 启动容器后,我可以看到 tomcat-server-1 在 http://localhost:8001 上的响应。乍一看,本地主机不提供 tomcat-server-2。太棒了,这就是我需要的

当我检查两个 运行 容器时,我可以看到它们使用以下内部 IP:

我看到 tomcat-server-1 也可以通过 http://172.18.0.2:8080 从主机获得。

然后下面的内容让我很吃惊: tomcat-server-2 也可从主机 vie http://172.18.0.3:8080 获得,尽管 docker-compose.yml 文件中未为此容器定义端口映射。

我想达到的是:

我尝试过使用不同的网络配置,例如网桥、none 和主机模式。没有成功。

当然,host 模式无法工作,因为两个 tomcat 容器在内部使用相同的端口 8080。所以如果我是正确的,那么只有 bridgenone 我可以考虑的模式。

可以这样配置 docker 网络吗? 如果仅通过 docker-compose 文件解决此问题,而无需任何外部 docker、iptable 等操作,那就太好了。

如果没有额外的防火墙设置,您无法阻止 Linux-native 主机访问容器私有 IP 地址。

话虽如此,容器专用 IP 地址非常有限。您无法从其他主机访问它们。如果 Docker 在 Linux VM 中是 运行(如 Docker 桌面应用程序在 MacOS 或 Windows 上提供的那样),则 VM 外部的主机无法访问他们要么。在大多数情况下,我建议不要查找容器私有 IP 地址,因为它们不是特别有用。

我不会太担心这个案子。如果您的安全要求需要您阻止非 Docker 主机进程联系容器,那么您可能还对主机上实际 运行 的内容以及谁可以登录进行非常严格的控制;你不应该有可能试图连接到容器的意外主机进程。