규턴의 개발블로그
article thumbnail
Published 2022. 9. 16. 23:20
[Docker]Docker volume?? devops/docker

Docker Volume의 종류

 

 

도커 볼륨이라는것이 처음 공부했을때 좀 헷갈린 기억이 많은거 같아서,

특히 볼륨하고 바인드마운트가 헷갈려서 이참에 정리하려고 글씁니다.

 

일반적으로 컨테이너내에서 생성된 데이터는 컨테이너가 삭제될때 같이 삭제됩니다.
-> memory에 저장되는것과 비슷한 느낌

 

개발하면서 경우에 따라 어떤 데이터는 컨테이너가 삭제/stop 되어도 유지되길 원하는 데이터가 있을 수 있음습니다.

그리고 해당 데이터 파일을 개발자가 직접 다루어 볼 수 있으면 좋은 데이터도 있을것이고 (바인드마운트)

저장만되도록 원하는경우가 있을것입니다.(볼륨)

 

 

 

즉 도커에서 데이터를 저장/보관 하는 방법을 정리하자면,

 

1.  tmpfs mount (램 디스크) 와 같은 방식

2. Volume

3.Bind Mount

 

총 3가지로 정리할 수 있습니다.

 

 

 

Docker Volume

 

* tmpfs mount는 도커에서 기본적으로 생성되는것이므로 설명은 생략하겠습니다.

 

Docker Volume은 다음과 같이 create를 이용하여 생성할 수 있습니다.

docker volume create our-vol
our-vol

 

가장 중요한것은 Volume은 전체적으로 Docker에서 관리한다는점입니다.

아래의 명령어와 같이 inspect를 통해 경로를 알 수 있긴 한데, 개발자가 원하는곳으로 직접 경로를 설정할 수 없습니다.

$ docker volume inspect our-vol
[
    {
        "CreatedAt": "2020-05-09T17:03:46Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/our-vol/_data",
        "Name": "our-vol",
        "Options": {},
        "Scope": "local"
    }
]

  

 

그리고 컨테이너 구동시에

$ docker run -v our-vol:/app --name one busybox touch /app/test.txt

위의 명령어는 our-vol=/var/lib/docker/volumes/our-vol/_data 이기에

실질적으로 /var/lib/docker/volumes/our-vol/_data:/app와 같이 BindMount되는것과 같습니다.

 

실제로  /var/lib/docker/volumes/our-vol/_data에 

test.txt가 있는것을 확인할 수 있습니다

 

볼륨 삭제시에는 다음과 같은 명령어를 사용합니다.

$ docker volume rm our-vol

*만약 해당 볼륨을 컨테이너가 사용중이라면 컨테이너를 종료시키고 볼륨을 삭제해야합니다!!!

 

Bind Mount

 

바인드마운트는 다음명령어와 같이 volume 이름을 등록하는것이 아니라 실제 호스트의 경로를 명령어에 작성합니다.

docker run -v /home/ec2-user:/app -it --name one busybox /bin/sh

그렇기에 개발자는 자신이 원하는 경로와 도커의 컨테이너상에서 경로를 마운트 할 수 있습니다.

 

실제로 

/home/ec2-user에서

test.txt파일을 생성하면

 

컨테이너 상에도 test.txt가 생성되고

 

반대인경우에도 적용됩니다.

 

 

Volume vs BindMoint

 

둘이 개념은 비슷하면서도 조금 다른거 같은데 언제 volume을 사용하고 언제 BindMount를 사용해야할까요??

 

우선 결론은

배포/운영시 : Volume

개발: BindMount

 

무조건적으로 이게 맞다는 아니지만 통상적으로 해당 방법을 주로 이용합니다.

 

그 이유는 개발시에는 코드가 변경되고 바로바로 변경된 결과를 보기를 원합니다. 그렇기에 bindMount를 통해 소스파일을 BindMount하여 코드가 변경된 부분을 빠르게 적용가능합니다.

 

반대로 배포/운영시에는 개발자가 MountPoint를 관리하지 않고 Docker에게 해당 부분을 맞겨야함으로 MountPoint(데이터 저장경로)등을 Docker가 관리하는 Volume을 사용하는것을 권장합니다.

 

실제로 MountPoint를 Docker가 관리하냐, 개발자가 직접 관리하냐 의 차이가 Volume과 BindMount의 가장 큰 차이점이라고 할 수 있습니다!!

 

 

 

 

 

참고

https://www.daleseo.com/docker-volumes-bind-mounts/

profile

규턴의 개발블로그

@규턴이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!