Mac版Docker桌面中的网络功能

预计阅读时间:4分钟

用于Mac的Docker桌面提供了多种联网功能,使其更易于使用。

特征

VPN直通

连接到VPN时,适用于Mac的Docker桌面网络可以正常工作。为此,适用于Mac的Docker桌面会拦截来自容器的流量,并将其注入Mac中,就像它是源自Docker应用程序一样。

端口映射

使用-p参数运行容器时,例如:

$ docker run -p 80:80 -d nginx

Docker Desktop for Mac使容器中端口80(在本例中为nginx)上运行的任何内容都在的端口80上可用localhost。在此示例中,主机端口和容器端口相同。如果需要指定其他主机端口怎么办?例如,如果您已经在主机的端口80上运行了某些设备,则可以将容器连接到其他端口:

$ docker run -p 8000:80 -d nginx

现在,到localhost:8000的连接将发送到容器中的端口80。语法为-pIS HOST_PORT:CLIENT_PORT

HTTP / HTTPS代理支持

请参阅代理

已知限制,用例和解决方法

以下是Docker Desktop for Mac网络堆栈上当前限制的摘要,以及一些解决方法的想法。

macOS上没有docker0桥

由于在Mac版Docker桌面中实施联网的方式,因此您无法docker0在主机上看到 接口。该接口实际上在虚拟机中。

我无法ping我的容器

Mac版Docker桌面无法将流量路由到容器。

每个容器的IP寻址是不可能的

无法从macOS主机访问docker(Linux)桥接网络。

用例和解决方法

上述限制会影响两种情况:

我想从容器连接到主机上的服务

主机的IP地址正在更改(如果没有网络访问权限,则没有IP地址)。我们建议您连接到特殊的DNS名称host.docker.internal,该名称 解析为主机使用的内部IP地址。这是出于开发目的,不适用于Docker Desktop for Mac以外的生产环境。

您也可以使用来访问网关gateway.docker.internal

如果您在计算机上安装了Python,请按照以下说明作为示例,从容器连接到主机上的服务:

  1. 运行以下命令以在端口8000上启动简单的HTTP服务器。

    python -m http.server 8000

    如果您已安装Python 2.x,请运行python -m SimpleHTTPServer 8000

  2. 现在,运行一个容器,安装curl,并尝试使用以下命令连接到主机:

     $ docker run --rm -it alpine sh
     # apk add curl
     # curl http://host.docker.internal:8000
     # exit
    

我想从Mac连接到容器

港口转运工程localhost; --publish-p-P所有的工作。从Linux公开的端口将转发到主机。

我们当前的建议是发布端口,或从另一个容器连接。如果容器位于覆盖网络而不是桥接网络上,那么即使在Linux上,这也是您需要执行的操作,因为这些容器未路由。

入门中nginx显示的用于运行Web服务器的命令 就是其中的一个示例。

$ docker run -d -p 80:80 --name webserver nginx

为了阐明语法,以下两个命令都将80容器上的端口公开给8000主机上的端口:

$ docker run --publish 8000:80 --name webserver nginx

$ docker run -p 8000:80 --name webserver nginx

要公开所有端口,请使用该-P标志。例如,以下命令启动容器(以分离模式),-P并将容器上的所有端口公开给主机上的随机端口。

$ docker run -d -P --name webserver nginx

有关与一起使用的发布选项的更多详细信息,请参见run命令docker run

Mac网络