Docker 外掛 API

Docker 外掛是程序外擴充套件,為 Docker Engine 增加功能。

本文件描述了 Docker Engine 外掛 API。要檢視有關 Docker Engine 管理的外掛資訊,請參閱Docker Engine 外掛系統

本頁面適用於希望開發自己的 Docker 外掛的人員。如果您只想瞭解或使用 Docker 外掛,請檢視此處

什麼是外掛

外掛是在與 Docker 守護程序相同或不同主機上執行的程序,它透過在守護程序主機上外掛發現中描述的某個外掛目錄中放置一個檔案來註冊自身。

外掛具有人類可讀的名稱,這些名稱是簡短的、小寫的字串。例如,flockerweave

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

外掛發現

每當使用者或容器嘗試按名稱使用外掛時,Docker 都會在外掛目錄中查詢它們,從而發現外掛。

外掛目錄中可以放置三種類型的檔案。

  • .sock 檔案是 Unix 域套接字。
  • .spec 檔案是包含 URL 的文字檔案,例如 unix:///other.socktcp://:8080
  • .json 檔案是包含外掛完整 JSON 規範的文字檔案。

具有 Unix 域套接字檔案的外掛必須在與 Docker 守護程序相同的主機上執行。如果指定了遠端 URL,則具有 .spec.json 檔案的外掛可以在不同的主機上執行。

Unix 域套接字檔案必須位於 /run/docker/plugins 下,而 spec 檔案可以位於 /etc/docker/plugins/usr/lib/docker/plugins 下。

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

例如,flocker 外掛可能會在 /run/docker/plugins/flocker.sock 建立一個 Unix 套接字。

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

Docker 總是首先在 /run/docker/plugins 中搜索 Unix 套接字。如果套接字不存在,它會在 /etc/docker/plugins/usr/lib/docker/plugins 下檢查 spec 或 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 套接字啟用

外掛也可以透過 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

這將允許外掛在 Docker 守護程序連線到它們監聽的套接字時(例如,守護程序首次使用它們或其中一個外掛意外關閉時)實際啟動。

API 設計

外掛 API 是 RPC 風格的 JSON over HTTP,很像 Webhook。

請求從 Docker 守護程序流向外掛。外掛需要實現一個 HTTP 伺服器並將其繫結到“外掛發現”部分中提到的 Unix 套接字。

所有請求都是 HTTP POST 請求。

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

握手 API

外掛透過以下“握手”API 呼叫啟用。

/Plugin.Activate

請求:空正文

響應

{
    "Implements": ["VolumeDriver"]
}

響應此外掛實現的 Docker 子系統列表。啟用後,外掛將收到來自此子系統的事件。

可能的值有

外掛重試

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

外掛助手

為了簡化外掛開發,我們為 Docker 目前支援的每種外掛型別提供了 sdk,地址是docker/go-plugins-helpers