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