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 이 예시는 설명 목적으로만 제공돼요.
- 사전 요구 디렉토리를 설정해요. 기본적으로 호스트의 다음 위치에 존재해야 해요:
/var/lib/docker-plugins/rclone/config.rclone.conf구성 파일용으로 예약되어 있으며, 비어 있고 구성 파일이 없어도 존재해야 해요./var/lib/docker-plugins/rclone/cache. 플러그인 상태 파일과 선택적 VFS 캐시를 보유해요.
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_ADMINcapability가 필요하며, 이는 플러그인이mount명령을 실행할 수 있게 해줘요. 3.docker plugin ls의 출력에서 플러그인이 활성화되었는지 확인해요.
$ docker plugin ls
ID NAME DESCRIPTION ENABLED
aede66158353 rclone:latest Rclone volume plugin for Docker true
- 플러그인으로 볼륨을 만들어요. 이 예시는 호스트
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)"
- 볼륨이 성공적으로 생성되었는지 확인해요.
$ docker volume ls
DRIVER NAME
rclone rclonevolume
- 볼륨
rclonevolume을 사용하는 컨테이너를 시작해요.
$ docker run --rm -v rclonevolume:/data busybox ls /data
<content of /remote on machine 1.2.3.4>
- 볼륨
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