[Docker] [docs] 05. DB 유지 (볼륨)
https://docs.docker.com/get-started/05_persisting_data/
Persist the DB
Making your DB persistent in your application
docs.docker.com
컨테이너 파일 시스템
일반적으로 Docker 이미지는 여러 레이어로 구성됩니다. 각 레이어는 파일 시스템의 일부분을 나타내며, 이러한 레이어들이 조합되어서 컨테이너의 파일 시스템을 형성합니다. 컨테이너가 실행될 때, 이미지의 레이어들은 읽기 전용으로 컨테이너에 적용됩니다. 즉, 컨테이너는 이러한 읽기 전용 이미지 레이어들을 기반으로 파일 시스템을 구성합니다.
컨테이너는 또한 자체적인 "스크래치 공간"을 가지고 있습니다. 이 공간은 컨테이너가 실행되는 동안 파일을 생성, 수정 또는 삭제하는데 사용됩니다. 이 스크래치 공간은 컨테이너가 수정 가능한 영역이며, 여기에 저장된 파일들은 해당 컨테이너 내부에서만 관리됩니다.
동일한 이미지를 기반으로 여러 개의 컨테이너를 실행하더라도 각각의 컨테이너는 자체적인 스크래치 공간을 갖게 되므로 서로 독립적으로 파일 시스템을 관리합니다. 즉, 한 컨테이너에서 파일을 생성, 수정 또는 삭제하더라도 다른 컨테이너에는 이러한 변경 사항이 반영되지 않습니다. 이는 각 컨테이너가 자신만의 독립적인 파일 시스템 공간을 가지고 있기 때문입니다.
1. 1에서 10000 사이의 임의의 숫자로 ubuntu이름이 지정된 파일을 생성하는 컨테이너를 시작
$ docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
2. 컨테이너의 터미널에 액세스하여 출력을 볼 수 있는지 확인
$ docker exec <container-id> cat /data.txt
명령줄에서 docker exec해당 명령을 사용하여 컨테이너에 액세스합니다. 컨테이너의 ID를 가져와야 합니다( docker ps가져오는 데 사용). Mac 또는 Linux 터미널이나 Windows 명령 프롬프트 또는 PowerShell에서 다음 명령을 사용하여 콘텐츠를 가져온다.
위의 명령어 실행 시 , 임의의 숫자가 표시된다.
3. 아래의 명령어를 입력 시, 루트 디렉터리에 있는 파일을 나열한다. 나열된 파일 정보를 보면 data.txt 파일이 존재하지 않는데, 그것은 컨테이너에 스크래치 공간에 기록이 되었기 떄문이다.
$ docker run -it ubuntu ls /
4. 계속해서 docker rm -f <container-id>명령을 사용하여 첫 번째 컨테이너를 제거하십시오.
컨테이너 용량
일반적으로 Docker 컨테이너 내에서 생성된 파일은 해당 컨테이너 내의 파일 시스템에 저장됩니다. 컨테이너를 제거하거나 다시 시작할 때, 컨테이너 내의 변경 사항은 사라집니다. 이는 Docker가 컨테이너를 격리하여 컨테이너 간에 변경 사항이 분리되어 유지되기 때문입니다.
하지만 볼륨(volume)을 사용하면 컨테이너 내의 특정 경로를 호스트 시스템의 디렉터리와 연결할 수 있습니다. 이렇게 하면 컨테이너 내에서 작업한 파일의 변경 사항이 호스트 시스템에도 반영됩니다. 따라서 컨테이너를 다시 시작하더라도 연결된 디렉터리의 파일은 유지됩니다.
볼륨(volume)을 통한 데이터 유지
예를 들어, 위의 설명에서는 SQLite 데이터베이스 파일인 todo.db를 컨테이너의 파일 시스템에 저장하는데, 이 파일을 호스트 시스템의 디렉터리와 연결하여 유지하고자 합니다. 이러한 방식으로 데이터베이스 파일이 컨테이너 내부가 아닌 호스트 시스템의 디렉터리에 저장되므로 컨테이너가 중지되어도 데이터는 유지됩니다.
볼륨 마운트는 컨테이너 내의 특정 경로를 호스트 시스템의 디렉터리에 연결하는 것으로, 이를 통해 데이터의 지속성을 유지하고 데이터베이스 파일 등을 안전하게 보관할 수 있습니다. Docker가 볼륨을 관리하므로 볼륨의 생성, 연결 및 관리를 수동으로 신경 쓸 필요가 없습니다.
1. 명령어를 사용하여 볼륨을 생성
$ docker volume create todo-db
2. " getting-started " 컨테이너를 사용중이라면, 영구적으로 삭제
$ docker rm -f <id>
3. todo 앱 컨테이너를 시작하고 --mount 볼륨 마운트를 지정하느 옵션을 추가한다. 볼륨에 이름을 지정하고 /etc/todos 컨테이너에 마운트하면 경로에서 생성된 모든 파일이 저장된다. ( Mac 또는 Linux 터미널이나 Windows 명령 프롬프트 또는 PowerShell에서 다음 명령을 실행)
$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
볼륨을 사용할 떄 Docker가 내 데이터를 어디에 저장하는지 알아볼수있는 명령어
$ docker volume inspect todo-db
[
{
"CreatedAt": "2019-09-26T02:18:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
Mountpoint디스크에 있는 데이터의 실제 위치입니다 . 대부분의 시스템에서는 호스트에서 이 디렉터리에 액세스하려면 루트 액세스 권한이 필요