docker - 有关Docker容器网络如何工作的问题

标签 docker networking

当我们通过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主机名。

我的问题是为什么?

最佳答案

Windows版Docker(以及Mac版Docker)利用具有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

The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host.

This is for development purpose and will not work in a production environment outside of Docker Desktop for Windows.

关于docker - 有关Docker容器网络如何工作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61421850/

相关文章:

networking - 在 vCenter 上运行 Kubernetes

amazon-web-services - 将Docker容器放入AWS EC2实例的动机

R 创建边缘列表

linux - 如何使用 API/v1.5 在 docker 容器中运行守护进程?

docker - RUN 命令中的 ARG 替换不适用于 Dockerfile

multithreading - 消息传递任意对象图?

c++ - Windows 上的非阻塞套接字在 send() 调用后不会返回

java - UPnP 打印机设备发现

docker - k8s 不下载 docker 容器

php - 运行 Symfony 命令时无法加载 PHP 类