도커 볼륨을 다루는 명령어는 docker volume
로 시작하게 된다. 먼저, myvolume라는 이름을 가진 도커 볼륨을 생성해 본다.
docker volume create --name myvolume
volume
와 create
를 통해 토커 볼륨을 생성해주고 --name
옵션을 통해 도커 볼륨의 이름을 지정해 주었다.
docker volume ls
ls
명령어로 확인을 해 보면 위와 같이 표시되는 것을 확인할 수 있게 되는데 지금 생성된 도커 볼륨을 확인해 보면 정상적으로 myvolume가 생성되어 있다.
위에서 만든 myvolume를 사용하는 Container를 생성해 본다.
docker run -i -t --name myvolume_1 \
-v myvolume:/root/ \
ubuntu:20.04
docker run -i -t --name myvolume_2 \
-v myvolume:/root/ \
ubuntu:20.04
두 컨테이너를 생성해 주었고 -v
옵션을 통해 myvolume 볼륨을 사용하면서 /root/
경로를 활용하도록 설정해 주었다.
[볼륨이름]:[컨테이너의공유디렉터리]
옵션에 이런 형식으로 입력하면 된다.
컨테이너 생성을 확인해 보면 정상적으로 두 컨테이너가 생성된 것을 확인할 수 있다. 지금 중요한 것은 위에 두 컨테이너는 /root/
경로를 공유하고 있다는 것인데 생성한 다음 위 경로를 확인해 보면 따로 생성되어 있는 것은 없다.
컨테이너 ID(앞 두자리) | 컨테이너명 |
---|---|
59 | myvolume_1 |
14 | myvolume_2 |
캡쳐와 표를 참고하면서 진행한다. 위 캡쳐의 내용을 따로 명령어만 천천히 빼서 보자면 아래와 같다.
docker attach 59
cd /root/
ls
첫 번째 컨테이너의 /root/
경로에 무엇이 있나 체크했더니 volume
가 있다.
rm -r volume
ls
ctrl + p + q
volume
를 첫 번째 컨테이너에서 삭제하고 컨테이너를 정지시키지 않은채로 빠져나간다.
docker attach 14
cd /root/
ls
두 번째 컨테이너로 접속해서 /root/
경로에 무엇이 있는지 체크했더니 아무것도 없다. 첫 번째 컨테이너에서 원래(내가 미리 생성해 두었던..) volume
파일이 사라졌다.
이렇게만 확인하면 첫 번째 컨테이너엔 원래 있었다 삭제했고, 두 번째 컨테이너에는 원래 없었던 게 아닌가?.. 라는 생각을 할 수가 있다. 즉, 공유되고 있는지 체크할 수 없다. 때문에 두 번째 컨테이너에 데이터를 추가하고 첫 번째 컨테이너에서 다시 확인을 해 보는 과정을 거쳤다.
echo hello, volume ! >> /root/volume
cat /root/volume
ctrl + p + q
두 번째 컨테이너에서 /root/volume
파일에 내용을 적고 정상적으로 체크가 되었는지 확인한 뒤 컨테이너를 빠져나왔다.
docker attach 59
cat /root/volume
cd /root/
ls
다시 첫 번째 컨테이너로 접속해서 두 번째 컨테이너에서 작성한 파일이 있는지 cat
명령어로 읽었을 때 같은 내용이 정상적으로 출력이 되었고, /root/
경로에 들어가서 ls
명령어로 확인을 해봐도 정상적으로 volume
파일이 생성되어 있는 것을 확인할 수 있다.
도커 볼륨을 활용하여 컨테이너 데이터를 보존하는 방법에 대해서 체크해 봤다. 다시 체크해 보자면 도커 볼륨을 생성하고 컨테이너를 생성할 때 공유 받을 도커 볼륨과 공유 받을 컨테이너의 디렉터리 경로를 체크하고 해당 볼륨을 해당 경로에 공유받는 방식으로 활용할 수 있는 방법이다.
이때, 볼륨은 실시간으로 공유가 되는 것을 확인할 수 있었으며 하나의 볼륨으로 여러 컨테이너에 붙여 사용할 수 있는 것 또한 체크할 수 있었고 이 볼륨은 도커 엔진에서 관리를 한다는 부분을 다시 상기시킬 수 있다.
단, 도커 볼륨 또한 호스트 볼륨 공유처럼 호스트에 저장하기 때문에 데이터를 보존하긴 하지만 실제로 어디에 저장되는지 사용자는 따로 알 필요가 없다. 궁금하다면 아래 명령어를 통해 정보를 얻을 수 있다.
docker inspect --type volume 볼륨이름
만약 볼륨을 한 번에 모두 삭제하고 싶다면 docker volume prune
명령어를 통해 삭제하면 된다.
도커를 사용하면서 이렇게 컨테이너가 삭제되도 데이터를 보존하는 방식으로 즉, 스테이트리스한 컨테이너 설계하는 방식으로 사용하는 것이 도커를 바람직하게 설계하는 것이기 때문에 컨테이너에 데이터를 보관하는 것은 지양해야 한다는 점도 체크해 봐야 한다.