關於/var/run/docker.sock

Fundebug發表於2019-02-25

譯者按: 這篇部落格介紹了什麼是**/var/run/docker.sock**,以及如何使用**/var/run/docker.sock與Docker守護程式通訊,並且提供了兩個簡單的示例。理解這些,我們就可以執行一些能夠管理Docker的Docker容器**,比如Portainer、Kubernetes,是不是很神奇呢?

為了保證可讀性,本文采用意譯而非直譯。

執行過Docker Hub的Docker映象的話,會發現其中一些容器時需要掛載**/var/run/docker.sock**檔案。這個檔案是什麼呢?為什麼有些容器需要使用它?簡單地說,它是Docker守護程式(Docker daemon)預設監聽的Unix域套接字(Unix domain socket),容器中的程式可以通過它與Docker守護程式進行通訊。

關於/var/run/docker.sock

圖片來源: blog.honeybadger.io

舉例

不妨看一下 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/portainer
複製程式碼

訪問9000埠可以檢視圖形化介面,可以管理容器(container),映象(image),資料卷(volume)...

關於/var/run/docker.sock

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/create
複製程式碼

輸出返回了容器ID:

{“Id”:”fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65",”Warnings”:null}
複製程式碼

2. 啟動nginx容器

使用返回的容器ID,呼叫**/containers//start**介面,即可啟動新建立的容器。

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/start
複製程式碼

檢視已啟動的容器:

docker ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcb65c6147ef nginx “nginx -g ‘daemon …” 5 minutes ago Up 5 seconds 80/tcp, 443/tcp ecstatic_kirch
...
複製程式碼

可知,使用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 sh
複製程式碼

2. 監聽Docker守護程式的事件流

在alpine容器內,可以通過Docker套接字傳送HTTP請求到**/events**介面。這個命令會一直等待Docker daemon的事件。當新的事件發生時(例如建立了新的容器),會看到輸出資訊。

curl --unix-socket /var/run/docker.sock http://localhost/events
複製程式碼

3. 觀察事件

基於Nginx映象執行容器之後,通過aplpine容器的標準輸出可以觀察到Docker daemon生成的事件。

docker run -p 8080:80 -d nginx
複製程式碼

可以觀察到3個事件:

  • 建立容器
  • 連線預設的橋接網路(bridge network)
  • 啟動容器

結論

希望這些簡單的解釋可以幫助大家理解**/var/run/docker.sock**檔案,並且明白它繫結到容器時有何作用。顯然,真正的應用會使用程式碼而不是curl命令給Docker守護程式傳送HTTP請求。

注意: 繫結Docker套接字之後,容器的許可權會很高,可以控制Docker守護程式。因此,這一點必須謹慎使用,只能用於足夠信任的容器。

關於Fundebug

Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,得到了Google、360、金山軟體等眾多知名使用者的認可。歡迎免費試用!

關於/var/run/docker.sock

版權宣告

轉載時請註明作者Fundebug以及本文地址:
blog.fundebug.com/2017/04/17/…

相關文章