?
This document uses PHP Chinese website manual Release
Docker插件是進(jìn)程外擴展,它為Docker引擎添加了功能。
本文檔描述了Docker Engine插件API。要查看由Docker Engine管理的插件的信息,請參閱Docker Engine插件系統(tǒng)。
本頁面適用于想要開發(fā)自己的Docker插件的人員。如果你只是想了解或使用Docker插件,請看這里。
插件是與docker守護(hù)進(jìn)程運行在相同或不同主機上的進(jìn)程,它通過將文件放置在插件發(fā)現(xiàn)中描述的插件目錄之一中的同一個docker主機上進(jìn)行注冊。
插件具有人類可讀的名稱,它們是短小的字符串。例如,flocker
或weave
。
插件可以在容器內(nèi)部或外部運行。目前建議在容器外部運行它們。
每當(dāng)用戶或容器嘗試按名稱使用插件時,Docker都會通過在插件目錄中查找插件來發(fā)現(xiàn)插件。
有三種類型的文件可以放在插件目錄中。
.sock
文件是UNIX域套接字。
.spec
文件是包含URL的文本文件,例如unix:///other.sock
或tcp://localhost:8080
。
.json
文件是包含插件的完整json規(guī)范的文本文件。
具有UNIX域套接字文件的插件必須在相同的docker主機上運行,而具有spec或json文件的插件可以在不同的主機上運行(如果指定了遠(yuǎn)程URL)。
UNIX域套接字文件必須位于下/run/docker/plugins
,而規(guī)范的文件可以在位于/etc/docker/plugins
或/usr/lib/docker/plugins
。
文件的名稱(不包括擴展名)確定插件名稱。
例如,flocker
插件可能會在中創(chuàng)建一個UNIX套接字/run/docker/plugins/flocker.sock
。
如果您想將相互隔離的定義隔離起來,您可以將每個插件定義到一個單獨的子目錄中。例如,您可以在容器內(nèi)創(chuàng)建flocker
套接字/run/docker/plugins/flocker/flocker.sock
并僅將其安裝/run/docker/plugins/flocker
在該flocker
容器內(nèi)。
Docker總是首先搜索unix套接字/run/docker/plugins
。它檢查規(guī)范或json文件/etc/docker/plugins
,/usr/lib/docker/plugins
如果套接字不存在。目錄掃描只要找到具有給定名稱的第一個插件定義就會停止。
這是插件的JSON格式:
{ "Name": "plugin-example", "Addr": "https://example.com/docker/plugin", "TLSConfig": { "InsecureSkipVerify": false, "CAFile": "/usr/shared/docker/certs/example-ca.pem", "CertFile": "/usr/shared/docker/certs/example-cert.pem", "KeyFile": "/usr/shared/docker/certs/example-key.pem" }}
TLSConfig
字段是可選的,只有在配置存在時才會驗證TLS。
插件應(yīng)該在Docker之前啟動,并在Docker之后停止。例如,在為支持的平臺打包插件時systemd
,可以使用systemd
依賴關(guān)系來管理啟動和關(guān)閉順序。
升級插件時,應(yīng)首先停止Docker守護(hù)程序,升級插件,然后再次啟動Docker。
當(dāng)插件首次被引用時 - 無論是由用戶引用它的名稱(例如docker run --volume-driver=foo
)還是已經(jīng)配置為使用插件的容器 - Docker在插件目錄中查找指定的插件,并通過握手激活它。請參閱下面的握手API。
在Docker守護(hù)程序啟動時插件不會自動激活。相反,它們只在需要時才會被懶惰地或按需地激活。
插件也可能被套接字激活systemd
。官方的插件助手本地支持套接字激活。為了插件被套接字激活,它需要一個service
文件和一個socket
文件。
service
文件(例如/lib/systemd/system/your-plugin.service
):
[Unit]Description=Your plugin Before=docker.service After=network.target your-plugin.socket Requires=your-plugin.socket docker.service[Service]ExecStart=/usr/lib/docker/your-plugin[Install]WantedBy=multi-user.target
socket
文件(例如/lib/systemd/system/your-plugin.socket
):
[Unit]Description=Your plugin[Socket]ListenStream=/run/docker/plugins/your-plugin.sock[Install]WantedBy=sockets.target
當(dāng)Docker守護(hù)進(jìn)程連接到它們正在監(jiān)聽的套接字(例如守護(hù)進(jìn)程第一次使用它們或者其中一個插件意外關(guān)閉)時,這將允許插件實際啟動。
插件API是基于HTTP的RPC風(fēng)格的JSON,非常像webhook。
請求Flow從Docker守護(hù)到該插件。所以插件需要實現(xiàn)一個HTTP服務(wù)器并將其綁定到“plugin discovery”部分中提到的UNIX套接字。
所有請求都是HTTPPOST
請求。
該API通過一個Accept標(biāo)頭進(jìn)行版本控制,該標(biāo)頭目前始終設(shè)置為application/vnd.docker.plugins.v1+json
。
通過以下“handshake”API調(diào)用來激活插件。
請求:empty body
回應(yīng):
{ "Implements": ["VolumeDriver"]}
響應(yīng)此插件實現(xiàn)的Docker子系統(tǒng)列表。激活后,插件將從這個子系統(tǒng)發(fā)送事件。
可能的值是:
authz
NetworkDriver
VolumeDriver
嘗試調(diào)用插件上的方法將重試指數(shù)回退長達(dá)30秒。當(dāng)將插件封裝為容器時,這可能會有所幫助,因為它使得插件容器在發(fā)生依賴于它們的任何用戶容器失敗之前有機會啟動。
為了簡化插件開發(fā),我們sdk
為Docker /go-plugins-helpers目前支持的各種插件提供了一個插件。