新聞中心
譯者按:這篇博客介紹了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock與Docker守護(hù)進(jìn)程通信,并且提供了兩個(gè)簡單的示例。理解這些,我們就可以運(yùn)行一些能夠管理Docker的Docker容器,比如Portainer、Kubernetes,是不是很神奇呢?
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供詔安網(wǎng)站建設(shè)、詔安做網(wǎng)站、詔安網(wǎng)站設(shè)計(jì)、詔安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、詔安企業(yè)網(wǎng)站模板建站服務(wù),十余年詔安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
原文: About /var/run/docker.sock
- 譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。
運(yùn)行過Docker Hub的Docker鏡像的話,會(huì)發(fā)現(xiàn)其中一些容器時(shí)需要掛載/var/run/docker.sock文件。這個(gè)文件是什么呢?為什么有些容器需要使用它?簡單地說,它是Docker守護(hù)進(jìn)程(Docker daemon)默認(rèn)監(jiān)聽的Unix域套接字(Unix domain socket),容器中的進(jìn)程可以通過它與Docker守護(hù)進(jìn)程進(jìn)行通信。
舉例
不妨看一下 Portainer,它提供了圖形化界面用于管理Docker主機(jī)和Swarm集群。如果使用Portainer管理本地Docker主機(jī)的話,需要綁定/var/run/docker.sock:
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
訪問9000端口可以查看圖形化界面,可以管理容器(container),鏡像(image),數(shù)據(jù)卷(volume)...
Portainer通過綁定的/var/run/docker.sock文件與Docker守護(hù)進(jìn)程通信,執(zhí)行各種管理操作。
Docker守護(hù)進(jìn)程的API
安裝Docker之后,Docker守護(hù)進(jìn)程會(huì)監(jiān)聽Unix域套接字:/var/run/docker.sock。這一點(diǎn)可以通過Docker daemon的配置選項(xiàng)看出來(在ubuntu上執(zhí)行cat /etc/default/docker ):
-H unix:///var/run/docker.sock
注: 監(jiān)聽網(wǎng)絡(luò)TCP套接字或者其他套接字需要配置相應(yīng)的-H選項(xiàng)。
Docker engine API v1.27 (最新版)定義的所有HTTP接口都可以通過/var/run/docker.sock調(diào)用。
運(yùn)行容器
使用Portainer的UI,可以輕松創(chuàng)建容器。實(shí)際上,HTTP請求是通過docker.sock發(fā)送給Docker守護(hù)進(jìn)程的??梢酝ㄟ^curl創(chuàng)建容器來說明這一點(diǎn)。使用HTTP接口運(yùn)行容器需要兩個(gè)步驟,先創(chuàng)建容器,然后啟動(dòng)容器。
1. 創(chuàng)建nginx容器
curl命令通過Unix套接字發(fā)送{“Image”:”nginx”}到Docker守護(hù)進(jìn)程的/containers/create接口,這個(gè)將會(huì)基于Nginx鏡像創(chuàng)建容器并返回容器的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. 啟動(dòng)nginx容器
使用返回的容器ID,調(diào)用/containers/
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/start
查看已啟動(dòng)的容器:
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運(yùn)行容器其實(shí)非常簡單。
Docker守護(hù)進(jìn)程的事件流
Docker的API提供了/events接口,可以用于獲取Docker守護(hù)進(jìn)程產(chǎn)生的所有事件流。負(fù)載均衡組件(load balancer)組件可以通過它獲取容器的創(chuàng)建/刪除事件,從而動(dòng)態(tài)地更新配置。通過創(chuàng)建一個(gè)簡單的容器,我們可以了解如何利用Docker守護(hù)進(jìn)程的事件。
1. 運(yùn)行alpine容器
下面的命令用于運(yùn)行容器,并采用交互模式(interactive mode,該模式下會(huì)直接進(jìn)入容器內(nèi)),同時(shí)綁定docker.sock。
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh
2. 監(jiān)聽Docker守護(hù)進(jìn)程的事件流
在alpine容器內(nèi),可以通過Docker套接字發(fā)送HTTP請求到/events接口。這個(gè)命令會(huì)一直等待Docker daemon的事件。當(dāng)新的事件發(fā)生時(shí)(例如創(chuàng)建了新的容器),會(huì)看到輸出信息。
curl --unix-socket /var/run/docker.sock http://localhost/events
3. 觀察事件
基于Nginx鏡像運(yùn)行容器之后,通過aplpine容器的標(biāo)準(zhǔn)輸出可以觀察到Docker daemon生成的事件。
docker run -p 8080:80 -d nginx
可以觀察到3個(gè)事件:
- 創(chuàng)建容器
- 連接默認(rèn)的橋接網(wǎng)絡(luò)(bridge network)
- 啟動(dòng)容器
結(jié)論
希望這些簡單的解釋可以幫助大家理解/var/run/docker.sock文件,并且明白它綁定到容器時(shí)有何作用。顯然,真正的應(yīng)用會(huì)使用代碼而不是curl命令給Docker守護(hù)進(jìn)程發(fā)送HTTP請求。
注意: 綁定Docker套接字之后,容器的權(quán)限會(huì)很高,可以控制Docker守護(hù)進(jìn)程。因此,這一點(diǎn)必須謹(jǐn)慎使用,只能用于足夠信任的容器。
關(guān)于Fundebug
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
版權(quán)聲明
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/17/about-docker-sock/
網(wǎng)站欄目:關(guān)于/var/run/docker.sock
本文來源:http://ef60e0e.cn/article/pijceh.html