Docker Engine 託管外掛系統

Docker Engine 的外掛系統允許您使用 Docker Engine 安裝、啟動、停止和移除外掛。

有關舊版(非託管)外掛的資訊,請參閱瞭解舊版 Docker Engine 外掛

注意

Windows 守護程序目前不支援 Docker Engine 託管的外掛。

安裝和使用外掛

外掛以 Docker 映象的形式分發,可以託管在 Docker Hub 或私有倉庫上。

要安裝外掛,請使用 docker plugin install 命令,該命令會從 Docker Hub 或您的私有倉庫中拉取外掛,提示您授予必要的許可權或許可,然後啟用該外掛。

要檢查已安裝外掛的狀態,請使用 docker plugin ls 命令。成功啟動的外掛會在輸出中列為“已啟用”。

外掛安裝後,您可以將其用作其他 Docker 操作的選項,例如建立卷。

在以下示例中,您將安裝 rclone 外掛,驗證其是否已啟用,並使用它來建立一個卷。

注意

本示例僅用於教學目的。

  1. 設定必備目錄。預設情況下,它們必須存在於主機的以下位置

    • /var/lib/docker-plugins/rclone/config。保留用於 rclone.conf 配置檔案,即使它是空的並且配置檔案不存在,也必須存在。
    • /var/lib/docker-plugins/rclone/cache。存放外掛狀態檔案以及可選的 VFS 快取。
  2. 安裝 rclone 外掛。

    $ docker plugin install rclone/docker-volume-rclone --alias rclone
    
    Plugin "rclone/docker-volume-rclone" is requesting the following privileges:
     - network: [host]
     - mount: [/var/lib/docker-plugins/rclone/config]
     - mount: [/var/lib/docker-plugins/rclone/cache]
     - device: [/dev/fuse]
     - capabilities: [CAP_SYS_ADMIN]
    Do you grant the above permissions? [y/N] 
    

    該外掛請求5項許可權

    • 它需要訪問 host 網路。
    • 訪問必備目錄以掛載儲存
      • 您的 Rclone 配置檔案
      • 臨時快取資料
    • 授予對 FUSE(使用者空間檔案系統)裝置的訪問許可權。這是必需的,因為 Rclone 使用 FUSE 將遠端儲存掛載為本地檔案系統。
    • 它需要 CAP_SYS_ADMIN 許可權,這允許外掛執行 mount 命令。
  3. docker plugin ls 的輸出中檢查外掛是否已啟用。

    $ docker plugin ls
    
    ID                    NAME                      DESCRIPTION                                ENABLED
    aede66158353          rclone:latest             Rclone volume plugin for Docker            true
    
  4. 使用外掛建立一個卷。此示例將主機 1.2.3.4 上的 /remote 目錄掛載到名為 rclonevolume 的卷中。

    這個卷現在可以掛載到容器中。

    $ docker volume create \
      -d rclone \
      --name rclonevolume \
      -o type=sftp \
      -o path=remote \
      -o sftp-host=1.2.3.4 \
      -o sftp-user=user \
      -o "sftp-password=$(cat file_containing_password_for_remote_host)"
    
  5. 驗證卷是否建立成功。

    $ docker volume ls
    
    DRIVER              NAME
    rclone         rclonevolume
    
  6. 啟動一個使用 rclonevolume 卷的容器。

    $ docker run --rm -v rclonevolume:/data busybox ls /data
    
    <content of /remote on machine 1.2.3.4>
    
  7. 移除卷 rclonevolume

    $ docker volume rm rclonevolume
    
    sshvolume
    

要停用外掛,請使用 docker plugin disable 命令。要完全移除它,請使用 docker plugin remove 命令。有關其他可用命令和選項,請參閱命令列參考

開發外掛

rootfs 目錄

rootfs 目錄代表外掛的根檔案系統。在此示例中,它是透過一個 Dockerfile 建立的

注意

/run/docker/plugins 目錄在外掛的檔案系統內部是強制性的,以便 Docker 與外掛通訊。

$ git clone https://github.com/vieux/docker-volume-sshfs
$ cd docker-volume-sshfs
$ docker build -t rootfsimage .
$ id=$(docker create rootfsimage true) # id was cd851ce43a403 when the image was created
$ sudo mkdir -p myplugin/rootfs
$ sudo docker export "$id" | sudo tar -x -C myplugin/rootfs
$ docker rm -vf "$id"
$ docker rmi rootfsimage

config.json 檔案

config.json 檔案描述了外掛。請參閱外掛配置參考

考慮以下 config.json 檔案。

{
  "description": "sshFS plugin for Docker",
  "documentation": "https://docs.docker.net.tw/engine/extend/plugins/",
  "entrypoint": ["/docker-volume-sshfs"],
  "network": {
    "type": "host"
  },
  "interface": {
    "types": ["docker.volumedriver/1.0"],
    "socket": "sshfs.sock"
  },
  "linux": {
    "capabilities": ["CAP_SYS_ADMIN"]
  }
}

