이전 글 👇
2024.02.05 - [IT/DevOps] - [Docker] Application 공유하기: Docker registry, Docker Hub
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
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에 대한 상세 정보가 나타납니다.
감사합니다~!
'IT > DevOps' 카테고리의 다른 글
[Docker] multi-container application: Docker compose (0) | 2024.02.07 |
---|---|
[Docker] Database 유지하기: 2. Bind mount (0) | 2024.02.07 |
[Docker] Application 공유하기: Docker registry, Docker Hub (0) | 2024.02.05 |
[Docker] Application 업데이트하기 (2) | 2024.02.05 |
[Docker] Overview, Application containerize하기 (0) | 2024.02.04 |