도커의 볼륨과 바인드 마운트

삽질장인·2021년 1월 24일
0

studing_docker

목록 보기
1/1

도커의 컨테이너?

이미지를 목사해서 변경된 일부 정보를 보존하는 형태. 이때 만약 컨테이너를 삭제하면 안에 보존되어있던 데이터까지 함께 삭제된다.
이 문제 해결을 위해 두 가지 방법이 있는 듯 함. 바로 볼륨과 바인드 마운트

도커 볼륨

도커 볼륨을 생성하는 방법 ( create )

docker volume create VOLUME_NAME

이러면 /var/lib/docker/volume 에서 자신이 설정한 볼륨 이름으로 확인이 가능.
실습하면서 볼륨을 생성했을땐 내가 볼륨 이름이 해시값으로 저장됐는데, 다시 해보려니까 안되네 방법 까먹음.

컨테이너 생성시 볼륨옵션을 추가하기 ( -v )

docker run -it -d --name='TEST_VOLUME' -v VOLUME_NAME:/MY_VOLUME_TESTS nginx:1.19.6

만들어둔 볼륨이름을 주고, 콜론 뒤에는 컨테이너 내의 볼륨 디렉토리를 지정한다. 이때 컨테이너 내의 볼륨폴더는 없는 경로라면 알아서 생성된다. (확인해보니... create로 볼륨은 따로 만들필요없이 이름으로 지정하면 알아서 디폴트 경로에 생성된다. 그럼 굳이 왜 create를 쓰지?)

바인드 마운트 ( -v {경로} )

docker run -it -d --name='TEST_VOLUME2' -v ./TEST_VLOUME:/MY_VOLUME_TESTS nginx:1.19.6

볼륨 설정시 앞서 만들어놓은 docker volume create VOLUME_NAME 으로 진행하는게 아닌, 호스트 컴퓨터의 특정 디렉토리를 경로 지정하여 볼륨으로 마운트 시키는 기능이다.
다만 이럴경우 docker volume 명령어로 볼륨폴더를 관리할 수가 없으니 입맛에 맞게 사용하도록 하자.

주의할 점.
-v 옵션에서 만약 호스트나 컨테이너 주소 하나를 누락해서 하나의 주소만 입력 된 경우, 컨테이너 내의 볼륨 폴더가 입력한 주소에 맞게 생성되고, 호스트에서의 볼륨 디렉토리 명은 랜덤 해시값으로 지정된다.
나중에 볼륨파일 삭제를 원할때는 이 데이터를 쉽게 찾아 삭제하기 위해서 아래와 같은 명령어를 입력해 삭제한다.

docker inspect { CONTAINER_ID or CONTAINDER_NAME } | grep Name

정확하게 하나의 데이터가 나오진 않지만, inspect로 해당 컨테이너에 대한 상세 정보를 확인하여 내부의 볼륨 이름을 grep 을 가져오는 명령이다.

굳이 이렇게 해야 한다는게 귀찮다고 느껴질것이다.
눈치 챘는가? 그렇다. 바인드 마운트 할거면 경로는 하나만 찍지 말라고 하는 말이다.

생성된 도커 볼륨 목록 확인 ( ls )

docker volume ls

볼륨 설정을 해주었기 때문에, 컨테이너가 어떤 문제가 생겨서 삭제한대도 볼륨으로 지정한 해당 디렉토리의 파일은 호스트 서버에 설정한 디렉토리 내에 그대로 남아있다.
만약 더 이상 사용하지 않아 컨테이너를 삭제했다면 볼륨은 직접 삭제하기 전 까진 그대로 남아있음을 알아두자.
다시 말하지만, 이 명령어로 집계되는 볼륨 디렉토리는 -v 로 이름이 설정되거나 create로 만들어진 볼륨 뿐이다. 경로를 지정한 경우 알아서 수동으로 관리해야한다.

볼륨 삭제 ( rm )

docker volume rm VOLUME_NAME

그렇다고 직접 볼륨 위치에 들어가 디렉토리를 삭제하진 말자. 삭제했대도 docker volume ls 명령어로는 여전히 표기되고, 컨테이너 내에선 볼륨설정된 폴더엔 쓰기권한이 사라졌다고 파일 쓰기가 안되니까.

호스트 서버 처신 잘 하라고.

도커 볼륨의 자세한 정보 확인 ( inspect )

docker volume inspect { VOLUME_NAME or VOLUME_ID }

뭔가 헛짓을 하면서 생성된 뭔지모를 해시값의 볼륨을 확인해보자.
docker volume inspect { 8041b4995eb73a383dd6b70111cd218919a7e1ef18ea09ca34b293d11a0a84e9 }

[
{
"CreatedAt": "2021-01-07T17:08:50+09:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/8041b4995eb73a383dd6b70111cd218919a7e1ef18ea09ca34b293d11a0a84e9/_data",
"Name": "8041b4995eb73a383dd6b70111cd218919a7e1ef18ea09ca34b293d11a0a84e9",
"Options": null,
"Scope": "local"
}
]

이름이나 아이디만으로 정보가 부족하다면 inspect 명령어를 사용합시다.
해당 볼륨에 뭔가 해놓은게 없어서 딱히 필요한 정보는 없네

Dockerfile 에서 volume 지정하기

FROM ubuntu:latest
VOLUME ["/volume/path"]

이렇게 지정할 경우 이미지가 컨테이너로 올라갈때 자동으로 디폴트 볼륨 경로로 설정된다.
단, 이렇게 생성된 볼륨은 도커 내에서 임의로 생성된 해시값이 아이디로 설정되는데(바로 위 코드처럼) 이럴경우 컨테이너의 볼륨폴더를 식별하기가 힘들다.

그래서 run 진행시 -v 옵션으로 지정하면 도커파일의 볼륨 옵션을 오버라이딩 해서 입맛대로 처리하는거라는데, 그럼 VOLUME은 왜줬음? 이미지 생성시 볼륨옵션 안주면 -v 안되는것도 아니고.

컨테이너를 볼륨으로 사용하기

나중에 써보고 작성할꼐요

profile
코딩공부 하고있습니다

0개의 댓글