關於/var/run/docker.sock
譯者按:這篇博客介紹了什麼是/var/run/docker.sock,以及如何使用**/var/run/docker.sock**與Docker守護進程通信,並且提供了兩個簡單的示例。理解這些,我們就可以運行一些**能夠管理Docker的Docker容器**,比如Portainer、Kubernetes,是不是很神奇呢?
原文: About /var/run/docker.sock
譯者: Fundebug
為了保證可讀性,本文採用意譯而非直譯。
運行過Docker Hub的Docker鏡像的話,會發現其中一些容器時需要掛載/var/run/docker.sock文件。這個文件是什麼呢?為什麼有些容器需要使用它?簡單地說,它是Docker守護進程(Docker daemon)默認監聽的Unix域套接字(Unix domain socket),容器中的進程可以通過它與Docker守護進程進行通信。
圖片來源: Honeybadger Developer Blog
舉例
不妨看一下 Portainer,它提供了圖形化界面用於管理Docker主機和Swarm集群。如果使用Portainer管理本地Docker主機的話,需要綁定/var/run/docker.sock:
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainern
訪問9000埠可以查看圖形化界面,可以管理容器(container),鏡像(image),數據卷(volume)...
Portainer通過綁定的/var/run/docker.sock文件與Docker守護進程通信,執行各種管理操作。
Docker守護進程的API
安裝Docker之後,Docker守護進程會監聽Unix域套接字:/var/run/docker.sock。這一點可以通過Docker daemon的配置選項看出來(在ubuntu上執行cat /etc/default/docker ):
-H unix:///var/run/docker.sock
注: 監聽網路TCP套接字或者其他套接字需要配置相應的**-H**選項。
Docker engine API v1.27 (最新版)定義的所有HTTP介面都可以通過/var/run/docker.sock調用。
運行容器
使用Portainer的UI,可以輕鬆創建容器。實際上,HTTP請求是通過docker.sock發送給Docker守護進程的。可以通過curl創建容器來說明這一點。使用HTTP介面運行容器需要兩個步驟,先創建容器,然後啟動容器。
1. 創建nginx容器
curl命令通過Unix套接字發送{「Image」:」nginx」}到Docker守護進程的/containers/create介面,這個將會基於Nginx鏡像創建容器並返回容器的ID。
curl -XPOST --unix-socket /var/run/docker.sock -d 『{「Image」:」nginx」}』 -H 『Content-Type: application/json』 http://localhost/containers/createn
輸出返回了容器ID:
{「Id」:」fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65",」Warnings」:null}n
2. 啟動nginx容器
使用返回的容器ID,調用/containers/<ID>/start介面,即可啟動新創建的容器。
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/startn
查看已啟動的容器:
docker lsnCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESnfcb65c6147ef nginx 「nginx -g 『daemon …」 5 minutes ago Up 5 seconds 80/tcp, 443/tcp ecstatic_kirchn...n
可知,使用docker.sock運行容器其實非常簡單。
Docker守護進程的事件流
Docker的API提供了/events介面,可以用於獲取Docker守護進程產生的所有事件流。負載均衡組件(load balancer)組件可以通過它獲取容器的創建/刪除事件,從而動態地更新配置。通過創建一個簡單的容器,我們可以了解如何利用Docker守護進程的事件。
1. 運行alpine容器
下面的命令用於運行容器,並採用交互模式(interactive mode,該模式下會直接進入容器內),同時綁定docker.sock。
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine shn
2. 監聽Docker守護進程的事件流
在alpine容器內,可以通過Docker套接字發送HTTP請求到/events介面。這個命令會一直等待Docker daemon的事件。當新的事件發生時(例如創建了新的容器),會看到輸出信息。
curl --unix-socket /var/run/docker.sock http://localhost/eventsn
3. 觀察事件
基於Nginx鏡像運行容器之後,通過aplpine容器的標準輸出可以觀察到Docker daemon生成的事件。
docker run -p 8080:80 -d nginxn
可以觀察到3個事件:
- 創建容器
- 連接默認的橋接網路(bridge network)
- 啟動容器
結論
希望這些簡單的解釋可以幫助大家理解/var/run/docker.sock文件,並且明白它綁定到容器時有何作用。顯然,真正的應用會使用代碼而不是curl命令給Docker守護進程發送HTTP請求。
注意: 綁定Docker套接字之後,容器的許可權會很高,可以控制Docker守護進程。因此,這一點必須謹慎使用,只能用於足夠信任的容器。
歡迎加入我們Fundebug的Docker技術交流群: 305097057。
版權聲明:
轉載時請註明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/17/about-docker-sock/推薦閱讀:
※DaoCloud、時速雲、靈雀雲這些Docker平台區別在哪裡?
※生產環境中使用Docker Swarm的一些建議
※基於OSS搭建私有(跨區域)Docker鏡像倉庫
TAG:Docker |