도커 이미지로 컨테이너를 실행시키고 내용을 변경한 후 컨테이너로 이미지를 만들어봤었어요. 이 컨테이너로 이미지를 만들 때 변경된 부분은 read/write layer 라는 곳에 있어요. 만약에 어떤 이미지를 가지고 컨테이너를 만들고 내용을 수정했다가 이 컨테이너로 이미지를 따로 만들지 않고 컨테이너를 삭제하면 그 변경된 부분은 사라져요.

 

https://xodwkx2.tistory.com/31

 

도커를 활용해 MongoDB 서버 만들기

도커를 활용해서 몽고디비 서버를 만들어 보아요. 먼저 도커 허브에서 mongo를 검색 해볼게요. mongo Official Image를 눌러서 들어가보면 아래와 같은 걸 볼 수 있어요. 오른쪽에 docker pull mongo 라고 써

xodwkx2.tistory.com

에 이어서 볼게요.

 

위와 같은 문제점을 해소하기 위해 도커에서는 데이터를 컨테이너의 라이프사이클을 넘어서 보존할 수 있는 방법을 제시하고있어요.

하나는 HOST의 파일 시스템에서 파일이나 폴더를 컨테이너의 파일 시스템에 붙여서 사용하는 방법이고

다른 하나는 Docker Volume이라는 것을 만들어서 컨테이너의 파일 시스템에 붙여서 사용하는 방법이에요.

이번에는 volume을 먼저 보도록할게요.

 

도커 볼륨은 도커 HOST의 특별한 위치에 있는 디렉토리에요. 단순하게. 도커는 이 디렉토리의 생성 및 관리를 담당해요.

위에서 언급한 것 같이 이 도커 볼륨은 컨테이너의 파일 시스템에 붙여서 애플리케이션의 저장공간으로 사용할 수 있어요. 컨테이너와 마찬가지로 도커 볼륨도 따로 이름을 줄 수 있고 이름 없이 ID만 가지고 사용되기도 해요.

 

간단하게 도커 볼륨을 하나 생성하고 컨테이너 2개를 만들어서 각각의 컨테이너에 하나의 도커 볼륨을 붙여서 사용해볼게요.

 

➜  ~ docker volume create xodwkvolume        
xodwkvolume

➜  ~ docker volume ls                 
DRIVER    VOLUME NAME
local     xodwkvolume

이렇게 xodwkvolume이라는 이름의 볼륨을 생성하고 확인해봤어요.

그럼 이제 이 볼륨을 붙여서 컨테이너를 만드는데 --rm 옵션을 주면 컨테이너가 종료되는 순간 삭제돼요.

➜  ~ docker container run -it --rm -v xodwkvolume:/data alpine 
/ # cd data/
/data # echo 'Hello xodwk' > xodwk.txt
/data # ls -al
total 4
drwxr-xr-x    2 root     root            23 Aug  5 07:17 .
drwxr-xr-x    1 root     root            30 Aug  5 07:16 ..
-rw-r--r--    1 root     root            12 Aug  5 07:17 xodwk.txt
/data # exit
➜  ~ docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

방금 이 컨테이너는 /data/ 디렉토리에 xodwk.txt라는 파일을 하나 만들고 그 안에 Hello xodwk 라는 글을 쓰고 exit 하면서 삭제까지 끝났어요.

그럼 이제 또 다른 컨테이너 2개를 dettached 모드로 생성해볼게요.

➜  ~ docker run -dit --name volte1 -v xodwkvolume:/data alpine 
2185152e6fbaf35f96e3ec7b65f8f758e9da0870d59b8361eaace8f4dd845db0

➜  ~ docker run -dit --name volte2 -v xodwkvolume:/data alpine 
fdfc1233014ec00b87f870455200a3d9e98de0ad96979a885f49af3f0a396743

➜  ~ docker ps -a                                              
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
fdfc1233014e   alpine    "/bin/sh"   4 seconds ago    Up 3 seconds              volte2
2185152e6fba   alpine    "/bin/sh"   14 seconds ago   Up 13 seconds             volte1

 

그리고 각각 컨테이너에서 /data/ 폴더에 어떤게 들어있는지, 들어있으면 그 파일 안에는 무슨 내용이 있는지 볼게요.

느낌이 오지요?

➜  ~ docker exec volte1 cat /data/xodwk.txt                    
Hello xodwk

➜  ~ docker exec volte2 cat /data/xodwk.txt 
Hello xodwk

➜  ~ docker exec -it volte2 sh                  
/ # cd data/
/data # ls
xodwk.txt
/data # vi xodwk.txt 
/data # exit 

➜  ~ docker exec volte1 cat /data/xodwk.txt 
Hello xodwk
Welcome to xodwk world!

 

volte1, volte2 컨테이너 모두에서 /data/xodwk.txt 파일을 확인했고 안에 있는 내용도 확인했어요.

그리고 volte2 컨테이너에 쉘로 접속해서 /data/xodwk.txt 내용을 변경하고 volte1 컨테이너에서 /data/xodwk.txt 파일 내용을 확인해봤더니 글쎄 volte2에서 변경한 내용을 볼 수 있었어요.

 

너무 신기한 거 같아요.

 

그리고 하나 더. 

➜  ~ docker volume inspect xodwkvolume 
[
    {
        "CreatedAt": "2021-08-05T16:17:21+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/xodwkvolume/_data",
        "Name": "xodwkvolume",
        "Options": {},
        "Scope": "local"
    }
]

➜  ~ sudo ls -l /var/lib/docker/volumes/xodwkvolume/_data/          
total 4
-rw-r--r--. 1 root root 36 Aug  5 16:22 xodwk.txt

➜  ~ sudo cat /var/lib/docker/volumes/xodwkvolume/_data/xodwk.txt 
Hello xodwk
Welcome to xodwk world!

 

 

끝.