[Docker] Container Storage(이론)

99winnmin·2023년 2월 3일
0

Docker

목록 보기
13/16

1. 컨테이너 볼륨이란?

2. 데이터 보존하는 법

3. 컨테이너간 데이터 공유

컨테이너 볼륨이란?

  • 컨테이너 이미지는 readonly
  • 이미지를 컨테이너로 프로세스화해도 ro 속성
  • 컨테이너에 추가되는 데이터들은 별도의 RW(read-write) 레이어에 저장
  • 그렇다면 readonly Layer와 Read-Write Layer가 어떻게 하나인 것처럼 보이는가? Union File System(Overlay) 덕분!!

UFS(Union File System) 이란?

UFS는 여러 개의 파일 시스템을 하나의 파일 시스템에 마운트 하는 기능. 여러 파일 시스템을 하나로 합치다보면 중복되는 파일이 생기기 마련인데, UFS는 나중에 마운트된 파일로 덮어씀 -> overlay. 도커 이미지에서 레이어는 개념적으로 각각의 파일시스템을 겹쳐 놓은 형태와 유사함

UFS in Docker

앞에서 말한 것과 같이 컨테이너는 UFS를 기반으로 동작함. 도커의 이미지와 컨테이너의 관계는 일반적으로 바이너리 프로그램과 프로세스의 관계와 유사, 하나의 바이너리 프로그램에서 여러 개의 프로세스가 독립적으로 실행될 수 있듯이, 하나의 이미지로 여러 컨테이너를 독립적으로 실행할 수 있음

But! 하나의 이미지에서 생성된 컨테이너들이 동일한 파일 시스템을 공유하고 있다면 어떻게 컨테이너가 독립적으로 실행될 수 있을까? UFS의 CoW(Copy on Write)정책 덕분!

UFS에서는 기존 레이어(하위 레이어) 위에 새로운 레이어(상위 레이어)가 쌓일 경우, 하위 레이어는 읽기 전용 상태가 된다. 또한, 상위 레이어에서 하위 레이어에 쓰기 작업을 수행할 경우, 하위 레이어를 복사하여 사용(CoW)하기 때문에 상위 레이어에서는 하위 레이어에 영향을 끼치지 않음!!

Docker에서는 레이어가 크게 컨테이너 레이어(상위)와 이미지 레이어(하위)로 구분됨. UFS 특성에 따라서 컨테이너가 파일 시스템에 쓰기 작업을 수행할 경우, 실질적으로는 하위 레이어의 복사본에 해당 작업을 수행하기 때문에 서로 다른 컨테이너가 하위 레이어를 공유하고 있어도 서로 독립적인 파일 시스템 운용이 가능함!!!
⭐추가적으로 Docker에서 관리되는 모든 레이어와 관련된 정보는 host의 file system 내의 /var/lib/docker 폴더에 저장됨 -> docker area / Backing Filesystem이라고 부름

컨테이너가 만들어주는 데이터를 영구보존하는 법

docker host에 따로 저장소 disk를 만들어서 data를 저장하면됨!
$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=pass mysql:latest : 컨테이너 volume mount 하는 법

  • volume 옵션 사용
    -v <host path>:<container mount path> : 컨테이너가 docker host disk에 저장하게함
    ex) docker run -d -v /dbdata:/var/lib/mysql -e MYSQL_PASSWORD=pass mysql:latest -> 그러나 이 경우 컨테이너가 공격당할 경우 docker host disk 까지 공격당하게 됨
    -v <host path>:<container mount path>:<read write mode>
    ex) docker run -d -v /webdata:/var/www/html:ro httpd:latest -> docker host에 있는 웹페이지들이 readonly로 서비스됨(아파치 서버가 docker host의 data를 수정할 수 없게하면서 서비스하도록 mount하는 것, :ro가 생략되면 rw모드임)
    -v <container mount path>
    ex) docker run -d -v /var/lib/mysql -e MYSQL_PASSWORD=pass mysql:latest -> docker host file system 내에 임의의 디렉터리를 만들어서 data를 저장하도록 함

컨테이너간 데이터 공유

$ docker run -v /webdata:/webdata -d --name df smlinux/df:latest
$ docker run -d -v /webdata:/usr/share/nginx/html:ro -d ubuntu:latest
컨테이너 간 데이터 공유 flow

profile
功在不舍

0개의 댓글

관련 채용 정보