關於/var/run/docker.sock

譯者按: 這篇博客介紹了什麼是/var/run/docker.sock,以及如何使用/var/run/docker.sock與Docker守護進程通訊,而且提供了兩個簡單的示例。理解這些,咱們就能夠運行一些可以管理Docker的Docker容器,好比Portainer、Kubernetes,是否是很神奇呢?javascript

原文: About /var/run/docker.sockjava

譯者: Fundebugnginx

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

運行過Docker Hub的Docker鏡像的話,會發現其中一些容器時須要掛載/var/run/docker.sock文件。這個文件是什麼呢?爲何有些容器須要使用它?簡單地說,它是Docker守護進程(Docker daemon)默認監聽的Unix域套接字(Unix domain socket),容器中的進程能夠經過它與Docker守護進程進行通訊。json

圖片來源: http://blog.honeybadger.ioubuntu

舉例小程序

不妨看一下 [Portainer](http://portainer.io/),它提供了圖形化界面用於管理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)...api

Portainer經過綁定的/var/run/docker.sock文件與Docker守護進程通訊,執行各類管理操做。ruby

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/<ID>/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、金山軟件等衆多知名用戶的承認。歡迎免費試用!

 

版權聲明:


轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/17/about-docker-sock/

相關文章
相關標籤/搜索