컨테이너가 사용하는 스토리지(볼륨)
✅ 컨테이너 안에서 데이터를 영구적으로 보존하는 방법에 대해서 학습하자.
컨테이너 볼륨?
컨테이너 이미지는 ReadOnly(수정이 불가능한 상태이다.) 속성을 가지고 있다.
하나의 컨테이너 이미지를 docker run
하게 되면 ReadOnly속성으로 하나의 프로세스로 동작한다.
그러면서 컨테이너는 ReadWrite 레이어를 만들고 연결하게 된다.
모든 데이터는 RW(ReadWrite)레이어에 쌓이게 된다.
두개가 하나로 보이는 방법은 docker가 가지고 있는 레이어를 관리하는
Union File System 기술이다.
기존에 있는 ReadOnly 레이어에 ReadWrite레이어의 변경사항이 마치 하나인 것처럼 만들어서 우리에게 보여주는 기술을 Union File System이라고 하며 다른 말로 Overlay라고 한다.
Docker가 이러한 Union File System으로 동작하기 때문에 ReadOnly, ReadWrite가 마치 하나인 것처럼 동작을 해준다.
docker rm
명령어로 컨테이너를 삭제 하게 되면, ReadWrite 레이어 역시 사라지고, 이 안에 저장된 데이터 역시 모두 삭제되게 된다.
그렇기 때문에 영구적으로 보존하기 위한 기술, 컨테이너에서 볼륨, 데이터를 보존하는 기술이 중요하다.
데이터를 보존하고 싶어요
기본적으로 데이터를 저장하면 RW레이어(rw/var/lib/mysql)에 데이터가 쌓인다.
이런 상황에서 영구적으로 보존하기 위해서는 Docker Host에다가 특정 저장소 공간을 만들어야 한다.
Volume Monut
docker run -d --name db -v(옵션) 호스트의 디렉토리:컨테이너디렉토리
디렉토리가 될 수도 있고, 또 다른 디스크가 될 수도 있다.
컨테이너가 저장하는 데이터를 다른 저장소에 저장하도록 만든다.
docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=pass
volume 옵션 사용
container mount path에 쌓이는 데이터를 host path에 저장해줘 라는 의미이다.
-v host path : container mount path
-v host path : container mount path : read write mode
ex)ro 호스트에 있는 데이터를 수정하지 못하도록 한다.
-v container mount path
컨테이너끼리 데이터 공유 가능한가요?
web content generator에 쌓이는 데이터를 Docker Host의 /webdata에 저장하고, web server컨테이너가 데이터를 사용해서 웹페이지를 그려내고, 사용자는 web server컨테이너에 접근해서 웹페이지를 이용한다.
볼륨마운트를 통해서 컨테이너 간의 데이터 공유가 가능하다.
실습
docker run -d -v /dbdata:/var/lib/mysql -e MYSQL..PASSWORD = password mysql:latest
docker run -d -v /var/lib/mysql -e MYSQL..PASSWORD = password mysql:latest
지정하지 않았을 경우 /var/lib/docker/volumes/UUID/_data에 데이터가 저장되게 된다.
두가지 형태로 볼륨 마운트하는 것을 보았다.
-v docker host path: container path
-v container path
내가 원하는 디렉토리에 할 것인지. 아니면 docker가 관리해주는 디렉토리에 할 것인지.
docker volume ls
로컬에 있는 volume 마운트 된 데이터 확인
https://www.youtube.com/watch?v=JcgrQnkIePE&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=19