![非ネットワーク Unix ドメイン ソケットとは何ですか?](https://rvso.com/image/1671485/%E9%9D%9E%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%20Unix%20%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%20%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
私は読んでいます安全でない Docker デーモンが明らかに
それは言う
Docker daemon creates a non-networked Unix domain socket at /var/run/docker.sock
ネットワーク化されていない Unix ドメイン ソケットは何を意味しますか?
答え1
これはアドレスがファイルシステムパス何らかの形式のネットワーク アドレスではなく、たとえば、 などの IP アドレス:ポートに接続する代わりに127.0.0.1:4567
、プログラムは特別なファイル に「接続」します/var/run/docker.sock
。
(ただし、実際のAPIはIPソケットとUnixソケットでほぼ同じです。プログラムは両方のタイプで同じsocket()、bind()、connect()呼び出しを使用します。ソケットタイプとしてAF_UNIX
通常のものの代わりに(またはAF_LOCAL)を指定するだけで済みますAF_INET[6]
。そのため、内部通信では非常に一般的な選択肢となっています。実際、ほとんどLinux システム上のプログラムはこの方法で通信します。
これは「非ネットワーク」です。なぜなら、ソケットはローカルで実行中のプロセスからのみアクセス可能だからです。(NFS または SSHFS 経由では使用できません。) ローカルホストにバインドできる「IP ドメイン」ソケットとは異なります。または任意のアドレス(ポート 2375 上の外部からアクセス可能な IP ソケットについて説明しているリンクされた記事など)では、「Unix ドメイン」ソケットはローカルのみであることが保証されます。
(さらに、Unixソケットはファイルパーミッションを使用してソケットへのアクセスを制限できます(たとえば、「docker」グループのメンバーのみにアクセスを許可)。また、デーモンは接続するすべてのクライアントのUIDを知っています。最後に、もちろん、ソケットには適切な名前そうすれば、2 つの異なるプログラムが同じポートを争うことがなくなります…)
「ドメイン」という用語は、インターネットの「ドメインネームシステム」とは何の関係もなく、「領域」や「エリア」という一般的な意味でのみ使用されます。私が知る限り、「Unixドメイン」は単に「ローカルで実行されているOS」(「インターネットに接続されているすべてのマシン」ではなく)を意味するはずでした。このメカニズムを持っているため、ソケットAPIの一部として確かに、これは元々 Unix の機能でした。より適切な名前は「ローカル ソケット」、つまり AF_LOCAL ですが、これは定着しませんでした。
Windows には、「名前付きパイプ」と呼ばれる非常によく似た機能があります\\.\pipe\docker_engine
。例: Windows の名前付きパイプは、確かに Unix パイプよりも Unix ソケットのように動作します。ただし、プログラムは、ソケットを使用する場合と比較して、Windows で名前付きパイプを使用するために完全に異なる API を使用する必要があります (Win10 には AF_UNIX ソケットもあります)。また、SMB 経由でセキュリティ保護されていないパイプにアクセスすることも可能です。
答え2
文脈から判断すると、dockerはホストの外部(つまりローカルおよび外部ネットワーク)からはアクセスできないが、「[同じマシン上の]ルート権限またはDockerグループメンバーシップを持つプロセスのみがアクセスできます」