探索 Docker Desktop 上的网络功能

Docker Desktop 提供了多种网络功能,使其更容易 用。

适用于所有平台的网络功能

VPN 直通

Docker Desktop 网络在连接到 VPN 时可以工作。为此, Docker Desktop 拦截来自容器的流量并将其注入 主机,就好像它源自 Docker 应用程序一样。

端口映射

当您使用-p参数,例如:

$ docker run -p 80:80 -d nginx

Docker Desktop 使容器中端口 80 上运行的任何内容都位于 在这种情况下,nginx,在 80 端口上可用localhost.在此示例中, 主机和容器端口相同。例如,如果您已经在端口 80 上运行了某些 您的主机,您可以将容器连接到不同的端口:

$ docker run -p 8000:80 -d nginx

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

HTTP/HTTPS 代理支持

查看代理

SOCKS5 代理支持

在 Docker Desktop 版本 4.28.0 中引入

注意

需要 Business 订阅。

SOCKS (Socket Secure) 是一种协议,它有助于通过代理服务器在客户端和服务器之间路由网络数据包。它提供了一种增强用户和应用程序的隐私、安全性和网络性能的方法。

您可以启用 SOCKS 代理支持,以允许传出请求(例如拉取镜像)并从主机访问 Linux 容器后端 IP。

要启用和设置 SOCKS 代理支持:

  1. 导航到 Settings (设置) 中的 Resources (资源) 选项卡。
  2. 从下拉菜单中选择 Proxies
  3. 打开 Manual proxy configuration (手动代理配置) 开关。
  4. Secure Web Server HTTPS (安全 Web 服务器 HTTPS) 框中,粘贴socks5://host:portURL 的 URL 中。

适用于 Mac 和 Linux 的网络功能

SSH 代理转发

Mac 和 Linux 上的 Docker Desktop 允许您在容器内使用主机的 SSH 代理。作步骤:

  1. 通过将以下参数添加到您的docker run命令:

    $--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
    
  2. 添加SSH_AUTH_SOCK环境变量中:

    $ -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock"
    

要在 Docker Compose 中启用 SSH 代理,请将以下标志添加到您的服务中:

services:
 web:
   image: nginx:alpine
   volumes:
     - type: bind
       source: /run/host-services/ssh-auth.sock
       target: /run/host-services/ssh-auth.sock
   environment:
     - SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock

已知限制

更改内部 IP 地址

Docker 使用的内部 IP 地址可以从 Settings (设置) 中更改。更改 IP 后,需要重置 Kubernetes 集群并保留任何活动的 Swarm。

主机上没有 docker0 网桥

由于在 Docker Desktop 中实现网络的方式,您无法 见docker0interface 上。这个接口实际上位于 虚拟机。

我无法 ping 我的容器

Docker Desktop 无法将流量路由到 Linux 容器。但是,如果您是 Windows 用户,则可以 ping Windows 容器。

无法按容器进行 IP 寻址

这是因为 Dockerbridge无法从主机访问网络。 但是,如果您是 Windows 用户,则可以使用 Windows 容器进行每个容器的 IP 寻址。

使用案例和解决方法

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

主机的 IP 地址正在更改,如果您没有网络访问权限,则没有 IP 地址。 我们建议您连接到特殊的 DNS 名称host.docker.internal, 解析为主机使用的内部 IP 地址。

您还可以使用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
    

我想要从主机连接到容器

端口转发适用于localhost.--publish,-p-P所有工作。 从 Linux 公开的端口将转发到主机。

我们建议您发布一个端口,或从另一个端口进行连接 容器。即使在 Linux 上,如果容器位于 overlay 网络,而不是桥接网络,因为这些网络未路由。

例如,要运行nginx网络服务器:

$ 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旗。例如,以下命令 启动一个容器(在分离模式下),并且-Pflag 发布 容器添加到主机上的随机端口。

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

或者,您也可以使用主机联网为容器提供对主机网络堆栈的直接访问权限。

请参阅 run 命令以了解有关 用于docker run.