术语“域”与 Internet 的“域名系统”无关,仅用于一般意义上的“领域”或“区域”——据我所知,“Unix 域”只是意味着“本地运行的操作系统”(而不是“所有连接到 Internet 的机器”),因为将这种机制作为套接字 API 的一部分确实最初是 Unix 功能。更好的名称是“本地套接字”,即 AF_LOCAL,但这并不适用。
Windows 有一个非常相似的功能,称为“命名管道”,例如\\.\pipe\docker_engine. Windows 命名管道确实比 Unix 管道更像 Unix 套接字——然而,与使用套接字相比,程序仍然需要使用完全不同的 API 在 Windows 上使用命名管道(尽管 Win10 也确实有 AF_UNIX 套接字),并且仍然可以访问通过 SMB 的不安全管道。
它是一个套接字,其地址是文件系统路径,而不是某种形式的网络地址。例如,
127.0.0.1:4567
程序不会连接到 IP 地址:端口,而是“连接”到特殊文件/var/run/docker.sock
.(然而,IP 和 Unix 套接字之间的实际 API 几乎相同——程序对这两种类型使用相同的 socket()、bind()、connect() 调用。它们只需要指定
AF_UNIX
(或 AF_LOCAL)而不是通常AF_INET[6]
的socket 类型。这使得它们成为内部通信的一个非常常见的选择。事实上, Linux 系统上的大多数程序都以这种方式通信。)它是“非联网的”,因为只有本地运行的进程才能访问套接字。(您不能通过 NFS 或 SSHFS 使用它。)与可以绑定到 localhost或任何地址的“IP 域”套接字不同(例如在您链接的文章中讨论端口 2375 上的外部可访问 IP 套接字),“Unix domain" 套接字保证是本地的。
(此外,Unix 套接字可以使用文件权限来限制对套接字的访问——例如,仅限于“docker”组的成员——并且守护进程知道每个连接客户端的 UID。最后,当然,套接字有一个正确的名称所以你不会有两个不同的程序争夺同一个端口……)
术语“域”与 Internet 的“域名系统”无关,仅用于一般意义上的“领域”或“区域”——据我所知,“Unix 域”只是意味着“本地运行的操作系统”(而不是“所有连接到 Internet 的机器”),因为将这种机制作为套接字 API 的一部分确实最初是 Unix 功能。更好的名称是“本地套接字”,即 AF_LOCAL,但这并不适用。
Windows 有一个非常相似的功能,称为“命名管道”,例如
\\.\pipe\docker_engine
. Windows 命名管道确实比 Unix 管道更像 Unix 套接字——然而,与使用套接字相比,程序仍然需要使用完全不同的 API 在 Windows 上使用命名管道(尽管 Win10 也确实有 AF_UNIX 套接字),并且仍然可以访问通过 SMB 的不安全管道。根据上下文,这意味着无法从主机外部(即本地和外部网络)访问 docker,但“只有具有 root 权限或 Docker 组成员身份的进程 [在同一台机器上] 可以访问”