Networking features in Docker Desktop for Mac

预计阅读时间:4分钟

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

Features

VPN Passthrough

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

Port Mapping

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

$ docker run -p 80:80 -d nginx

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

$ docker run -p 8000:80 -d nginx

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

HTTP/HTTPS Proxy Support

See Proxies.

SSH agent forwarding

Docker Desktop for Mac 允许您在容器内使用主机的 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

Known limitations, use cases, and workarounds

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

Changing internal IP addresses

Docker 使用的内部 IP 地址可以通过设置 (Windows) 或首选项 (Mac) 进行更改. 更改 IP 后,需要重置 Kubernetes 集群并离开任何活动的 Swarm.

There is no docker0 bridge on macOS

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

I cannot ping my containers

Docker Desktop for Mac 无法将流量路由到容器.

Per-container IP addressing is not possible

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

Use cases and workarounds

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

I want to connect from a container to a service on the host

主机有一个不断变化的 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
    

I want to connect to a container from the Mac

端口转发适用于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 命令.

mac, networking

by  icopy.site