728x90

Docker 컨테이너가 사용하는 스토리지

1. 도커의 레이어 기술

도커의 컨테이너 이미지는 ReadOnly 상태입니다. 컨테이너에 추가되는 데이터들은 별도의 ReadWrite레이어에 저장됩니다. 도커 컨테이너를 실행시키면 ReadOnly와 ReadWrite를 만들어서 같이 실행되어 하나의 프로세스가 되어서 동작을 합니다. 어떻게 ReadOnly와 ReadWrite가 하나인 것처럼 보일까요? 이것은 도커가 가지고 있는 레이어의 기술입니다. 이 레이어 기술을 유니온 파일 시스템 또는 overlay라고 합니다. 기존에 가지고 있던 ReadOnly 레이어에서 ReadWrite 레이어에 변경사항이 마치 하나인 것처럼 보여주는 것입니다. 도커에서는 컨테이너를 실수로 삭제하면 그 안에 있던 데이터가 다 날아갑니다. 이를 보안하기 위해 -v volume 명령어를 사용합니다.

 

2. volume 명령어

volume 옵션
-v <host path>:<container mount path>

-v <host path>:<container mount path>:<read writer mode>

-v <container mount path>

$ docker run -d --name db -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
데이터를 실제 호스트에 기록되게 볼륨 마운트하면 보안 이슈가 있다. 
해커가 파일을 저장하게되면 호스트에도 저장된다.

$ docker run -d --name db -v /data:/var/www/html:ro httpd
위의 보안 문제를 해결하기 위해 둘째 라인처럼 ro :readonly을 써준다.

$ docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
-v 뒤에 호스트 주소가 없으면 data 디렉토리 처럼 uuid로 된 디렉토리를 만들고 
그 밑에 data디렉토리를 만들어서 거기에 저장된다.

 

3. 컨테이너끼리 데이터 공유하기

컨테이너와 컨테이너끼리 데이터 마운트로 데이터 공유가 가능합니다.

이를 이용하면 리눅스 컨테이너가 /webdata와 마운트 되어있고 index.html을 만들었고 nginx 컨테이너가 같은 폴더를 마운트하고 있으면 유저에게 index.html을 보여줄 수 있습니다. 또한 리눅스에서 index.html 파일을 변경하여도 적용됩니다.

 

4. volume 실습

docker exec -it db /bin/bash

위에 명령어는 도커에서 mysql에 접속하는 명령어입니다.

 

성공적으로 mysql에 접속한 것을 확인하실 수 있습니다. hs 라는 이름으로 database를 만들었습니다.

 

동작중인 컨테이너를 삭제하여도 호스트의 dbdata 디렉터리에는 hs 가 남아있는 것을 확인하실 수 있습니다.

 

-v 옵션에 host 디렉토리의 이름을 지정해주지 않았습니다.

 

docker inspect 명령어로 host 디렉토리의 이름을 지정하지 않으면 어느 디렉터리로 Mount 되는지 확인하였습니다.

host 디렉토리를 지정하지 않으면 /var/lib/docker/volumes/에 uuid로 디렉터리가 만들어지고 그 밑에 _data라는 디렉터리가 만들어진 것을 확인하실 수 있습니다.

728x90

+ Recent posts