๋ชฉ์ฐจ
ย 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์ ๊ฐ ๋ช
๋ น์ด๋ ์ด์ ๋ ์ด์ด์ ๋ณ๊ฒฝ ์ฌํญ๋ง ํฌํจํ์ฌ ์๋ก์ด ๋ ์ด์ด๋ฅผ ์์ฑํ๋ค.
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
๋ณต์ฌ
