Docker 外掛程式 API

Docker 外掛程式是 Docker Engine 的外部程序擴充功能,可為 Docker Engine 新增功能。

本文檔說明 Docker Engine 外掛程式 API。如需檢視 Docker Engine 管理的外掛程式資訊,請參閱Docker Engine 外掛程式系統

本頁面適用於想要開發自己的 Docker 外掛程式的人員。如果您只想瞭解或使用 Docker 外掛程式,請參閱這裡

什麼是外掛程式

外掛程式是在與 Docker Daemon 相同或不同的主機上執行的程序,它會將檔案放置在 Daemon 主機上外掛程式探索中所述的外掛程式目錄之一來註冊自身。

外掛程式具有方便閱讀的名稱,這些名稱是簡短的小寫字串。例如,flockerweave

外掛程式可以在容器內部或外部執行。目前建議在容器外部執行它們。

外掛程式探索

每當使用者或容器嘗試按名稱使用外掛程式時,Docker 就會在外掛程式目錄中尋找它們來探索外掛程式。

可以將三種類型的檔案放入外掛程式目錄中。

  • .sock 檔案是 Unix 網域 Socket。
  • .spec 檔案是包含 URL 的文字檔,例如 unix:///other.socktcp://localhost:8080
  • .json 檔案是包含外掛程式的完整 JSON 規格的文字檔。

具有 Unix 網域 Socket 檔案的外掛程式必須與 Docker Daemon 在同一個主機上執行。如果您指定遠端 URL,則具有 .spec.json 檔案的外掛程式可以在不同的主機上執行。

Unix 網域 Socket 檔案必須位於 /run/docker/plugins 下,而規格檔案可以位於 /etc/docker/plugins/usr/lib/docker/plugins 下。

檔案的名稱(不包括副檔名)決定外掛程式名稱。

例如,flocker 外掛程式可能會在 /run/docker/plugins/flocker.sock 建立 Unix Socket。

如果您想將定義彼此隔離,您可以將每個外掛程式定義到一個單獨的子目錄中。例如,您可以在 /run/docker/plugins/flocker/flocker.sock 下建立 flocker Socket,並且只將 /run/docker/plugins/flocker 掛載到 flocker 容器內。

Docker 總是先在 /run/docker/plugins 中搜尋 Unix Socket。如果 Socket 不存在,它會檢查 /etc/docker/plugins/usr/lib/docker/plugins 下的規格或 JSON 檔案。目錄掃描會在找到第一個具有指定名稱的外掛程式定義後立即停止。

JSON 規格

這是外掛程式的 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。

外掛程式生命週期

插件應該在 Docker 之前啟動,在 Docker 之後停止。例如,在為支援 systemd 的平台打包插件時,您可以使用 systemd 依賴關係 來管理啟動和關閉順序。

升級插件時,您應該先停止 Docker 守護行程,升級插件,然後重新啟動 Docker。

外掛程式啟動

當插件第一次被引用時——使用者透過名稱引用它(例如 docker run --volume-driver=foo)或已設定為使用插件的容器正在啟動——Docker 會在插件目錄中尋找指定的插件,並透過握手來啟用它。請參閱下面的握手 API。

插件不會在 Docker 守護行程啟動時自動啟用。它們只會在需要時,也就是按需延遲啟用。

Systemd Socket 啟動

插件也可以由 systemd 進行 Socket 啟用。官方的 插件助手

socket 檔案(例如 /lib/systemd/system/your-plugin.socket

這將允許插件在 Docker 守護行程連接到它們正在監聽的 Socket 時實際啟動(例如,守護行程第一次使用它們時,或者其中一個插件意外停止時)。

API 設計

插件 API 是基於 HTTP 的 RPC 風格 JSON,很像 Webhook。

請求從 Docker 守護行程流向插件。插件需要實作一個 HTTP 伺服器,並將其綁定到「插件探索」章節中提到的 Unix Socket。

所有請求都是 HTTP POST 請求。

API 透過 Accept 標頭進行版本控制,目前始終設定為 application/vnd.docker.plugins.v1+json

握手 API

插件透過以下「握手」API 呼叫啟用。

/Plugin.Activate

請求:空主體

回應

{
    "Implements": ["VolumeDriver"]
}

回應此插件實作的 Docker 子系統列表。啟用後,插件將會收到來自此子系統的事件。

可能的值為

外掛程式重試

嘗試呼叫插件上的方法時,會以指數退避的方式重試,最長可達 30 秒。這在將插件打包為容器時可能有所幫助,因為它讓插件容器有機會在任何依賴它們的使用者容器失敗之前啟動。

外掛程式輔助工具

為了簡化插件開發,我們在 docker/go-plugins-helpers

請求變更