Search

[CKA] 53. Storage in Docker

Date
2025/01/24
Category
Devops
Tag
Kubernetes
CKA
Storage
๋ชฉ์ฐจ

ย Introduction

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด, ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ถ€ํ„ฐ ์ดํ•ดํ•˜๋Š” ํŽธ์ด ๋น ๋ฅด๋‹ค.
Docker์—์„œ์˜ ์Šคํ† ๋ฆฌ์ง€ ๋™์ž‘์„ ์ดํ•ดํ•˜๋ฉด Kubernetes์˜ PV/PVC ๊ฐœ๋…๋„ ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ € Docker์˜ ์Šคํ† ๋ฆฌ์ง€ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ๋‹ค.

ย Storage Driver

Layered Architecture ์œ ์ง€, ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์–ด ์ƒ์„ฑ, Copy-on-Write ๋™์ž‘(๋ณต์‚ฌ/์“ฐ๊ธฐ) ์ฒ˜๋ฆฌ ๋“ฑ์€ Storage Driver๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค. Docker๋Š” Storage Driver๋ฅผ ํ†ตํ•ด ๊ณ„์ธตํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

ย Drivers

์ผ๋ฐ˜์ ์ธ Storage Driver๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
โ€ข
AUFS
โ€ข
ZFS
โ€ข
BTRFS
โ€ข
Device Mapper
โ€ข
Overlay
โ€ข
Overlay2
Docker๋Š” ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ์ ์˜ ์Šคํ† ๋ฆฌ์ง€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜์ง€๋งŒ, ๊ฐ Storage Driver๋งˆ๋‹ค ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ํŠน์„ฑ์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์กฐ์ง์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ย File System

๋„์ปค(Docker)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€/์ปจํ…Œ์ด๋„ˆ/๋ณผ๋ฅจ๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Docker data-root ์•„๋ž˜์— ์ €์žฅํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” /var/lib/docker์ด๋‹ค(ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ).
์ด ํด๋”๋Š” ๋„์ปค๊ฐ€ โ€œ๋ฐ์ดํ„ฐโ€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋ฉฐ, containers, image, volumes ๋“ฑ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ž€ Docker Host์—์„œ ์‹คํ–‰๋˜๋Š” ์ด๋ฏธ์ง€ ๋ฐ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค.

ย Layered Architecture

๋„์ปค๋Š” ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ์„ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋กœ ์ €์žฅํ•œ๋‹ค.

ย Image Layer

๋„์ปค๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋ ˆ์ด์–ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Dockerfile์˜ ๊ฐ ๋ช…๋ น์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ฐธ๊ณ : Container & Image
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 fun
Docker
๋ณต์‚ฌ
โ€ข
Layer 1 - ๊ธฐ๋ณธ Ubuntu ์šด์˜ ์ฒด์ œ
โ€ข
Layer2 - apt ํŒจํ‚ค์ง€ ์„ค์น˜
โ€ข
Layer3 - python ํŒจํ‚ค์ง€ ์„ค์น˜
โ€ข
Layer4 - ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ
โ€ข
Layer5 - ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ์—…๋ฐ์ดํŠธ
๊ฐ ๋ ˆ์ด์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด ๋Œ€๋น„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์ €์žฅํ•œ๋‹ค. ์ด ๊ตฌ์กฐ ๋•์— ์ด๋ฏธ์ง€ ์บ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์ „์ฒด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

ย Container Layer

์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋Š” docker build ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ(read-only)์ด๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒˆ๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•œ๋‹ค.
์ด ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ docker run์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ๋„์ปค๋Š” ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด ์œ„์— ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ(writable) ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
ํ•ด๋‹น ์“ฐ๊ธฐ ๊ฐ€๋Šฅ ๋ ˆ์ด์–ด๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด(Container Layer)๋ผ๊ณ  ํ•˜์ž. ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋งŒ ๊ฐ–๋Š” ๋ ˆ์ด์–ด๋กœ, ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—๋งŒ ์ ์šฉ๋˜๋ฉฐ, ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋Š” ์œ ์ง€๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

ย Copy-On-Write Mechanism

์ฝ๊ธฐ ์ „์šฉ์ธ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฐ€?
๋„์ปค๋Š” ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด์˜ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด๋กœ ๋ณต์‚ฌํ•˜๊ณ  ๊ทธ ๋ณต์‚ฌ๋ณธ์„ ์ˆ˜์ •ํ•œ๋‹ค. ์ด ๋™์ž‘์„ Copy-on-Write๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ์ด๋ฏธ์ง€ ์ž์ฒด๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ , ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ๋งŒ ๋ณ€ํ™”๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ย Volume Drivers

๋ณผ๋ฅจ์€ Storage Driver๊ฐ€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  Volume Driver Plugin์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๊ธฐ๋ณธ ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋กœ์ปฌ์ด๋‹ค. ์จ๋“œ ํŒŒํ‹ฐ ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ๋‹ค์–‘ํ•˜๊ฒŒ ์žˆ์œผ๋ฉฐ ๊ทธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
โ€ข
Azure File Storage
โ€ข
Convoy
โ€ข
DigitalOcean Block Storage
โ€ข
Flocker
โ€ข
gce-docker
โ€ข
GlusterFS
โ€ข
NetApp
โ€ข
RexRay
โ€ข
Portworx
โ€ข
VMware vSphere Storage

ย Volumes

์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์žฌ์ƒ์„ฑํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด์˜ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
๋ฐ์ดํ„ฐ ์˜์†์„ฑ์„ ์œ„ํ•ด ๋ณผ๋ฅจ(Volume)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณผ๋ฅจ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Create Volume

# docker volume create <volume_name> docker volume create data_volume
Bash
๋ณต์‚ฌ
๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๋ฉด Docker data-root ํ•˜์œ„(์ผ๋ฐ˜์ ์œผ๋กœ /var/lib/docker/volumes)์— ๋ณผ๋ฅจ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

Volume Mounting

# docker run -v <volume_name>:<container_path_for_mount> <image_name> docker run -v data_volume:/var/lib/mysql mysql
Bash
๋ณต์‚ฌ
๋„์ปค๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” named volume์„ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Bind Mounting

# docker run -v <volume_path>:<container_path_for_mount> <image_name> docker run -v /data/mysql:/var/lib/mysql mysql # docker run --mount type=bind,source=<host_path>,target=<container_path_for_mount> <image_name> docker run --mount type=bind,source=/data/mysql,target=/var/lib/mysql mysql
Bash
๋ณต์‚ฌ
Docker์˜ ๊ธฐ๋ณธ ๋ณผ๋ฅจ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰, ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋งˆ์šดํŠธ๋œ๋‹ค.

ย Storage Provider

๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์–‘ํ•œ Storage Provider๋ฅผ ์ง€์›ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, RexRay ์Šคํ† ๋ฆฌ์ง€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AWS EBS, S3๋‚˜ Google Persistent Disk ๋˜๋Š” OpenStack Cinder๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•  ์ˆ˜ ์žˆ๋‹ค.
Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ rexray/ebs์™€ ๊ฐ™์€ ํŠน์ • ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AWS EBS์—์„œ ๋ณผ๋ฅจ์„ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
docker run -it \ --name mysql --volume-driver rexray/ebs --mount src=ebs-vol,target=/var/lib/mysql mysql
Bash
๋ณต์‚ฌ