Docker Desktop网络

Docker Desktop通用平台功能

在 Docker Desktop for Windows Atlas / Linux Atlas / ref:macos 各个平台都有一些共有的网络功能:

VPN 直通

Docker Desktop 网络可以直接附加到一个VPN上,此时 Docker Desktop 拦截来自容器的流量并将其注入主机,就好像他是来自Docker应用程序一样。在外部看来,就是Docker应用程序在使用VPN,外部不知道Dcoker应用程序中还运行了不同的容器。

端口映射(Port Mapping)

在运行容器时使用 -p 参数可以映射端口:

docker run -p 80:80 -d nginx

Docker Desktop 将物理主机的 localhost 端口80和容器端口80做了端口映射(Port Mapping),这样访问物理主机的 localhost:80 就能直接访问容器的 80 端口。当然,如果物理主机的 80 端口事先已经被其他应用占用,则可以使用其他本地主机端口,例如 localhost:8080 映射到容器端口 80

docker run -p 8080:80 -d nginx

配置Docker使用代理

Docker Desktop for Mac 和 Liinux的特定功能

SSH agent转发

在 Mac 和 Linux 上的 Docker Desktop 允许在容器内部使用host主机的 SSH agent,也就是将host主机的SSH agent socket 绑定到容器内部:

docker run ... --mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock

然后在容器内部添加一个 SSH_AUTH_SCOCK 环境变量:

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

Docker Desktop的限制

host主机没有 docker0 网桥

由于 Docker Desktop 实际是一个Linux 虚拟机,所以在host主机上是看不到 docker0 网桥的,这个网桥在Linux虚拟机内部( Docker Desktop on Mac 虚拟机 )

尴尬: 不能ping容器

正因为 host主机没有 docker0 网桥,所以在host主机上其实无法直接访问Linux虚拟机内部的容器(包括我构建的 kind(本地docker模拟k8s集群) 各个工作节点(容器) )。

解决 Docker Desktop网络限制

要像常规Linux上运行Docker容器一样访问Docker容器的服务,唯一的方法是使用 端口映射(Port Mapping) ,例如 Docker Desktop for mac 端口转发(port forwarding)

参考