볼륨 * 볼륨은 컨테이너와 별개의 생애주기를 갖는 스토리지의 단위 * 볼륨은 마치 컨테이너 파일 시스템의 일부처럼 사용 가능하지만, 사실은 컨테이너 외부에 존재하는 리소스다. * 애플리케이션을 업데이트하면 컨테이너가 교체되면서 볼륨은 새 컨테이너에 연결된다.
오케스트레이션 플랫폼에서의 볼륨 * 오케스트레이션 플랫폼에서도 볼륨의 개념은 같지만 데이터가 저장되는 방식에 큰 차이가 있다. * 클러스터는 여러 개의 노드로 구성되고, 이들 노드는 각각 디스크가 있어서 이 디스크에 로컬 볼륨을 저장한다. * 새로운 레플리카가 이전 레플리카와 다른 노드에서 실행되는 경우 기존 레플리카가 사용하던 로컬 볼륨에 접근할 수 없는 문제가 있다. * 이는 서비스가 데이터가 있는 특정 노드에서만 실행되게끔 고정하면 해결된다. * 이 방법을 적용하려면, 노드에 레이블을 부여하고 컴포즈 파일에서 해당 노드에서만 레플리카를 실행하도록 강제하면 된다.
실습 단일 노드 스웜이 있다. 노드가 하나뿐이니 모든 레플리카는 당연히 같은 노드에서 동작한다. 하지만 레이블 기능은 노드가 여러 개일 매와 똑같이 사용할 수 있다. 데이블은 키-값 쌍으로 작성한다. 여기서는 다음과 같이 가상의 스토리지 유형 정보를 레이블로 노드에 부여해 봤다.
# 노드의 식별자를 찾아 해당 노드에 레이블을 부여한다.
➜ docker node update --label-add storage=raid $(docker node ls -q)
jdptgr9s1vk6f8nls2g0qz97k
예제 13-5 스웜에서 실행하는 서비스에 볼륨 마운트 및 제약 사항 설정하기
todo-db:
image: diamol/postgres:11.5
environment:
PGDATA: "/var/lib/postgresql/data/pgdata"
volumes:
- todo-db-data:/var/lib/postgresql/data
deploy:
placement:
constraints:
- node.labels.storage == raid
# ...
volumes:
todo-db-data:
- 볼륨 설정 부분이 조금 이상하게 보이겠지만 코드가 생략된 것은 아니다.
- 이 설정을 적용하면 스웜의 기본 볼륨 드라이버를 사용해 로컬 디스크 볼륨을 생성한다.
- 이 정의대로 애플리케이션을 배포하면 데이터베이스 레플리카는 스토리지 레이블이 일치하는 노드에서만 실행된다.
- 그리고 이 노드는 todo-db-data라는 이름으로 로컬 볼륨을 생성해 이 볼륨에 데이터가 저장된다.
실습 컴포즈 파일에 지정한 제약 조건이 스웜 노드에 부여한 레이블과 일치하므로 데이터베이스 컨테이너는 이 노드에서만 실행되며 노드에 있는 로컬 볼륨을 사용한다. 다음 명령은 애플리케이션 배포 전과 후로 노드에 존재하는 볼륨 목록을 확인하는 명령이다.
001) # 노드에 존재하는 모든 볼륨의 식별자 목록을 출력한다.
002) ➜ docker volume ls -q
003) c0a54cb8b1feea2900f2ae3aa6517ca6c17167f1886007bd41f2a6a5c5097e2b
004) fc68c1b66f258eddc9777b2edf565e83c53f131bdb85615c18ac5a282d3a9f1d
005)
006) # 스택을 버전 v5로 업데이트 한다.
007) ➜ docker stack deploy -c ./todo-list/v5.yml todo
008) Updating service todo_todo-web (id: kvr2ij57ccj7zz424af8kmi6v)
009) Updating service todo_todo-db (id: 1dku4wwx3m8fi1zdh5b0l03lb)
010)
011) # 볼륨 목록을 다시 한 번 확인한다.
012) ➜ docker volume ls -q
013) c0a54cb8b1feea2900f2ae3aa6517ca6c17167f1886007bd41f2a6a5c5097e2b
014) fc68c1b66f258eddc9777b2edf565e83c53f131bdb85615c18ac5a282d3a9f1d
015) todo_todo-db-data
- 002~004: 이들 볼륨은 버전 V4 스택을 배포할 때 생성된 것으로, 웹 컨테이너와 데이터베이스 컨테이너 이미지에 볼륨이 지정돼 있었으므로 각각 생성되고 사용됐다.
-
013~015: 버전 V5 컴포즈 파일에는 데이터베이스 서비스에 todo-db-data라는 이름의 볼륨이 정의됐다. 기본 볼륨은 스택을 제거하면 삭제되지만, 이름이 부여된 볼륨은 스택을 제거해도 삭제되지 않는다.
-
이 서비스 정의대로 배포한 애플리케이션은 스택을 제거하더라도 레이블이 붙은 노드 자체가 남아 있기만 하면 데이터를 유실하지 않는다.
- 컨테이너가 고장을 일으켜 헬스 체크에서 발견돼 교체돼도 새 컨테이너 역시 같은 노드에서 같은 볼륨을 연결해 사용할 것이다.