Docker Volume

푸드테크·2022년 7월 31일
0

안녕하세요 푸드 테크팀 백엔드 개발자 박형민입니다.

오늘은, 도커에서 데이터를 영속적으로 관리할 수 있는 방법인 Docker volume 에 대해 포스팅해보고자 합니다.



Docker의 Data 생명주기

도커 컨테이너를 사용할 때, 데이터는 Writable Layer 에 Data 를 저장할 수 있지만, 기본적으로 컨테이너가 삭제될때 데이터가 함께 사라지게 됩니다.


Docker 에서는 이러한 문제를 해결하고, 도커 컨테이너에서 저장되고 쓰여진 Data를 영속적으로 관리할 수 있는 3가지 옵션을 제공하고, 그 중에서 Docker에서 가장 Best한 방법이라고 소개하는 방법이 Docker Volume 입니다.




Docker 마운트 유형

Docker 에서는 다음과 같이 3가지 마운트 옵션을 제공합니다.
1. volume
2. bind mounts
3. tmpfs mount



1. volume

volume 의 사용은, Docker 에서 Data 를 존속시킬 수 있는 Best 한 방법이라고 합니다.
volume 은 Docker(Linux 에서는 /var/lib/docker/volume/) 가 관리하는 Host File System 의 일부에 Data가 저장됩니다.

로컬에서의 볼륨위치를 찾고 싶다면 아래의 명령어로 확인할 수 있습니다.

docker volume inspect (volume명)

 

💡 단 OS 가 리눅스가 아닌, 윈도우 맥이라면, 저 경로로 찾을 수 없습니다.

  • 그 이유는 Mac os, windows os 에서 직접 os를 점유하지 않고, 호스트 os 를 공유하는 도커의  특성입니다.

  • 리눅스 os 가 아니라면, Docker 는 Host 의 Kernel Socket을 공유합니다.

  • 즉, Host Linux kernel을 대신할 것이 필요하기 때문에, Host 가 리눅스라면 있는걸 그대로 사용하면 되지만, 다른 OS 라면 Linux Kernel이 아니기 때문에 OS 위에 VM 으로 Linux 를 게스트 os 로 구동하고, 그 위에 Docker Engine을 구동합니다.



2.bind mount

volume은 고정된 위치에서 데이터를 관리해서 원하는 곳에 파일을 저장시킬 수 없습니다. Bind Mount 방법을 사용한다면, 로컬 폴더 원하는 곳에 자유롭게 마운트할 디렉토리를 선택할 수 있습니다.



3. tmpfs mount 

tmpfs mount는 Host System의 Memory에만 Data가 저장되며, 절대로 Host의 File System에는 저장되지 않는다고 합니다.






docker Volume 사용하기

그러면, Docker 에서 데이터를 영속적으로 관리하는 가장 Best한 방식이라고 소개하는 Volume 을 사용해 보겠습니다.

  1.  docker volume create 명령을 사용하여 명시적으로 volumes를 생성하거나, Container나 Service 생성 중에 volume을 생성할 수 있습니다

  2. volume이 생성되면, Data는 Docker Host의 디렉토리에 저장됩니다.

  3. 해당 volume을 Container에 Mount하면, Host의 디렉토리가 Mount가 됩니다.


  • volume이 Docker에 의해 관리되고 Host System과 분리된다는 점을 제외한다면, bind mount와 유사하게 동작합니다.

1. volume 생성

$ docker volume create test-vol
test-vol

2. 생성된 볼륨 확인

$ docker volume ls
DRIVER              VOLUME NAME
local               test-vol

3. 볼륨 상세 정보 확인

$ docker volume inspect test-vol
[
    {
        "CreatedAt": "2022-07-18T06:30:55Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
        "Name": "test-vol",
        "Options": {},
        "Scope": "local"
    }
]
 

4. 볼륨을 컨테이너에 마운트하기

컨테이너가 볼륨을 사용하기 위해서는 볼륨을 컨테이너에 마운트(mount)해줘야 합니다. 
docker run 커맨드로 컨테이너를 실행할 때 -v 옵션을 사용하면 되는데
콜론(:)을 구분자로 해서 앞에는 마운트할 볼륨명 뒤에는 컨테이너 내의 경로를 명시해주면 됩니다.

docker run -v test-vol:/app/dockerDir  --name nginx-conatiner -p 8080:80 -d nginx

5. 볼륨을 다중 컨테이너에 연결하는 방법

docker run -v test-vol:/app/dockerDir  --name nginx-conatiner2 -p 8082:80 -d nginx

똑같이 연결할 컨테이너와 마운트할 볼륨을 선택해주면 됩니다.

✅ 이렇게 볼륨을 연결하면, 컨테이너에서 쓰여진 데이터들이 Volume에 저장됩니다.

  • 이렇게 새로운 디렉토리에 기존에 존재하던 볼륨을 연결해 주었을 때, 컨테이너가 시작될때, 마운트한 디렉토리(볼륨)에 파일이나 데이터가 존재한다면, 자동으로 /app/~경로에 존재하는 데이터들이 볼륨에 저장되어진다고 합니다.
  • 그런 다음 컨테이너는 볼륨을 탑재하고 사용하며 볼륨을 사용하는 다른 컨테이너도 미리 채워진 콘텐츠에 액세스 할 수 있습니다.





참고 : Docker Docs - https://docs.docker.com/storage/volumes/

profile
푸드 테크 기술 블로그

2개의 댓글

comment-user-thumbnail
2022년 8월 7일

좋은 글 잘 봤습니다. Volume 을 활용하면 데이터를 유지 시키며 업데이트할 버전을 미리 테스트 하거나 다운그레이드가 쉽다는 장점도 있겠네요.

1개의 답글