探索 Docker Desktop 的网络功能

Docker Desktop 提供了一些网络功能,使使用更加容易。

所有平台的网络功能

VPN 直通

连接到 VPN 时,Docker Desktop 网络可以工作。为此,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 代理支持

在 Docker Desktop 版本 4.28.0 中引入

注意

需要商业订阅。

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

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

要启用和设置 SOCKS 代理支持

  1. 在**设置**中的**资源**选项卡中导航。
  2. 从下拉菜单中选择**代理**。
  3. 打开**手动代理配置**开关。
  4. 在**安全 Web 服务器 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

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

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