Featured image of post 4. Persist the DB

4. Persist the DB

도커 시작하기

컨테이너의 파일 시스템

컨테이너가 실행되면, 파일시스템은 여러 레이어들을 사용한다. 각각의 컨테이너는 파일을 생성, 업데이트, 삭제하기 위한 자신만의 “스크래치 공간"을 가지는데, 다른 컨테이너에서 같은 이미지를 사용한다고 해도 어떤 변경 사항에 대해서도 다른 컨테이너에서 활용할 수 없다.

Scratch image?
빈 베이스 이미지로, 최소한의 컨테이너 이미지를 만들기 위해 사용된다. scratch를 기본 이미지로 사용하면 컨테이너에는 파일 시스템 내용이 없으므로 앱이 필요로 하는 모든 파일을 이미지의 일부로 포함해야 한다.
scratch space는 사용 중인 이미지에 기반하여 각 컨테이너마다 생성되는 파일 시스템이다.

컨테이너 볼륨

컨테이너는 파일을 생성, 업데이트 및 삭제할 수 있지만 컨테이너를 제거하면 해당 변경 사항이 모두 손실되며 Docker는 해당 컨테이너의 모든 변경 사항을 격리한다. 이때, 볼륨을 사용하면 모든 변경 사항을 반영할 수 있다.

볼륨은 컨테이너의 특정 파일 시스템 경로를 호스트 머신과 연결하는 기능을 제공한다. 컨테이너에서 디렉토리를 마운트하면 해당 디렉토리의 변경 사항을 호스트 머신에서도 볼 수 있다. 컨테이너 재시작에서 동일한 디렉토리를 마운트하면 동일한 파일을 확인할 수 있다.

예제 Todo 앱 데이터 유지하기

todo앱은 컨테이너 파일 시스템에 위치한 /etc/todos/todo.db 파일에 데이터를 저장한다(SQLite).

데이터베이스 관련 파일을 호스트에 지속적으로 유지하고 다음 컨테이너에서 사용할 수 있도록 만들 수 있어야한다. 볼륨을 생성하고 데이터가 저장된 디렉토리에 연결(마운트)하여 컨테이너가 todo.db 파일에 쓰기를 수행하면 데이터는 볼륨에서 호스트로 유지된다.

볼륨 마운트는 일종의 불투명한 데이터 버킷이며, Docker는 디스크 상의 저장 위치를 포함하여 볼륨 전체를 관리한다.

  1. 볼륨 생성
    1
    2
    3
    
    docker volume create todo-db
    
    # todo-db
    
  2. 기존 컨테이너 중지 및 삭제: 볼륨을 사용하지 않은 상태에서 실행된 컨테이너 이므로…
    1
    
    docker rm -f <id>
    
  3. --mount 옵션을 추가하여 볼륨 마운트를 지정하여 앱 컨테이너 실행
    1
    2
    3
    
    docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
    
    # ba3740f92525240162cff2cd3dac9420c048bff2087482cc30bd8411ce9ba198
    
  4. 앱을 열고 데이터 todo 리스트 추가
  5. 컨테이너 삭제 후 3번 명령어 실행 후 데이터 확인

Dive into the volume

docker volume inspect 명령을 사용하면 Docker가 볼륨을 사용할 때 데이터를 어디에 저장하고 있는지 등 여러 정보들을 확인할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker volume inspect todo-db

[
    {
        "CreatedAt": "2023-04-24T07:37:34Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

Mountpoint가 디스크상의 실제 위치를 의미하며, 대부분의 컴퓨터에서 호스트가 이 디렉토리에 접근하기 위해 root 권한이 필요하다.