【问题标题】:Question related to how docker containers networking work有关 docker 容器网络如何工作的问题
【发布时间】:2020-08-08 19:44:03
【问题描述】:

当我们通过 docker 暴露端口时,它的网络路径如下

Docker container network flow

所以当我使用以下命令运行我的容器时

docker run --rm -it --name server -p 45678:45678 ubuntu:14.04 bash

这里我们基本上是在映射 external-host-port : 内部容器端口是否正确?

现在在上面的容器里面如果我启动netcat来监听45678端口;那么任何容器都应该能够使用nc <my-windows-hostname> 45678 与其连接,对吗?但是,它不起作用。

我读到了这篇文章,发现我们需要使用host.docker.internal 而不是 windows-hostname。

我的问题是为什么会这样??

【问题讨论】:

    标签: docker networking linux-containers


    【解决方案1】:

    Docker for Windows(和 Docker for Mac)利用带有 Linux 内核的虚拟机为 linux 容器提供运行时环境。

    这意味着容器确实运行在与您的 Windows 主机不同的主机(具有另一个名称和 IP)上,如下图所示

    |--------------------------------------------------------|
    |  Windows host     |----------------------------------| |
    |                   | Docker VM                        | |
    |  docker cli       | |-------------|  |-------------| | |
    |                   | | ContainerA  |  | ContainerB  | | |
    |                   | |             |  |             | | |
    |                   | |-------------|  |-------------| | |
    |                   |----------------------------------| |
    |--------------------------------------------------------|
    

    docker cli 在 windows 上运行,但所有容器都在 Docker VM 内运行。

    当你运行命令时 Docker VM 上的docker run --rm -it --name containerA -p 45678:45678 ubuntu:14.04 bash 端口 45678 被转发到 containerA 中的端口 45678。

    此外,Docker CLI 负责将 Windows 主机上的端口 45678 转发到 Docker VM。这样做的结果是,当您在 Windows 机器上使用 localhost:45678<my-windows-hostname>:45678 时,您最终会通过链进入容器:

    <my-windows-hostname>:45678 -> <docker VM>:45678 -> ContainerA:45678
    

    您要做的是通过 另一个 容器的已发布端口访问另一个容器,而不是 Windows 主机。为此,您需要拥有 Docker VM 的内部主机名或 IP,而不是 Windows 主机。这就是你可以使用host.docker.internal 的目的。

    来自Docker for Windows Documentation

    主机有一个不断变化的 IP 地址(如果您没有网络,则没有 使用权)。从 18.03 起,我们的建议是连接到 特殊的 DNS 名称 host.docker.internal,解析为内部 主机使用的 IP 地址。

    这是出于开发目的,将 不适用于 Docker Desktop 之外的生产环境 窗户。

    【讨论】:

    • port 45678 on the Docker VM is forwarded to port 45678 in server 服务器是什么意思? Windows 机器还是容器?
    • 你是说-p 45678:45678 的意思是windows-host-port/docker-vm-port : container-port
    • 我的意思是称为服务器的容器。在 docker for windows 中,在容器 A 上发布端口 45678 时,您会得到 &lt;my-windows-hostname&gt;:45678 -&gt; &lt;docker VM&gt;:45678 -&gt; ContainerA:45678 我已经更新了我的答案以澄清这两点
    • 这意味着无论我为我的主机提供什么端口,docker 都将始终为 docker VM 使用相同的端口?它们都不能像集装箱港口那样不同。
    • 是的,它是一样的,但是从用户的角度来看,它是否是同一个端口应该是无关紧要的。 Docker VM 是一个存在的中间层,因为 linux 容器不能在 Windows 上本地运行。如何处理中间步骤是 docker for windows 实现的内部。关键是运行docker cli(windows)的主机上的端口将其端口转发到指定的容器端口。任何中间步骤都是完全内部透明的。
    【解决方案2】:

    当你启动 Docker 时,会自动创建一个默认的桥接网络(也称为桥接),除非另有说明,否则新启动的容器会连接到它。

    因此,当您启动容器时,它已连接到默认桥接网络。

    此外,默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link 选项,这被认为是旧版。

    host.docker.internal 所做的是解析主机使用的内部 IP 地址(经常更改)。

    Reference

    【讨论】:

    • 您的回答也很有帮助,尤其是您的参考。谢谢。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多