반응형
Storage In Docker
기본적으로 Docker는 /var/lib/docker 하위에 모든 데이터를 보관한다
- aufs
- containers
- image
- volumes
Docker (OCI) Image는 Layered Architecture로 되어 있다.
- Dockerfile의 각 line은 기존 이미지 위에 새로운 layer를 생성한다.
FROM Ubuntu
RUN apt-get update && apt-get -y install python
RUN pip install flask flask-mysql
COPY . /opt/source-code
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
- Layer5: 엔트리포인트 변경 (0B)
- Layer4: 복사된 소스코드 (229B)
- Layer3: pip 패키지 설치 내역 (6.3MiB)
- Layer2: APT 업데이트 및 설치된 내역 (306MiB)
- Layer1: Ubuntu Base Image (120MiB)
만약 이것과 매우 비슷한 Dockerfile로 이미지를 빌드한다면 어떨까?
FROM Ubuntu
RUN apt-get update && apt-get -y install python
RUN pip install flask flask-mysql
COPY . /opt/source-code2
ENTRYPOINT FLASK_APP=/opt/source-code2/app.py flask run
이 경우 Layer 3까지는 위의 Dockerfile와 동일한 구조를 공유하므로, Docker는 3개의 Layer를 재사용한다.
docker run
을 해서 이렇게 만들어진 이미지를 구동하면, 그 위에 Container Layer를 새로 생성한다.
- 이미지 레이어와는 달리 R/W가 가능하지만, 이 레이어의 수명은 컨테이너의 수명을 따라간다.
- 하위에 있는 레이어는 R/O이다: 고정된 상태
- 그렇다고 컨테이너 실행 중에 하위 레이어에 있는 데이터를 수정할 수 없는 것은 아니다.
- 예를 들어 위의 케이스에서는 컨테이너 실행 중에
vi /opt/source-code/app.py
로 app.py의 내용을 바꿀 수 있다. - 하지만, 새로 만들어진 Container Layer에 수정된 app.py의 내용이 저장되는 것이지 실제로 이미지파일의 내용이 변하는 것은 아니다.
- Copy-on-write
- 예를 들어 위의 케이스에서는 컨테이너 실행 중에
- 그렇다고 컨테이너 실행 중에 하위 레이어에 있는 데이터를 수정할 수 없는 것은 아니다.
Persistant storage: Volume
예를 들어 MySQL image를 쓴다고 하면, docker volume create data_volume
으로 MySQL 서버 데이터를 저장할 volume을 만든 뒤, 컨테이너에 마운트하여 이 볼륨을 사용할 수 있다.
docker run -v data_volume:/var/lib/mysql mysql
/var/lib/docker/volumes/data_volume
에 저장- (Volume Mounting)
외부 volume은 꼭 /var/lib/docker/volumes
하위에 있지 않아도 된다.
docker run -v /data/mysql:/var/lib/mysql mysql
- (Bind Mounting)
주: -v
옵션은 deprecated되었다, --mount
명령이 권장됨
Storage Drivers
Layered Architecture의 유지, Writeable layer의 생성, Copy-and-Write를 위한 적절한 파일 이동 등등을 해 주는 친구를 Storage Driver라고 한다.
- AUFS (Ubuntu 기본값)
- Device Mapper
- ZFS
- BTRFS 등등...
Volume Drivers
Volume은 Storage Driver에 의해 처리되지 않는다
- Volume Driver가 따로 존재
- local
- Microsoft Azure File Storage
- gce-docker
- VMWare vSphere Storage...
반응형
'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글
204. Network Namespaces (0) | 2024.05.17 |
---|---|
189-191. Persistent Volumes, Persistent Volume Claims and Using PVCs in Pods (0) | 2024.05.17 |
177-178. Kubernetes Network Policy (0) | 2024.05.17 |
170-174. Image Security, Security Contexts (0) | 2024.05.17 |
167. Service Accounts (0) | 2024.05.17 |