IT/DevOps

[Docker] Container의 filesystem, Database 유지하기: 1. Volume mount

kykyky 2024. 2. 6. 17:25

이전 글 👇

 

2024.02.05 - [IT/DevOps] - [Docker] Application 공유하기: Docker registry, Docker Hub

 

[Docker] Application 공유하기: Docker registry, Docker Hub

이전 글 👇 2024.02.05 - [IT/DevOps] - [Docker] Application 업데이트하기 [Docker] Application 업데이트하기 이전 글 👇 2024.02.04 - [IT/DevOps] - [Docker] Overview, Containerize an application [Docker] Overview, Containerize an applicat

intoky.tistory.com

 


Container의 filesystem


 

 

Docker에서는, 한 Image를 가지고 여러 Container를 만들 수 있습니다.

기본적으로, 이 Container들끼리는 각자의 변화가 공유되지 않고 독립되어 있습니다. 또한, 한 Container에서 생성된 파일은 다른 Container에서는 접근할 수 없습니다.

 

 

✅ 동일한 Image로부터 만들어진 두 Container 사이에서, 파일이 공유되지 않음을 직접 실험해보겠습니다.

 

1. 첫번째 Container

 

ubuntu Image로부터 만들어진 이 Container에서는,

/data.txt 파일을 만들고, 이 파일 안에 아무 랜덤 숫자 (1~10000 사이)를 적어넣을 겁니다.

 

 

아래 명령어는 위 수행을 그대로 옮긴 것입니다. 

docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"

 

 

아래 명령어를 통해 /data.txt을 확인해봅시다.

docker exec <Container ID> cat /data.txt

 

 

 

2. 두번째 Container

 

역시 동일한 ubuntu Image로부터 Container를 만들 건데요,

과연 이 Container에는, 위 첫번째 Container에서 만든 숫자가 담긴 /data.txt가 있을까요?

 

 

아래 명령어를 통해 Container를 시작하고, 이 Container의 root 디렉토리의 파일을 리스트해봅시다. 

docker run -it ubuntu ls /

 

 

헉, data.txt 파일이 없군요! 

data.txt 파일은 첫번째 Container의 공간에서만 존재하기 때문입니다.

 

 

아래 명령어를 통해 Container를 삭제하며 마무리 해주세요.

docker rm -f <Container ID>

 

 

이로써, 같은 Image로부터 만들어진 Container들이라도, 서로 독립되어 있음을 알았습니다~!

 


Volume mount


 

출처: https://docs.docker.com/storage/volumes/

 

 

Volume을 통해, 특정 Container의 filesystem path를 host machine에 연결시킴으로써 Database를 유지할 수 있습니다!

특정 Container에 어떤 directory를 mount하면, 이 directory에서의 변화는 host machine에서도 확인 가능합니다.

그리고 이 directory를 다른 Container에 mount하게 되면, 이 Container에서도 Database을 사용할 수 있는 것이죠~!

 

 

✅ Database 유지를 위한 Volume을 만들어, Container에 mount해보기!

 

 

1. Volume 생성하기

docker volume create todo-db

 

 

 

2. 이전 Container 삭제하고, Volume이 mount된 새 Container 시작하기

docker rm -f <Container ID>
docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

 

 

 

3. 이 Application을 사용하고, Container 삭제하기

 

localhost:3000으로 접속하여 todo App을 사용하면서 약간의 데이터를 남겨보았습니다.

 

 

그리고, 현재 실행중인 Container를 삭제합니다.

docker rm -f <Container ID>

 

 

 

4. 방금 사용한 Volume이 mount된 새 Container 시작하기

 

todo 데이터를 생성해놓았던 이전 Container는 이미 삭제되었으므로,

만약 Volume을 사용하지 않았더라면, todo 데이터는 완전히 삭제되었고,

동일 Image로부터 새 Container를 만들어서 App을 실행했을 때, 아무런 기존 데이터 없이 시작하게 될 겁니다.

 

그러나 이번에는 Volume을 활용함으로써,

특정 Container에서 쌓은 데이터가 Container 삭제 시에도 휘발되지 않고 유지되어

이 Database를 다른 Container에서도 사용 가능해질 것입니다.

 

 

그럼, Volume을 mount하여 새 Container를 시작해봅시다.

docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

 

 

 

5. 데이터가 유지된 것을 확인하기!

 

다시 localhost:3000으로 접속해 보면, 이전의 Database가 유지되어있는 것을 볼 수 있습니다!

제가 아까 만들었던 todo들이 변함없이 그대로 남아있군요.

 

 

 

※ 우리가 사용했던 Volume을 자세히 살펴보기

 

docker volume inspect todo-db

 

 

위 명령어 입력 시, 아래와 같이 Volume에 대한 상세 정보가 나타납니다.

 

 


 

감사합니다~!