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의 가장 큰 차이점이라고 할 수 있습니다!!
참고
'devops > docker' 카테고리의 다른 글
[Docker] Docker 자주쓰는 명령어 정리 (0) | 2022.10.05 |
---|---|
[Docker] Dockerfile를 이용한 docker-compose.yml 구성 정리 (0) | 2022.10.04 |
[Docker] Docker란?? (0) | 2022.09.05 |