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

  • 볼륨에 대한 세부 정보를 가져오는 VolumeDriver.Get 추가 (#16534)
  • 드라이버가 소유한 모든 볼륨을 나열하는 VolumeDriver.List 추가 (#16534)

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": ""
}

오류가 발생하면 문자열 오류로 응답해요. MountpointStatus는 선택 사항이에요.

/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는 globallocal이에요. Scope의 다른 값은 무시되고 local이 사용돼요. Scope는 클러스터 매니저가 볼륨을 다른 방식으로 처리할 수 있게 해줘요. 예를 들어 global scope는 각 Docker 호스트가 아니라 한 번만 볼륨을 만들면 된다는 신호를 클러스터 매니저에 보내요. 향후 더 많은 capabilities가 추가될 수 있어요.

더 알아보기 (Learn more)