探索 Docker Desktop 上的网络功能

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

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

VPN 穿透

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

端口映射

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

$ docker run -p 80:80 -d nginx

Docker Desktop 使得容器中运行在端口80上的任何内容,在这个例子中是 nginx,可以在 localhost 的端口80上访问。在这个例子中,主机和容器的端口是相同的。例如,如果你的主机上已经有东西运行在端口80上,你可以将容器连接到一个不同的端口:

$ docker run -p 8000:80 -d nginx

现在,连接到 localhost:8000 的请求会被发送到容器中的端口 80。-p 的语法是 HOST_PORT:CLIENT_PORT

HTTP/HTTPS 代理支持

参见 代理

SOCKS5 代理支持

Introduced in Docker Desktop version 4.28.0

注意

需要商业订阅。

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

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

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

  1. 导航到设置中的资源选项卡。
  2. 从下拉菜单中选择Proxies
  3. 打开手动代理配置开关。
  4. 安全网页服务器 HTTPS框中,粘贴您的socks5://host:port URL。

Mac 和 Linux 的网络功能

SSH 代理转发

在Mac和Linux上的Docker Desktop允许你在容器内使用主机的SSH代理。要做到这一点:

  1. 通过将以下参数添加到您的docker run命令中来绑定挂载SSH代理套接字:

    $--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 地址可以从 设置 中更改。更改 IP 后,需要重置 Kubernetes 集群并退出任何活动的 Swarm。

主机上没有docker0桥接

由于Docker Desktop中网络实现的方式,您无法在主机上看到docker0接口。这个接口实际上位于虚拟机内部。

我无法ping通我的容器

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

每个容器的IP寻址不可行

这是因为Docker的bridge网络无法从主机访问。 然而,如果您是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上,如果容器位于覆盖网络而不是桥接网络上,您也需要这样做,因为这些网络不会被路由。

例如,要运行一个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标志。例如,以下命令启动一个容器(在分离模式下),并且-P标志将容器的所有暴露端口发布到主机上的随机端口。

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

或者,你也可以使用 host networking 来让容器直接访问主机的网络栈。

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