코딩과로그

도커) 5. DB 유지시키기 feat: docker volume (가이드 실행 결과) <Persist the DB> 본문

Docker

도커) 5. DB 유지시키기 feat: docker volume (가이드 실행 결과) <Persist the DB>

피리음 2023. 3. 17. 08:37
아래의 도커 가이드를 따라한 뒤 참고할만한 내용을 남겼습니다.
https://docs.docker.com/get-started/05_persisting_data/

이전까지 진행해봤던 To-do 앱은 앱이 실행될 때마다 기존 데이터가 모두 사라졌다.

왜 그럴까...

아래처럼 각각의 컨테이너는 자신의 파일 시스템을 공유하지 않고 격리되게 존재한다.

# 도커 컨테이너를 실행한다.
   # 1. 1~10000 사이의 값을 /data.txt 에 출력
   # 2. 출력하고 종료하지 않고 대기하도록 함.
$ docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
c10387262117e6d656d0ddd37a8bfc3a8d1b376cd59510f3e70478ab6ab31102

# 해당 컨테이너에 /data.txt 값이 있는 것을 확인함.
$ docker exec c10387262117 cat /data.txt                         
9427

# 다른 컨테이너에는 /data.txt 가 존재하지 않음.
$ docker run -it ubuntu ls /
bin   dev  home  lib32	libx32	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 lib64	media	opt  root  sbin  sys  usr

이전까지 했던 테스트에서 봤듯이, 컨테이너에서 만들었던 변경사항은 컨테이너가 제거되거나 변경될 때 오롯히 컨테이너 내부에서만 반영되고 호스트 머신에는 영향을 끼치지 못했다.

그러나 컨테이너 볼륨을 사용하면 변경사항을 호스트머신에 반영할 수 있다. 

 

다음과 같이 컨테이너 볼륨을 만들고 실제로 변경사항이 호스트머신에 반영되는 지 테스트해보았다.

# todo-db 라는 볼륨을 반든다.
$ docker volume create todo-db

# todo app (sororiri/getting-started)을 실행시킨다.
# --mount 옵션을 사용하여 호스트머신의 todo-db 폴더에 마운트한다.
# todo-db 폴더는 컨테이너의 '/etc/todos' 에 마운트된다.
$ docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos sororiri/getting-started

앱을 제거한 뒤 다시 실행시켰을 때 db 값이 유지되는 것을 확인했다.

즉, 컨테이너에서의 변경사항이 호스트머신에 반영된 것을 확인했다.

앱을 실행시켰을 때 db값이 남아있다

 

그렇다면 볼륨은 호스트머신의 어딘가에 저장되어있을까?

이는 다음의 명령어를 통해 확인할 수 있다.

$ docker volume inspect todo-db
[
    {
        "CreatedAt": "2023-03-16T23:29:34+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": null,
        "Scope": "local"
    }
]