컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것을 스테이트리스하다고 한다.
컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받는다.
컨테이너가 삭제되어도 데이터는 보존되므로 도커를 사용할 때 바람직한 설계이다.
컨테이너가 데이터를 저장하고 있어 상태가 있는 경우 스테이트풀하다고 말한다.
컨테이너 자체에서 데이터를 보관하므로 지양하는 것이 좋다.
도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장해서 각 컨테이너의 정보를 보존한다.
이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장한다.
따라서, 컨테이너를 삭제하면 컨테이너 계층에 저장돼 있던 정보도 삭제되고, 이는 복구할 수 없다.
이를 방지하기 위해 컨테이너의 데이터를 영속적 데이터로 활용할 수 있는 방법을 알아보자!
호스트의 디렉터리를 컨테이너의 디렉터리에 마운트한다.
-v [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리]
docker run
...
-v /home/wordpress_db:/var/lib/mysql
...
run 명령어의 옵션 -v
를 사용한다.
([호스트의 공유 디렉터리]
와 [컨테이너의 공유 디렉터리]
를 공유한다.)
[호스트의 공유 디렉터리]
를 호스트에 생성하지 않았어도 도커가 자동으로 생성해준다.
컨테이너의 디렉터리
와 호스트의 디렉터리
는 동기화되는 것이 아니라 완전히 같은 디렉터리이다!
디렉터리 단위의 공유뿐 아니라 단일 파일 단위의 공유도 가능하다.
동시에 여러 개의 -v
옵션을 쓸 수도 있다.
이미지에 원래 존재하던 디렉터리에 호스트의 볼륨을 공유하면 컨테이너의 디렉터리 자체가 덮어씌워진다.
(-v
옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리
를 컨테이너의 디렉터리
에 마운트한다.)
컨테이너를 생성할 때 --volumes-from
옵션을 설정하면, -v
또는 --volume
옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있다.
직접 볼륨을 공유하는 것이 아닌 -v
옵션을 적용한 컨테이너를 통해 공유하는 것이다.
여러 개의 컨테이너가 동일한 컨테이너에 --volumes-from
옵션을 사용함으로써 볼륨을 공유해 사용할 수도 있다.
호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 일명 '볼륨 컨테이너'로서 활용하는 것도 가능하다.
볼륨을 사용하려는 컨테이너에 -v
옵션 대신 --volumes-from
옵션을 사용함으로써 볼륨 컨테이너에 연결해 데이터를 간접적으로 공유받는 방식이다.
도커 자체에서 제공하는 볼륨 기능 활용해 데이터를 보존할 수 있다.
// 1. 볼륨 생성
docker volume create --name 볼륨이름
// 1-1. 볼륨을 사용하는 컨테이너 생성
docker run -i -t --name 컨테이너명
-v [볼륨이름]:[컨테이너의 공유 디렉터리]
// 2. 볼륨 생성과 컨테이너 생성 한번에 하기 (볼륨 이름은 무작위 생성됨)
docker run -i -t --name 이름
-v /root
이미지
볼륨을 사용하는 컨테이너 생성 예시
(
[컨테이너의 공유 디렉터리]
->/root/
)
/root
디렉터리에 마운트하므로/root
디렉터리에 파일을 쓰면 해당 파일이 볼륨에 저장된다.
// 볼륨 목록
docker volume ls
// 볼륨 마운트에 대한 정보
docker container inspect volume_auto
👉🏻 출력 결과의 'Source' 항목에 정의된 디렉터리 확인!
도커 볼륨을 사용하고 있는 컨테이너를 삭제해도 볼륨이 자동을 삭제되지 않는다.
// 사용되지 않는 볼륨을 한꺼번에 삭제하기
docker volume prune