VPNkit 是一个由 Docker 开发的 VPNKit 实用库,它是目前 Docker for Mac 和 Docker for Windows 中网络功能的核心库之一。VPNKit 库通过将工作进程从宿主机网络堆栈中分离来增强虚拟机的网络性能,使得虚拟机的网络性能几乎与本地网络性能一致。VPNKit 通过连接到 Docker 的本地代理(Docker for Mac 或 Docker for Windows)来实现虚拟机网络的连接。
一、VPNKit 的工作原理
VPNKit 在网络方面是一个包装器或翻译器。VPNKit 后端库接收虚拟机的网络请求和响应,并将这些请求和响应翻译成适合 Docker 代理的请求和响应。在响应返回到虚拟机的过程中,VPNKit 做出类似的翻译过程,将适合虚拟机网络的响应翻译成适合 Docker 代理的响应。
VPNKit 翻译网路请求和响应的过程分为两个阶段。首先是虚拟机本地请求和响应在一个 UNIX 套接字中的无损转发。然后,编写的代理库将这些请求封装成 UDP 包,这些 UDP 包通过本地命名管道发送到 VPNKit 的后端库。在 VPNKit 后端接收到这些包后,VPNKit 执行二进制位解析识别协议,并将其翻译成适合相应代理库的请求和响应,之后又通过管道返回给代理库。代理库再将这些响应和请求封装成 UDP 数据包,此时 VPNKit 后端再将封装后的UDP数据包转发给虚拟机中的客户机操作系统。
二、VPNKit 库的安全访问
VPNKit 库通过内置的 TLS 加密和身份验证机制来确保通信的安全性,以进行安全访问。VPNKit 后端允许只有特定组的用户和组成员才能访问,VPNKit 后端连接由在代理端口之下的目录中具有特定名称的 UNIX 套接字完成。
// VPNKit 安全访问的示例代码
$ sudo vpnkit --vsock-path /var/run/docker.sock
--ethernet |
sudo ./vpnkit-tap-vsockd
--listen 9000
--socket-path /Users/username/.docker/vpnkit.eth.sock
--vsock 2
三、VPNKit 库的缓存能力解决网络性能问题
VPNKit 后端支持缓存 DNS 查询结果,以提高网络速度与响应能力,并且对外提供了 DNS 代理服务。在虚拟机运行时,VPNKit 存储最近的 DNS 查询和响应。这使得在类似熟练的应用程序状态下网络性能得以显著改善。
// VPNKit 缓存DNS的示例代码
$ sudo vpnkit --ethernet |
sudo ./vpnkit-tap-vsockd
--listen 9000
--vsock 2
--socks-address 127.0.0.1:1080
--dns 10.0.7.1
四、VPNKit 库的桥接和转发网络
VPNKit 能够桥接和转发虚拟机网络,对于应用程序而言是非常有利的。在提供转发网络时,VPNKit 允许动态配置底层虚拟化基础架构。VPNKit 同时提供了转发信息的记录和监控工具,可以方便地进行状态查询和管理。
// VPNKit 桥接和转发网络的示例代码
$ sudo vpnkit --ethernet |
sudo ./vpnkit-tap-vsockd
--listen 9000
--vsock 2
--socks-address 127.0.0.1:1080
--bridge-address 192.168.65.1/24
--port-mapping 11:22:33:44:55:66=10.0.2.2:22,80=172.17.0.2:8080
五、VPNKit 库的 Docker 网络配置能力
VPNKit 提供了一组丰富的 Docker 网络配置,可以帮助您轻松创建各种网络连接类型。一些常用的网络连接类型包括:桥接、主机网络、覆盖网络、Macvlan 网络、IPvlan 网络、P2P 网络以及 Infiniband 网络。VPNKit 还支持各种网络协议,例如 TCP、UDP 和 IP 转发。
// VPNKit Docker 网络配置示例代码
$ sudo vpnkit --ethernet |
sudo ./vpnkit-tap-vsockd
--listen 9000
--vsock 2
--macvlan=docker0,/var/run/docker.sock,00:11:22:33:44:55,single-host-mode
--socks-address 127.0.0.1:1080
--dns 10.0.7.1
六、总结
VPNKit 是一个出色的网络框架,可提供高效的、快速的虚拟网络连接来支持 Docker 应用程序的运行。VPNKit 通过多种方式增强了 Docker 应用程序的网络功能,使其运行更加高效、可靠和安全。此外,VPNKit 还提供了广泛的 Docker 网络配置能力,支持各种不同类型和协议的网络连接。在使用 Docker 应用程序时,VPNKit 是不可或缺的组件之一,旨在提供出色的网络性能和功能。