Docker Volume

namkun·2022년 5월 8일
0

Docker & Kubernetes

목록 보기
14/16

간단한 앱을 만들어보자.

단순하게 값을 입력하면 해당 값을 feedback 이라는 경로에 해당 입력값을 기반으로 하여 txt 파일을 만들어 저장하는 앱이다.

그리고 host 경로에 /feedback/???.txt라고 하면 해당 내용의 파일 내요잉 보이게 하는 것이다.

뭘로 만들던 상관없다. 사실 그게 중요한건 아니라서..

그렇게 만든 앱을 기반으로 해서 도커화 하고, 컨테이너를 띄워보았다.

우선 띄울때는 --rm 옵션을 붙이고 실행해본다.

$ docker run -p 3000:80 -d --rm --name nodeVolumeApp node-volume-app:latest
9a85aec5b6e325cca6e91f6f06768c123067dd165c34f7ce0ba6a9f362b59376

$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                  NAMES
9a85aec5b6e3   node-volume-app:latest   "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes   0.0.0.0:3000->80/tcp   nodeVolumeApp

자, 그 상태로 값을 입력해서 파일을 저장하고 http://localhost:3000/feedback/hello.txt에 접속해보면

잘 나오는 것을 확인할 수 있다.

그러면 컨테이너 내의 feedback 이라는 경로아래에 hello.txt 가 저장되었다는 것을 확인할 수 있다.

자, 이제 그러면 우리는 컨테이너를 중단해보자.

$ docker stop nodeVolumeApp

이렇게 중단을 하면 아까 --rm 옵션을 넣고 실행했기에, 컨테이너도 같이 삭제되었을 것이다.

그리고 다시 컨테이너를 재기동해본다.

이번에는 --rm옵션 없이 실행해본다.

$  docker run -p 3000:80 -d --name nodeVolumeApp node-volume-app:latest
82da9f97a2294a665c5cd145488fb555148e42619094f038489cc384a2ea4f1c

자 그 다음에 우리가 아까 저장했던 파일의 내용을 보기 위한 곳으로 다시 접속해보면..?

파일을 찾을 수 없다고 나온다.

우리가 해당 파일을 컨테이너에 저장한 채로 컨테이너를 삭제 했기에 발생한 상황이다.

(--rm 옵션 없이 실행했기에, 만약 이번에 다시 파일을 저장하고 컨테이너를 중단한 뒤 다시 실행하면 파일은 여전히 존재한다.)

만약 우리가 컨테이너를 삭제해도 위와 같은 데이터를 보존하고 싶다면 어떻게 해야할까?

Volume

도커는 이러한 문제를 해결하기 위해서 볼륨이라는 내장 도구를 갖고 있다.

볼륨은 호스트 머신의 폴더라고 생각하면 된다.

즉, 호스트 컴퓨터에 장착된 hdd에 존재하여 사용가능하거나 컨테이너로 매핑되는 것을 의미한다.

컨테이너 내부의 폴더를 호스트 머신 상의 컨테이너 외부 폴더에 연결할 수 있다.

따라서 호스트 머신에 파일을 추가하면 컨테이너 내부에서 액세스할 수 있고, 컨테이너가 매핑된 경로에 파일을 추가하면 컨테이너 외부(호스트 머신)에서도 사용할 수 있다.

이러한 로직으로 인해서 볼륨은 데이터를 그대로 유지할 수 있다.

그렇기에 다음에 새로운 컨테이너를 생성해도 해당 볼륨에만 붙을 수 있다면 데이터를 계속 사용할 수 있다.

이러한 볼륨은 어떻게 연동할 수 있을까?

간단한 방법은 docker run 명령어에 -v 옵션을 넣어주는 것이다.

-v 옵션을 통해서 이름을 지정하여 생성하면 볼륨은 연결된 컨테이너가 지워져도 사라지지 않는다.

다음과 같이 옵션을 넣어보자.

$ docker run ~~~ -v [volume name]:[container directory]

자, 이제 앱을 실행할 때, --rm옵션을 넣어서 실행하고, 테스트용 파일을 하나 생성해두자.(나는 test2로 생성했다.)

그 다음에 컨테이너를 stop 시킨 뒤, 다음과 같은 명령어로 볼륨을 확인해보자.

$ docker run  -d -p 3000:80 --rm -v feedback:/app/feedback --name feedback-app node-volume-app:volume
e51fcbe5cebc4beaad869a53c0d700a5358a25e1395bda8b43e41a0640f4f6f4

$ docker stop feedback-app
feedback-app

$ docker volume ls  
DRIVER    VOLUME NAME
local     feedback

컨테이너는 삭제되었으나, 여전히 볼륨이 남아있다!

자 그럼 이제 다시 새로운 컨테이너를 띄우면서 다시 볼륨을 연동시켜보자.

$ docker run  -d -p 3000:80 --rm -v feedback:/app/feedback --name feedback-app node-volume-app:volume
7c738c1134c3bad9c914d8aa9622c18355086af72086cfc80e8fb4d49e69040f

기존 볼륨을 연동하는 명령어는 동일하다.

그리고 아까전에 테스트 파일을 만들었던 걸 다시 호출하면...

자 호출이 잘 되는 것을 확인할 수 있다.

추가로, Dockerfile에서도 volume을 세팅할 수 있다.

VOLUME [ "container inner directory" ]

이렇게 사용하면 되는데, 이는 익명의 volume을 생성하는 방법이다.

익명의 volume은 이름을 docker 에서 자동으로 정해서 만들어주는 volume인데,

--rm 명령어로 실행하면 컨테이너가 삭제하는 동시에 이 볼륨도 같이 삭제된다.

만약 --rm 명령어가 없다면, 컨테이너가 삭제되도 볼륨은 남지만 새로 시작된 컨테이너에 연결되지는 않는다.

그러니까 매번 컨테이너를 삭제하고 생성할 때마다 익명의 볼륨이 쌓이는 것이다.

이러한 볼륨들을 한 번에 정리하는 명령어는 다음과 같다.

docker volume rm VOL_NAME or docker volume prune

profile
개발하는 중국학과 사람

0개의 댓글