探索 Docker Desktop 上的网络功能

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

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

VPN 直通

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

端口映射

当您运行带有参数的容器时,例如:-p

$ docker run -p 80:80 -d nginx

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

$ docker run -p 8000:80 -d nginx

现在,连接到将发送到容器中的端口 80。这 的语法 为 。localhost:8000-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 框中,粘贴您的 URL。socks5://host:port

适用于 Mac 和 Linux 的网络功能

SSH 代理转发

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

  1. 通过将以下参数添加到您的命令中,绑定挂载 SSH 代理套接字: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 中实现网络的方式,您无法 请参阅主机上的接口。这个接口实际上位于 虚拟机。docker0

我无法 ping 我的容器

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

无法按容器进行 IP 寻址

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

使用案例和解决方法

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

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

您还可以使用 访问网关。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
    

我想要从主机连接到容器

端口转发适用于 .、 或 all work。 从 Linux 公开的端口将转发到主机。localhost--publish-p-P

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

例如,要运行 Web 服务器:nginx

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

为了阐明语法,以下两个命令都将容器的端口发布到主机的端口:808000

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

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

要发布所有端口,请使用 flag.例如,以下命令 启动一个容器(在分离模式下),该标志发布 容器添加到主机上的随机端口。-P-P

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

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

请参阅 run 命令以了解有关 与 一起使用的发布选项 。docker run