Docker Engine 관리형 플러그인 시스템

Docker Engine 관리형 플러그인 시스템 (Docker Engine managed plugin system)

Docker Engine의 플러그인 시스템은 Docker Engine으로 플러그인을 설치, 시작, 중지, 제거할 수 있게 해줘요.

레거시(비관리형) 플러그인에 대한 정보는 레거시 Docker Engine 플러그인 이해하기를 참고하세요.

Note Docker Engine 관리형 플러그인은 현재 Windows 데몬에서 지원되지 않아요.

출처: 문서

본문

플러그인 설치 및 사용 (Installing and using a plugin)

플러그인은 Docker 이미지로 배포되며 Docker Hub 또는 프라이빗 레지스트리에 호스팅될 수 있어요.

플러그인을 설치하려면 docker plugin install 명령을 사용해요. 이 명령은 Docker Hub 또는 프라이빗 레지스트리에서 플러그인을 가져오고, 필요한 경우 권한이나 capabilities를 부여하도록 요청하며, 플러그인을 활성화해요.

설치된 플러그인의 상태를 확인하려면 docker plugin ls 명령을 사용해요. 성공적으로 시작된 플러그인은 출력에서 enabled로 나열돼요.

플러그인을 설치한 후 볼륨 생성 같은 다른 Docker 작업의 옵션으로 사용할 수 있어요.

다음 예시에서는 rclone 플러그인을 설치하고, 활성화되었는지 확인하고, 볼륨을 만드는 데 사용해요.

Note 이 예시는 설명 목적으로만 제공돼요.

  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(Filesystem in Userspace) 디바이스에 대한 접근. Rclone이 FUSE를 사용해 원격 스토리지를 로컬 파일시스템처럼 마운트하기 때문에 필요해요.
  • CAP_SYS_ADMIN capability가 필요하며, 이는 플러그인이 mount 명령을 실행할 수 있게 해줘요. 3. docker plugin ls의 출력에서 플러그인이 활성화되었는지 확인해요.
$ docker plugin ls

ID                    NAME                      DESCRIPTION                                ENABLED
aede66158353          rclone:latest             Rclone volume plugin for Docker            true
  1. 플러그인으로 볼륨을 만들어요. 이 예시는 호스트 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)"
  1. 볼륨이 성공적으로 생성되었는지 확인해요.
$ docker volume ls

DRIVER              NAME
rclone         rclonevolume
  1. 볼륨 rclonevolume을 사용하는 컨테이너를 시작해요.
$ docker run --rm -v rclonevolume:/data busybox ls /data

<content of /remote on machine 1.2.3.4>
  1. 볼륨 rclonevolume을 제거해요:
$ docker volume rm rclonevolume

sshvolume

플러그인을 비활성화하려면 docker plugin disable 명령을, 완전히 제거하려면 docker plugin remove 명령을 사용해요. 다른 사용 가능한 명령과 옵션은 커맨드 라인 레퍼런스를 참고하세요.

플러그인 개발 (Developing a plugin)

rootfs 디렉토리

rootfs 디렉토리는 플러그인의 루트 파일시스템을 나타내요. 이 예시에서는 Dockerfile에서 만들어졌어요:

Note Docker가 플러그인과 통신하려면 플러그인 파일시스템 안에 /run/docker/plugins 디렉토리가 필수예요.

$ 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 파일은 플러그인을 설명해요. plugins config 레퍼런스를 참고하세요.

다음 config.json 파일을 고려해 보세요.

{
  "description": "sshFS plugin for Docker",
  "documentation": "https://docs.docker.com/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 capability가 필요해요. /docker-volume-sshfs 엔트리포인트에 의존하고 Docker Engine과 통신하기 위해 /run/docker/plugins/sshfs.sock 소켓을 사용해요. 이 플러그인에는 런타임 매개변수가 없어요.

플러그인 생성 (Creating the plugin)

docker plugin create <plugin-name> ./path/to/plugin/data를 실행해 새 플러그인을 만들 수 있는데, 여기서 플러그인 데이터는 플러그인 구성 파일 config.json과 하위 디렉토리 rootfs의 루트 파일시스템을 담고 있어요.

그런 다음 플러그인 <plugin-name>docker plugin ls에 표시돼요. 플러그인은 docker plugin push <plugin-name>으로 원격 레지스트리에 푸시할 수 있어요.

플러그인 디버깅 (Debugging plugins)

플러그인의 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로 로그 파일 얻고 플러그인에 셸 넣기

플러그인 로그를 파일로 리다이렉트해 수집해 플러그인을 디버깅하는 데 기본 docker 컨테이너 런타임인 runc를 사용해요.

$ 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

플러그인에 내장 셸이 있다면 다음과 같이 플러그인에 exec할 수 있어요:

$ 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에 대한 호출이에요.

예를 들어, http://localhost/VolumeDriver.List

더 알아보기 (Learn more)