一、 Unix域套接字簡介
現(xiàn)實世界中兩個人進行信息交流的整個過程被稱作一次通信(Communication),通信的雙方被稱為端點(Endpoint)。
工具通訊環(huán)境的不同,端點之間可以選擇不同的工具進行通信,距離近可以直接對話,距離遠可以選擇打電話、微信聊天。這些工具就被稱為 Socket。

同理,在計算機中也有類似的概念:
在 Unix 中,一次通信由兩個端點組成,例如 HTTP 服務端和 HTTP 客戶端。
端點之間想要通信,必須借助某些工具,Unix 中端點之間使用 Socket 來進行通信。
Socket 原本是為網絡通信而設計的,但后來在 Socket 的框架上發(fā)展出一種 IPC 機制,就是 UDS。
Unix Domain Socket(UDS,Unix 域套接字),它還有另一個名字叫 IPC(inter-process communication,進程間通信)。
使用 UDS 的好處顯而易見:不需要經過網絡協(xié)議棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數(shù)據(jù)從一個進程拷貝到另一個進程。這是因為,IPC 機制本質上是可靠的通訊,而網絡協(xié)議是為不可靠的通訊設計的。
UDS 與網絡 Socket 最明顯的區(qū)別在于,網絡 Socket 地址是 IP 地址加端口號,而 UDS 的地址是一個 Socket 類型的文件在文件系統(tǒng)中的路徑,一般名字以 .sock 結尾。
這個 Socket 文件可以被系統(tǒng)進程引用,兩個進程可以同時打開一個 UDS 進行通信,而且這種通信方式只會發(fā)生在系統(tǒng)內核里,不會在網絡上進行傳播。
二、 應用實例
MySQL
MySQL 在本地可以通過 socket 方式連接。
在本地登錄時,如果 my.cnf 配置文件中的 [client] 部分沒有指定 socket 文件路徑,mysql 默認會去尋找 /tmp/mysql.sock(編譯裝)或 /var/lib/mysql/mysql.sock(rpm安裝),所以如果 mysqld 服務啟動的時候,生成的 socket 文件不是默認路徑的話,登陸可能會報錯(ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock')。
其實 [mysqld] 部分及 [client] 部分都配置具體路徑可避免此問題,也可以在 tmp 路徑下建立軟連接,如:ln -s /pah/to/mysql.sock /tmp/mysql.sock 。
同樣的,socket 文件目錄權限要對 mysql 系統(tǒng)用戶放開。
$ mysq -u root --socket=/path/to/mysql.sock
$ mysql --help | grep socket
-S, --socket=name
The socket file to use for connection.
The buffer size for TCP/IP and socket communication.

docker
在docker官方文檔docker-engine中,介紹了三種訪問docker Remote API的方式,分別是unix套接字文件、tcp監(jiān)聽端口和fd文件描述符。
# cat /var/systemd/system/docker.service
ExecStart= /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock




三、參考
MySQL中的pid與socket是什么?
https://mp.weixin.qq.com/s/MehZ8GeRD9SBm8PxfGugRw
網絡協(xié)議之:socket協(xié)議詳解之Unix domain Socket
http://www.flydean.com/17-unix-domain-socket
https://mp.weixin.qq.com/s/4RwASqJu3Vc_suslKSbBkw
如何給UNIX域Socket套接字抓包?
https://mp.weixin.qq.com/s/SrV9_RouBJtZaUgG4WlamQ
Unix域套接字(Unix Domain Socket)介紹
https://mp.weixin.qq.com/s/psmAL216huaqytwrbcoIMw
關于/var/run/docker.sock文件的理解
https://cloud.tencent.com/developer/article/1454335
Daemon socket option
https://docs.docker.com/engine/reference/commandline/dockerd/#description
使用 Unix Domain Socket 與上游集群通信
https://mp.weixin.qq.com/s/5i_y1O7bSafAW7I51S7N8w
徹底搞懂文件描述符fd
https://www.itqiankun.com/article/file-fd