此外掛是一個卷驅動程式。它需要一個 host 網路和 CAP_SYS_ADMIN 許可權。它依賴於 /docker-volume-sshfs 入口點,並使用 /run/docker/plugins/sshfs.sock 套接字與 Docker Engine 通訊。此外掛沒有執行時引數。

建立外掛

可以透過執行 docker plugin create <plugin-name> ./path/to/plugin/data 來建立一個新外掛,其中外掛資料包含一個外掛配置檔案 config.json 和一個位於子目錄 rootfs 中的根檔案系統。

之後,外掛 <plugin-name> 將會顯示在 docker plugin ls 中。外掛可以透過 docker plugin push <plugin-name> 推送到遠端倉庫。

除錯外掛

外掛的標準輸出(Stdout)被重定向到 dockerd 日誌。這些條目帶有一個 plugin=<ID> 字尾。以下是針對 pluginID 為 f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62 的一些命令示例及其在 docker 守護程序日誌中的相應日誌條目。

$ docker plugin install tiborvass/sample-volume-plugin

INFO[0036] Starting...       Found 0 volumes on startup  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
$ docker volume create -d tiborvass/sample-volume-plugin samplevol

INFO[0193] Create Called...  Ensuring directory /data/samplevol exists on host...  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193] open /var/lib/docker/plugin-data/local-persist.json: no such file or directory  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193]                   Created volume samplevol with mountpoint /data/samplevol  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193] Path Called...    Returned path /data/samplevol  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
$ docker run -v samplevol:/tmp busybox sh

INFO[0421] Get Called...     Found samplevol                plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Mount Called...   Mounted samplevol              plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Path Called...    Returned path /data/samplevol  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Unmount Called... Unmounted samplevol            plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62

使用 runc 獲取日誌檔案並進入外掛的 shell 環境。

使用 runc(預設的 Docker 容器執行時)透過將外掛日誌重定向到檔案來除錯外掛。

$ sudo runc --root /run/docker/runtime-runc/plugins.moby list

ID                                                                 PID         STATUS      BUNDLE                                                                                                                                       CREATED                          OWNER
93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25   15806       running     /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25   2018-02-08T21:40:08.621358213Z   root
9b4606d84e06b56df84fadf054a21374b247941c94ce405b0a261499d689d9c9   14992       running     /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/9b4606d84e06b56df84fadf054a21374b247941c94ce405b0a261499d689d9c9   2018-02-08T21:35:12.321325872Z   root
c5bb4b90941efcaccca999439ed06d6a6affdde7081bb34dc84126b57b3e793d   14984       running     /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/c5bb4b90941efcaccca999439ed06d6a6affdde7081bb34dc84126b57b3e793d   2018-02-08T21:35:12.321288966Z   root
$ sudo runc --root /run/docker/runtime-runc/plugins.moby exec 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 cat /var/log/plugin.log

如果外掛有內建的 shell,那麼可以按如下方式進入外掛

$ sudo runc --root /run/docker/runtime-runc/plugins.moby exec -t 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 sh

使用 curl 除錯外掛套接字問題。

要驗證 Docker 守護程序與之通訊的外掛 API 套接字是否響應,請使用 curl。在此示例中,我們將使用 curl 7.47.0 從 Docker 主機向卷和網路外掛發出 API 呼叫,以確保外掛正在該套接字上監聽。對於功能正常的外掛,這些基本請求應該可以工作。請注意,外掛套接字在主機上的 /var/run/docker/plugins/<pluginID> 下可用。

$ curl -H "Content-Type: application/json" -XPOST -d '{}' --unix-socket /var/run/docker/plugins/e8a37ba56fc879c991f7d7921901723c64df6b42b87e6a0b055771ecf8477a6d/plugin.sock http:/VolumeDriver.List

{"Mountpoint":"","Err":"","Volumes":[{"Name":"myvol1","Mountpoint":"/data/myvol1"},{"Name":"myvol2","Mountpoint":"/data/myvol2"}],"Volume":null}
$ curl -H "Content-Type: application/json" -XPOST -d '{}' --unix-socket /var/run/docker/plugins/45e00a7ce6185d6e365904c8bcf62eb724b1fe307e0d4e7ecc9f6c1eb7bcdb70/plugin.sock http:/NetworkDriver.GetCapabilities

{"Scope":"local"}

當使用 curl 7.5及以上版本時,URL 的格式應為 http://hostname/APICall,其中 hostname 是安裝外掛的有效主機名,APICall 是對外掛 API 的呼叫。

例如,https:///VolumeDriver.List