摘要:創建容器命令通過套接字發送到守護進程的接口,這個將會基于鏡像創建容器并返回容器的。注意綁定套接字之后,容器的權限會很高,可以控制守護進程。
譯者按: 這篇博客介紹了什么是/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守護進程進行通信。
圖片來源: http://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)...
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/
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 sh2. 監聽Docker守護進程的事件流
在alpine容器內,可以通過Docker套接字發送HTTP請求到/events接口。這個命令會一直等待Docker daemon的事件。當新的事件發生時(例如創建了新的容器),會看到輸出信息。
curl --unix-socket /var/run/docker.sock http://localhost/events3. 觀察事件
基于Nginx鏡像運行容器之后,通過aplpine容器的標準輸出可以觀察到Docker daemon生成的事件。
docker run -p 8080:80 -d nginx
可以觀察到3個事件:
創建容器
連接默認的橋接網絡(bridge network)
啟動容器
結論希望這些簡單的解釋可以幫助大家理解/var/run/docker.sock文件,并且明白它綁定到容器時有何作用。顯然,真正的應用會使用代碼而不是curl命令給Docker守護進程發送HTTP請求。
注意: 綁定Docker套接字之后,容器的權限會很高,可以控制Docker守護進程。因此,這一點必須謹慎使用,只能用于足夠信任的容器。
歡迎加入我們Fundebug的Docker技術交流群: 305097057。
版權聲明:
轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26875.html
摘要:基本概念采用與相同的機制,只是運行在不同的抽象層次上。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括配置維護名字服務分布式同步組服務等。它是集群的分布式,能夠原樣運行任何二進制發布版本,如等等。部署為了部署的方便全部使用部署。 筋斗云 豈安運維工程師愛游泳、愛旅行、愛計算機。 前言 目前越來越多的互聯網企業開始使用 docker,在這之前,虛擬機占據著大部分的企業市場...
摘要:基本概念采用與相同的機制,只是運行在不同的抽象層次上。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括配置維護名字服務分布式同步組服務等。它是集群的分布式,能夠原樣運行任何二進制發布版本,如等等。部署為了部署的方便全部使用部署。 筋斗云 豈安運維工程師愛游泳、愛旅行、愛計算機。 前言 目前越來越多的互聯網企業開始使用 docker,在這之前,虛擬機占據著大部分的企業市場...
摘要:是一個鍵值存儲,用于共享配置以及服務發現。對于我們而言,意味著注冊進程必須考慮到端口映射。這個方法被用于管理服務發現。如果未指定,將被從的端口映射找到意味著,你必須在運行的命令中指定它,比如。為了測試取消登記,停止一個容器將立即從中移除。 注:該文由 adetante 編寫,該文的原文地址為 Service discovery with Docker - 2 該文緊接著上篇文...
摘要:本文的目的最主要是備忘其次是分享療效并不能讓你一下子掌握這只是一個比較完整的解決方案其他基礎知識自行補充基調首先這不是屠龍刀不要奢望一篇文章可以走遍天下這里只是提供一個具體的落地方案一個具體的技術選型階段代碼倉庫關于代碼倉庫本文選取的方案是 本文的目的:最主要是備忘, 其次是分享 療效: 并不能讓你一下子掌握CI/CD, 這只是一個比較完整的解決方案,其他基礎知識,自行補充. 基調...
摘要:我一直在尋找盡可能小的容器入手,并且發現了一個鏡像是完美的,真正的完美它簡潔,小巧以及快速。所以這可能就是最小的鏡像。盡管如此,這樣看起來會很復雜并且導致容器很大。 注:本文由 Adriaan de Jonge 編寫,本文的原文地址為 Create The Smallest Possible Docker Container 當我們在使用 Docker 的時候,你會很快注意到...
閱讀 1148·2021-11-24 10:43
閱讀 3102·2021-11-22 09:34
閱讀 3549·2021-10-08 10:04
閱讀 3932·2021-09-23 11:58
閱讀 3115·2019-08-30 15:44
閱讀 483·2019-08-30 13:01
閱讀 1155·2019-08-28 18:07
閱讀 1448·2019-08-26 13:42