도커 스토리지와 볼륨 Storage and Volumes
파일 트리와 마운트 지점
Mount Points는 호스트의 파일 시스템에 대한 루트 경로를 기준으로 데이터를 접근할 수 있는 지점을 제공한다.
이러한 마운트 지점은 사용자로 하여 리눅스 환경에서의 원본 맵핑이 어떻게 되든 알 필요 없이 호스트 시스템의 파일 트리를 사용할 수 있게 해준다.
도커는 컨테이너 생성 시 MNT namespace와 유일한 파일 시스템의 루트를 제공한다.
이러한 방식으로 호스트 파일 시스템으로 부터 컨테이너에서 실행되는 환경으로의 마운트 지점을 제공하여 컨테이너에게 스토리지 접근을 가능하게한다.
도커 마운트 타입
도커의 마운트 타입은 3가지로 나뉜다.
- Bind mounts
- In-memory storage
- Docker volumes
예시)
도커 컨테이너를 시작하면, 이미지가 갖고 있는 파일 시스템에 대한 마운트 지점이 생성된다.
in-memory 타입의 tmpfs를 /tmp 지점에 제공한다.
bind-mount를 사용하여 실행 프로그램의 설정을 호스트 파일 시스템으로 부터 주입한다.
volume은 도커가 관리하는 스토리지로 컨테이너 생성과 함께 혹은 직접 볼륨을 생성하여 컨테이너에 마운트 지점을 제공한다. 로그를 위한 별도 볼륨을 생성하여 컨테이너에 할당한 예시가 될 수 있다.
Bind Mounts
바인드 마운트 타입은 이미 존재하는 호스트 파일 시스템(파일 혹은 디렉토리 경로)으로 부터 컨테이너 파일 시스템으로 직접 맵핑한다.
호스트 파일 시스템에서 관리하는 민감한 설정이나 호스트 파일에 기록한 로그를 다른 곳으로 스트림 전송이 필요한 경우 등 호스트 파일을 직접 이용하는 경우에 용이하다.
웹 서버 설정 주입 예제
CONF_SRC=~/example.conf;
CONF_DST=/etc/nginx/conf.d/default/conf;
docker run -d --name diaweb --mount type=bind,src=${CONF_SRC},DST=${CONF_DST} -p 80:80 nginx:latest
--mount 옵션에서 bind 타입을 지정하였으며 src 호스트 파일 시스템에서 dst 파일 시스템으로 주입한다. (맵핑)
readonly 옵션
설정 파일은 웹 서버에 의해 변경될 일이 없으므로 readonly를 강제하여 파일의 변경을 방지한다.
CONF_SRC=~/example.conf;
CONF_DST=/etc/nginx/conf.d/default/conf;
docker run -d --name diaweb --mount type=bind,src=${CONF_SRC},DST=${CONF_DST},readonly=true -p 80:80 nginx:latest
In-memory storage
웹 서버 private key, 데이터베이스 Connection 설정, api-key 등 민감한 설정 혹은 임시 버퍼 등으로 인-메모리 스토리지를 사용해야할 경우가 있다. 이러한 데이터들은 절대 디스크에 저장되면 안되고 메모리 상으로만 유지되어야 한다.
tmpfs 옵션
docker run --rm --mount type=tmpfs,dst=/tmp --entrypoint mount alpine:latest -v
tmpfs 타입으로 마운트를 지정한 경우, tmpfs 디바이스를 생성하여 컨테이너에 /tmp 경로에 부착한다.
/tmp 경로 하에 생성된 파일은 메모리에만 쓰이고 디스크에는 쓰기가 이루어지지 않는다.
Docker volumes
도커 볼륨은 이름 있는 파일 시스템으로서 도커에 의해 관리된다.
docker volume create --driver local --label example=location location-example
docker volume inspect --format "{{json .Mountpoint}}" location-example
docker create ... {name}
-- driver : 볼륨을 생성할 때 사용할 plugin 이름을 지정한다.
-- label : 볼륨에 키-값에 해당하는 라벨을 지정한다. 볼륨 검색등에 사용된다.
location-example 이름의 도커 볼륨이 생성된다.
1. 도커 볼륨은 컨테이너 독립적인 데이터 관리에 사용.
컨테이너에 실행되는 어플리케이션(실행 파일)이 포함된 이미지가 있다면,
어플리케이션이 남기는 로그 데이터는 컨테이너 마다 공유되는 특정 파일에 기록되게 할 수 있다.
데이터 베이스와 데이터 베이스 데이터(원본 혹은 사본)는 분리 될 수 있다.
웹 서버와 정적 컨텐츠는 따로 관리 될 수 있다.
주로 컨테이너 간에 공유가 가능한 경우 이미지 독립적인 데이터를 볼륨을 통해 주입하거나 공유할 수 있도록 한다.
2. 데이터베이스 관리 (NoSQL 예제)
Apache Cassandra는 스케일 가능한 기능과 컬럼 단위 데이터베이스를 제공한다.
데이터 베이스와 데이터 (Volume)을 분리하여 특정 컨테이너, 카산드라 노드를 중지 한 이후 새로운 컨테이너를 생성하여
새로운 노드를 기존 데이터를 사용하면서 실행 가능하다.
이름있는 볼륨을 생성한다.
docker volume create --driver local --label example=cassandra cass-shared
카산드라DB 노드를 실행하고 관리 데이터 경로를 생성한 볼륨에 맵핑한다.
docker run -d --volume cass-shared:/var/lib/cassandra/data -name cass1 cassandra:2.2
데이터를 변경해본다.
docker run -it --rm --link cass1:cass cassandra:2.2 cqlsh cass
// on csqsh cli
create keyspace docker_hello_world
with replication = {
'class' = 'SimpleStrategy',
'replication_factor' : 1
};
기존 노드를 중지하고 새로운 노드를 실행한다.
docker stop cass1
docker rm- vf cass1
docker run -d --volume cass-shared:/var/lib/cassandra/data --name cass2 cassandra:2.2
변경 사항이 유지 되어 있는 상태를 확인 가능하다.
select *
from system.schema_keyspaces
where keyspace_name = 'docker_hello_world'
3. 마운트 지점 공유
두 컨테이너가 같은 볼륨에 같은 경로에서 참조해야하는 경우
로그 Writer : /var/logs 볼륨에 로그를 생성한다.
로그 Stream : /var/logs 볼륨에 쓰여진 로그를 참조하여 로그 스트림에 전송하여 검색에 활용한다.
4. 익명 볼륨과 volmes-from flag
컨테이너에 volume 타입을 마운트 하였으나 이름을 지정한 경우 컨테이너가 생성될 때 같이 생성되고 컨테이너가 삭제될 때 같이 삭제되는 익명 볼륨이 생성된다.
docker run --name node_a --mount type=volume,dst=/src/tech alpine:latest echo "node a created"
docker run --name node_b --mount type=volume,dst=/src/art \
--mount type=volume,dst=src/design alpine:latest echo "node b created"
docker run --name readers --volumes-from node_a --volumes-from node_b alpine:latest ls -l /src/
volumes-from flag를 사용하여 마운트를 공유할 컨테이너를 지정할 수 있다.
지정한 컨테이너가 가지는 모든 마운트 지점을 공유한다.
공유받는 마운트 지점의 dst 경로가 충돌할 경우, 모두 공유 받지 않고 하나만 공유 받는다.
볼륨 관리
생성과 삭제
컨테이너 실행 시 이름을 지정하지 않은 경우 도커가 생성하며 유일한 식별자를 부여한다. 컨테이너 삭제와 같이 삭제 된다.
이름을 지정하여 직접 생성한 경우, 컨테이너에 지정하였어도 컨테이너 삭제와 함께 같이 삭제되지 않는다.
이름있는 볼륨은 직접 docker remove 을 통해 삭제해야한다.
볼륨의 상태로 in use가 아닌 경우 (컨테이너에 사용되지 않는 경우)에만 볼륨을 삭제할 수 있는데,
docker volume prune (--filter label_key=label_value) 을 통해 일괄 정리 가능하다.
참고 : Docker In Action, 2nd Edition by Nickoloff Kuenzli
'Cloud > Docker' 카테고리의 다른 글
Docker In Action 6. Limiting risk with resource controls (1) | 2024.12.04 |
---|---|
Docker In Action 5. Single-host networking (0) | 2023.10.22 |
Docker In Action 3. Software Installation Simplified (0) | 2023.10.16 |
Docker In Action 2. 도커 컨테이너에 실행하기 (2) | 2023.10.15 |
Docker In Action 1. 도커 소개 (0) | 2023.10.15 |