본문 바로가기

Docker

볼륨 [정리]

볼륨

컨테이너는 기본적으로 내부에서 생성된 모든 파일은 쓰기 가능한 컨테이너 레이어에 저장함

이는 다음을 의미.

  • 컨테이너가 삭제되면 데이터도 같이 삭제됨
  • 다른 프로세스에서 필요한 경우 데이터를 가져오는 것이 어려움
  • 컨테이너의 쓰기 레이어는 호스트 시스템과 긴밀하게 연결되어 있음. 때문에 데이터를 다른 곳으로 쉽게 이동할 수 없음.
  • 컨테이너 쓰기 레이어에 데이터를 쓰기 위해서는 스토리지 드라이버가 필요함. 스토리지 드라이버의 사용은 Linux 커널 사이의 추상화 계층이 추가되어 성능 저하를 일으킴.
    • 볼륨 사용 시 호스트 시스템에 직접 데이터를 쓰기 때문에 이러한 오버헤드가 없음

데이터를 유지하는 방법은 크게 3가지 방식이 있음

  • volume : 호스트 파일 시스템의 일부에 저장됨(/var/lib/docker/volumes/). 가장 권장되는 방식. 여러 컨테이너 간 데이터를 공유하는 경우에도 유용함.
  • bind mount : 호스트 시스템의 마운트 경로를 지정할 수 있음. 단, 항상 컨테이너의 경로를 덮어쓰기 때문에 사용 사례에 따라 적절하지 않을 수 있음(이미지의 해당 경로에 사전에 준비되어 있는 데이터가 있는 경우)</aside>
  • <aside> 💡 bind mount 사용 시 호스트 시스템의 중요한 파일을 수정하거나 삭제할 수 있는 부작용이 있으므로 주의해야 함.
  • tmpfs mount : 호스트 시스템의 메모리에 데이터를 저장하는 방식. 따라서 휘발성이기 때문에 비지속적 상태의 데이터 혹은 민감 정보를 저장하는 데 사용할 수 있음. 메모리 영역이기 때문에 컨테이너 간 공유할 수 없음.

실습 컨테이너 일괄 삭제

docker rm -f `docker ps -q --filter name=my-ubuntu*`

1. volume

볼륨 생성

docker volume create my-volume

볼륨 생성 확인

docker volume ls
docker inspect my-volume

컨테이너 생성

docker run -itd --name my-ubuntu3 -v my-volume:/opt/data ubuntu:22.04

볼륨 확인

docker exec -it my-ubuntu3 bash
cd /opt/data

데이터 생성

echo "this is test data" > test.txt
exit

컨테이너 삭제 후 재생성

docker rm -f my-ubuntu3
docker run -itd --name my-ubuntu -v my-volume:/opt/data ubuntu:22.04

볼륨 재확인

docker exec -it my-ubuntu bash
cat /opt/data/test.txt
exit

호스트 시스템 볼륨 확인

cd /var/lib/docker/volumes/my-volume/_data
ls
cat test.txt

이 데이터는 지워지지 않고 계속 쌓이므로 필요에 따라 docker volume prune 명령으로 사용하지 않는 컨테이너의 볼륨을 정리할 수 있음

2. bind mount

마운트 경로 생성

# ubuntu 계정 쉘으로 수행
cd ~ # /home/ubuntu
mkdir -p my-volume/data
cd my-volume/data
echo "this is test data" > test.txt
cat test.txt

컨테이너 생성

-v <호스트 시스템 경로>:<컨테이너 경로> 로 마운트 할 수 있으며 호스트 시스템 경로는 절대경로여야 한다. 컨테이너에 이미 해당 경로가 있으면 해당 경로를 덮어쓴다.

docker run -itd --name my-ubuntu2 -v /home/ubuntu/my-volume:/opt/ ubuntu:22.04

볼륨 확인

docker exec -it my-ubuntu2 bash
cat /opt/data/test.txt
exit

3. tmpfs mount

--tmpfs 혹은 --mount 옵션으로 사용 가능하지만 --mount 옵션을 권장함.

컨테이너 생성

docker run -itd --name my-ubuntu3 --mount type=tmpfs,destination=/opt/data ubuntu:22.04

확인

docker inspect my-ubuntu3 --format '{{ json .Mounts }}'

컨테이너 내부 경로 확인 및 쓰기 작업 테스트 해볼 것