Docker 볼륨 플러그인
Docker 볼륨 플러그인 (Docker volume plugins)
Docker Engine 볼륨 플러그인은 Engine 배포를 Amazon EBS 같은 외부 스토리지 시스템과 통합할 수 있게 하고, 데이터 볼륨이 단일 Docker 호스트의 수명을 넘어 영속되게 해줘요. 자세한 내용은 플러그인 문서를 참고하세요.
출처: 문서
본문
변경 로그 (Changelog)
1.13.0
- v2 플러그인 아키텍처의 일부로 사용된다면, 플러그인이 반환하는 경로의 일부인 마운트포인트는 플러그인 구성의
PropagatedMount가 지정한 디렉토리 아래에 마운트되어야 해요 (#26398)
1.12.0
VolumeDriver.Get응답에Status필드 추가 (#21006)- 볼륨 드라이버의 capabilities를 얻는
VolumeDriver.Capabilities추가 (#22077)
1.10.0
1.8.0
- 볼륨 드라이버 플러그인에 대한 초기 지원 (#14659)
커맨드 라인 변경 (Command-line changes)
컨테이너에 볼륨에 대한 접근을 주려면 docker container run 명령의 --volume과 --volume-driver 플래그를 사용해요. --volume(또는 -v) 플래그는 볼륨 이름과 호스트의 경로를 받고, --volume-driver 플래그는 드라이버 유형을 받아요.
$ docker volume create --driver=myplugin volumename
$ docker container run -it --volume volumename:/data busybox sh
--volume
--volume(또는 -v) 플래그는 <volume_name>:<mountpoint> 형식의 값을 받아요. 값의 두 부분은 콜론(:) 문자로 구분돼요.
- 볼륨 이름은 볼륨의 사람이 읽을 수 있는 이름이며
/문자로 시작할 수 없어요. 이 주제의 나머지에서volume_name으로 언급돼요. Mountpoint는 볼륨이 사용 가능하게 된 호스트(v1) 또는 플러그인(v2) 안의 경로예요.
--volume-driver
볼륨 이름과 함께( --volume 사용) --volume-driver 플래그를 지정하면 플러그인으로 컨테이너용 볼륨을 관리할 수 있어요.
--volume-driver 플래그는 익명 볼륨을 포함해 컨테이너에 만들어진 모든 볼륨의 기본값으로 사용돼요. 각 볼륨에 개별적으로 사용할 드라이버를 지정하려면 --mount 플래그를 volume-driver 옵션과 함께 사용해요.
VolumeDriver 만들기 (Create a VolumeDriver)
컨테이너 생성 엔드포인트(/containers/create)는 드라이버의 이름을 지정할 수 있는 VolumeDriver 필드(string 타입)를 받아요. 지정하지 않으면 "local"(로컬 볼륨의 기본 드라이버)로 기본 설정돼요.
볼륨 플러그인 프로토콜 (Volume plugin protocol)
플러그인이 활성화될 때 VolumeDriver로 등록하면 호스트 파일시스템의 쓰기 가능한 경로를 Docker 데몬에 제공해야 해요. Docker 데몬은 이 경로를 컨테이너가 소비하도록 제공해요. Docker 데몬은 제공된 경로를 컨테이너에 바인드 마운트해 볼륨을 사용 가능하게 해요.
Note 볼륨 플러그인은
/var/lib/docker/volumes를 포함해/var/lib/docker/디렉토리에 데이터를 쓰면 안 됩니다./var/lib/docker/디렉토리는 Docker용으로 예약돼 있어요.
/VolumeDriver.Create
Request:
{
"Name": "volume_name",
"Opts": {}
}
사용자가 지정한 볼륨 이름으로 볼륨을 만들고자 한다는 것을 플러그인에 지시해요. 플러그인은 아직(Mount가 호출될 때까지) 볼륨을 파일시스템에 실제로 매니페스트할 필요는 없어요. Opts는 사용자 요청에서 전달되는 드라이버별 옵션의 맵이에요.
Response:
{
"Err": ""
}
오류가 발생하면 문자열 오류로 응답해요.
/VolumeDriver.Remove
Request:
{
"Name": "volume_name"
}
지정된 볼륨을 디스크에서 삭제해요. 이 요청은 사용자가 docker rm -v를 호출해 컨테이너와 연관된 볼륨을 제거할 때 발행돼요.
Response:
{
"Err": ""
}
오류가 발생하면 문자열 오류로 응답해요.
/VolumeDriver.Mount
Request:
{
"Name": "volume_name",
"ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c"
}
Docker는 사용자가 지정한 볼륨 이름으로 플러그인이 볼륨을 제공할 것을 요구해요. Mount는 컨테이너 시작마다 한 번 호출돼요. 같은 volume_name이 두 번 이상 요청되면 플러그인은 각 새 마운트 요청을 추적하고 첫 마운트 요청에서 프로비저닝하고 마지막 해당 언마운트 요청에서 디프로비저닝해야 할 수도 있어요.
ID는 마운트를 요청하는 호출자에 대한 고유 ID예요.
Response:
- v1
{
"Mountpoint": "/path/to/directory/on/host",
"Err": ""
}
- v2
{
"Mountpoint": "/path/under/PropagatedMount",
"Err": ""
}
Mountpoint는 볼륨이 사용 가능하게 된 호스트(v1) 또는 플러그인(v2) 안의 경로예요.
Err는 비어 있거나 오류 문자열을 담아요.
/VolumeDriver.Path
Request:
{
"Name": "volume_name"
}
주어진 volume_name의 볼륨에 대한 경로를 요청해요.
Response:
- v1
{
"Mountpoint": "/path/to/directory/on/host",
"Err": ""
}
- v2
{
"Mountpoint": "/path/under/PropagatedMount",
"Err": ""
}
볼륨이 사용 가능해진 호스트(v1) 또는 플러그인 안(v2)의 경로, 그리고/또는 오류가 발생한 경우 문자열 오류로 응답해요.
Mountpoint는 선택 사항이에요. 하지만 제공되지 않으면 나중에 플러그인이 다시 조회될 수 있어요.
/VolumeDriver.Unmount
Request:
{
"Name": "volume_name",
"ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c"
}
Docker는 더 이상 이름 있는 볼륨을 사용하지 않아요. Unmount는 컨테이너 중지마다 한 번 호출돼요. 플러그인은 이 시점에서 볼륨을 디프로비저닝하는 것이 안전하다고 추론할 수 있어요.
ID는 마운트를 요청하는 호출자에 대한 고유 ID예요.
Response:
{
"Err": ""
}
오류가 발생하면 문자열 오류로 응답해요.
/VolumeDriver.Get
Request:
{
"Name": "volume_name"
}
volume_name에 대한 정보를 가져와요.
Response:
- v1
{
"Volume": {
"Name": "volume_name",
"Mountpoint": "/path/to/directory/on/host",
"Status": {}
},
"Err": ""
}
- v2
{
"Volume": {
"Name": "volume_name",
"Mountpoint": "/path/under/PropagatedMount",
"Status": {}
},
"Err": ""
}
오류가 발생하면 문자열 오류로 응답해요. Mountpoint와 Status는 선택 사항이에요.
/VolumeDriver.List
Request:
{}
플러그인에 등록된 볼륨 목록을 가져와요.
Response:
- v1
{
"Volumes": [
{
"Name": "volume_name",
"Mountpoint": "/path/to/directory/on/host"
}
],
"Err": ""
}
- v2
{
"Volumes": [
{
"Name": "volume_name",
"Mountpoint": "/path/under/PropagatedMount"
}
],
"Err": ""
}
오류가 발생하면 문자열 오류로 응답해요. Mountpoint는 선택 사항이에요.
/VolumeDriver.Capabilities
Request:
{}
드라이버가 지원하는 capabilities 목록을 가져와요.
드라이버가 Capabilities를 구현할 필요는 없어요. 구현되지 않으면 기본값이 사용돼요.
Response:
{
"Capabilities": {
"Scope": "global"
}
}
지원되는 scope는 global과 local이에요. Scope의 다른 값은 무시되고 local이 사용돼요. Scope는 클러스터 매니저가 볼륨을 다른 방식으로 처리할 수 있게 해줘요. 예를 들어 global scope는 각 Docker 호스트가 아니라 한 번만 볼륨을 만들면 된다는 신호를 클러스터 매니저에 보내요. 향후 더 많은 capabilities가 추가될 수 있어요.