컨테이너를 제거하면 데이터도 함께 제거된다
도커 컨테이너가 동작하면서 생성된 컨테이너 데이터들은 기본적으로 컨테이너를 삭제하게 되면 같이 제거됩니다. 다음과 같이 MySQL 컨테이너를 생성했다가 docker rm 명령어로 제거하면 해당 컨테이너에 있던 MySQL 데이터까지 모두 사라지는 것입니다.
# docker run -d \
> --name mysqldb \
> -e MYSQL_ROOT_PASSWORD=123456 \
> -e MYSQL_DATABASE=proddb \
> mysql |
cs |
당연하게도 mysqldb 컨테이너에 저장되는 db 데이터들 또한 같이 제거됩니다.
# docker stop mysqldb
# docker rm mysqldb |
cs |
컨테이너의 데이터를 호스트 OS에 저장하기
도커에서 컨테이너는 정말 쉽게 제거가 가능하며, 실수로 지울 수도 있고, 서비스의 버전을 높이거나 시스템의 구성을 달리하기 위해서 지우고 새로 생성하는 등의 과정을 자주 반복하게 됩니다. 그러나 이 과정에서 실제 운영중인 데이터는 어떻게 해야 할까요?
어플리케이션(또는 컨테이너) 자체는 지워지더라도 그 어플리케이션이 사용하고 축적하는 데이터 자체가 지워지는 것을 옳지 못할 수 있습니다. 고객의 데이터는 소중하니까요.
도커는 컨테이너를 docker run 명령어로 생성할 때 컨테이너의 특정 디렉터리와 호스트 OS의 특정 디렉터리를 서로 공유할 수 있도록 -v [호스트의 디렉터리]:[컨테이너의 디렉터리] (또는 --volume)옵션을 제공하고 있습니다.
이때 호스트의 디렉터리는 비어있거나 파일이 존재하지 않는 디렉터리여야 합니다. 나중에서 설명하지만 만약 파일이 존재하는 디렉터리인 경우 도커 컨테이너를 생성할때 기본적으로 생성되는 내용들이 호스트의 디렉터리의 내용으로 덮어 씌워집니다.
# docker run -d \
> --name mysqldb \
> -e MYSQL_ROOT_PASSWORD=123456 \
> -e MYSQL_DATABASE=proddb \
> -v /home/mysql_dir:/var/lib/mysql \
> mysql |
cs |
컨테이너를 생성한 이후에 호스트 OS의 /home/mysql_dir 을 보면 다음과 같이 mysql 운영시 저장되는 데이터 파일들이 저장되어 있는 모습을 볼 수 있습니다. 실제로 이는 방금 생성한 mysqldb 컨테이너의 /var/lib/mysql 디렉터리와 연결된 하나의 디렉터리입니다.
디렉터리 공유 원리
docker run -v 옵션은 정확하게 말하자면 컨테이너와 호스트가 디렉터리를 공유한다 라는 말이 맞을 수 있지만 그보다는 호스트의 특정 디렉터리(지정해준)를 컨테이너의 특정 경로에 마운트 시킨다 라고 할 수 있습니다.
mysql은 기본적으로 리눅스에 설치된 경우 /var/lib/mysql 하위에 데이터를 저장합니다. 그런데 해당 경로의 디렉터리가 호스트 OS의 /home/mysql_dir/ 디렉터리를 마운트 시킨 디렉터리였던 것입니다.
추가적으로 호스트 OS와 디렉터리를 공유하면 다음의 규칙이 성립합니다.
-
컨테이너를 지워도 공유했던 호스트의 디렉터리를 지우지 않는 이상 데이터는 사라지지 않습니다.
-
공유는 디렉터리 뿐만 아니라 파일 단위 공유도 가능합니다. ex) -v /home/test.txt:/var/test.txt
-
여러개의 파일 및 디렉터리를 공유할 때는 -v 옵션을 여러번 사용합니다. -v ~~~ -v ~~~
호스트의 디렉터리에 파일이 존재하는 상태에서 공유하는 경우
만약 -v [호스트의 디렉터리]:[컨테이너의 디렉터리] 로 컨테이너와 호스트간에 디렉터리를 공유했을 때 호스트의 디렉터리에 이미 파일들이 존재하고 컨테이너의 디렉터리에는 컨테이너를 생성하면서 기본적으로 생성되는 파일들이 있을때는 어떻게 될까요?
정답은 컨테이너를 생성하면서 기본적으로 생성되는 파일들, 즉 도커 이미지에 기본적으로 저장된 파일들은 사라지고 호스트 디렉터리의 내용들로 덮어씌워지게(overwrite) 됩니다.
이렇게 했을때의 얻는 이점은 무엇이 있을까요? 물론 꼭 컨테이너의 데이터들을 호스트에 저장할 필요는 없습니다. 다만 컨테이너는 임시적인 프로세스 개념이므로 컨테이너의 상태를 영구적이고 더욱 안정적으로 저장하고 관리하기 싶도록 하기 위해서 호스트에 저장하는 것입니다.
또한 호스트에 데이터를 저장하게 되면 컨테이너를 유지보수 하기가 더욱 심플해질 수 있습니다. 예를 들어 블로그를 운영하기 위해 워드프레스를 컨테이너로 서비스한다고 했을때 공유되는 디렉터리의 내용만 변경해주면 컨테이너 구성은 변경하지 않으면서 블로그의 게시글(컨텐츠) 내용을 새로 업데이트 또는 마이그레이션 할 수 있습니다.
반대로 호스트의 공유 디렉터리는 그대로 둔채로 워드프레스 버전만 변경한다든지 mysql 버전만을 변경한다는지 할수도 있습니다. 꼭 장점만 있는것이 아닐 수 있고 의무는 아니기 때문에 목적에 따라 응용하시기 바랍니다.
다음글
'시스템 인프라' 카테고리의 다른 글
[Docker] 데이터를 컨테이너 내부가 아닌 도커 엔진에 저장하기 (도커볼륨) (0) | 2018.06.26 |
---|---|
[Docker] 도커 컨테이너 사이에 디렉터리 및 파일 공유하기 (0) | 2018.06.26 |
[Docker] 도커 네트워크 구조 및 컨테이너 호스트 OS 외부에 개방하는 방법 (0) | 2018.06.22 |
[Docker] 도커로 워드프레스(WordPress) MySQL 간단 구축 및 설정 (0) | 2018.06.21 |
[Docker] 컨테이너 로그 보기 - docker logs 명령어 (0) | 2018.06.20 |