Unix ドメインソケット
別名: Unix socket / UNIX ソケット / AF_UNIX / ソケットファイル
同じマシン上のプロセス同士が、ファイルシステム上のパスを宛先にして通信する仕組み。
MySQL や PostgreSQL のローカル接続、Docker デーモンへの接続に使われ、TCP のポート番号ではなくソケットファイルを介する。
公開:
定義
Unix ドメインソケットは、同じマシン上で動くプロセス同士が通信するためのソケットである。
TCP が IP アドレスとポート番号を宛先にするのに対し、こちらは /var/run/docker.sock のようなファイルシステム上のパス(ソケットファイル)を宛先にする。
ネットワークを経由しないので、同じホスト内でしか使えない。
詳細
開発でよく出会うのはデータベースと Docker である。
MySQL のクライアントは Unix 系 OS ではホスト名 localhost を特別扱いし、TCP ではなくソケットファイルで接続する。
PostgreSQL の psql も Unix 系 OS では -h を省くとソケット経由になり、ソケットファイルは .s.PGSQL.5432 のようにポート番号を含む名前で作られる。
Docker の CLI はデーモンの /var/run/docker.sock に接続する。
ソケットに入れるかどうかはファイルと同じくパーミッションで決まり、Linux では接続にソケットファイルへの書き込み権が要る。
よくある誤解
- localhost と 127.0.0.1 は同じ経路になる: MySQL では
localhostがソケット、127.0.0.1が TCP になり、経路も認証で当たるアカウントも変わる(MySQL で「Can't connect to MySQL server」(2002/2003) で接続できない)。 - 繋がらないのはポートかファイアウォールのせい: ソケット経由の失敗は、サーバーが作ったソケットファイルとクライアントが探すパスの食い違いで起きることが多い。
PostgreSQL の peer 認証も、ソケット経由の接続でしか使えない(PostgreSQL で「Peer authentication failed for user」が出て接続できない)。
関連
PostgreSQL の認証方式は pg_hba.conf の local 行(ソケット)と host 行(TCP)で分かれる。Docker のソケットを一般ユーザーで使うための docker グループは、root 相当の権限を持つ。localhost も参照。