๐ก ๋ณธ ๋ฌธ์๋ 'Docker ํ์ผ ์์คํ , ์คํ ๋ฆฌ์ง'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
๋์ปค์ ์ด๋ฏธ์ง ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋๋์ง ์๊ณ , ์ด๋ฏธ์ง๋ฅผ ๊ณต์ ํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์์ ๋ ์ปจํ ์ด๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ณผ์ ์ ๋ํด ์ ๋ฆฌํด๋์์ผ๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
1. Docker File System
1.1 Image/Container์ Layer Structure
1.1.1 Image
๋์ปค ์ด๋ฏธ์ง๋ Dockerfile ๋ก ๋ง๋ค์ด์ง ์ฌ๋ฌ ๋ ์ด์ด๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ๊ฐ ๋ ์ด์ด๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅ(Read-only)ํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ฉด ์ฝ๊ณ ์ธ ์ ์๋(Readable and Writable) ๋ ์ด์ด๊ฐ ์ถ๊ฐ๋๋๋ฐ ์ด๋ฅผ ์ปจํ ์ด๋ ๋ ์ด์ด(Container Layer)๋ผ๊ณ ํฉ๋๋ค. ์ปจํ ์ด๋๋ฅผ ๊ฐ์ง๊ณ ์์ ์ ์ํํ ๋ ์๊ธฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ ์ปจํ ์ด๋ ๋ ์ด์ด์ ์ ์ฅํ๊ณ ์ฝ์ ๋๋ ๋์ปค ์ด๋ฏธ์ง์ ๋ณ๊ฒฝ๋ ์ฌํญ์ ์กฐํฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ปจํ ์ด๋๊ฐ ์ญ์ ๋๋ฉด ์ปจํ ์ด๋ ๋ ์ด์ด๋ ์ฌ๋ผ์ง์ง๋ง, ๊ธฐ์กด ์ด๋ฏธ์ง๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ์ง๋ฉ๋๋ค.
1.1.2 Container
๋ฐ๋ผ์ ํ๋์ ์ด๋ฏธ์ง์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ปจํ ์ด๋๊ฐ ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ๋ค๋ฉด ๋์ปค ๋ณผ๋ฅจ์ ์ ์ฅํ๊ณ ์ปจํ ์ด๋์ ๋ง์ดํธํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋์ ๋๋ ํฐ๋ฆฌ์ ์ฌ๋ฌ ๊ฐ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธํจ์ผ๋ก์จ ๋ง์น ํ๋์ ํตํฉ๋ ๋๋ ํฐ๋ฆฌ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ Union Mount๋ผ ํฉ๋๋ค. ์ด๋ ๊ฒ Union Mount๊ฐ ๊ฐ๋ฅํ ์์คํ ์ Union File System์ด๋ผ ํ๋ฉฐ, storage driver๋ค์ด ์ ๋ง๋ค ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํธ๋ค๋งํฉ๋๋ค.
๋์ปค๋ Copy-on-Write(CoW or COW) ๋ฐฉ์์ผ๋ก ํ์ผ์ ๊ด๋ฆฌํฉ๋๋ค. Copy-on-Write ๋ ํจ์จ์ ์ผ๋ก ํ์ผ์ ๊ณต์ ํ๊ณ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฝ๊ธฐ๋ง ํ ๋ ๊ธฐ์กด ํ์ผ์ ์ฐธ์กฐํ๋๋ก ํ๊ณ , ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง copy_up operation์ ํตํด ์ฐพ์ ํ์ผ์ ์ปจํ ์ด๋ ๋ ์ด์ด๋ก ๋ณต์ฌํด์ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ณต์ฌ๊ฐ ๋๋ฏ๋ก ๋ฐ์ดํฐ ์ค๋ณต์ด ์๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
2. Docker Storage
2.1 Docker Storage Drivers
๋์ปค๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ ์ด์ด์ ํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ(Storage Driver)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ํ ์ข ๋ฅ์ ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ํ๋๋ฐ ์๋ํ๋ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ์ฉ ๋ค๋ฆ ๋๋ค. ๋ฆฌ๋ ์ค ๋ฐฐํฌํ ์ปค๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ฐ ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ์ ๋ํ ์์ธํ ์ค๋ช ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ฆฌ๋ ์ค ๋ฐฐํฌํ | ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ |
Ubuntu | aufs, devicemapper, overlay2(Ubuntu 14.04.4 or later, 16.04 or later), overlay, zfs, vfs |
Debian | aufs, devicemapper, overlay2(Debian Stretch), overlay, vfs |
CentOS | devicemapper, vfs |
Fedora | devicemapper, overlay2(Fedora 26 or later, experimental), overlay(experimental), vfs |
2.2 AUFS (Advanced Multi Layered Unification Filesystem)
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ธ๊ธํ COW ์ค๋ช ๊ณผ ๋์ผํ๊ฒ ์๋ํ๋ฉฐ ์๋์ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค.
- copy_up์ ํตํด container layer๋ก ๋ณต์ฌํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ธ ๊ฒฝ์ฐ, “opaque file”์ด ๋ง๋ค์ด์ ธ์ image layer์ ๋๋ ํฐ๋ฆฌ์ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค.
- renaming directory์ ๊ฒฝ์ฐ, ์์ํ๊ฒ rename์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ผ๋ฉฐ, EXDEV(“cross-device link not permitted”)๋ฅผ ๋ฐํํฉ๋๋ค.
- ์คํผ๋ ์ด์ ์ “copy and unlink”๋ฅผ ํตํ ์ ์ฌ renaming์ผ๋ก fall backํฉ๋๋ค.
2.3 OverlayFS
์ด๋ฏธ์ง์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ layer๊ฐ ์คํ์ ์ด๋ฃจ๋ AUFS์๋ ๋ฌ๋ฆฌ, Image layer์ Container layer ์ด๋ ๊ฒ ๋จ 2๊ฐ์ layer๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค. Image layer๋ฅผ lowerdir, Container layer๋ฅผ upperdir, ๋์ ํฉ์ณ์ ๋ณด์ฌ์ฃผ๋ Container mount๋ฅผ merged directory๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
2.3.1 overlay
- Multi-Layer Image ๊ตฌ์ฑ์ด ๋ถ๊ฐํ์ง๋ง, ๊ฐ image layer๋ง๋ค /var/lib/docker/overlay ๋๋ ํฐ๋ฆฌ ๋ฐ์ ์์ ๋ง์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ , ํ๋๋งํฌ๋ฅผ ํตํด ํด๊ฒฐํฉ๋๋ค. ์ฆ, ๊ฐ ์ด๋ฏธ์ง ๋ ์ด์ด๋ง๋ค ํด๋น ๋ ์ด์ด ์ด์ ์ ํ์ผ์ ๋ชจ๋ ํฌํจํ๋ฉฐ lowerdir๋ ์ต์์ ์ด๋ฏธ์ง ๋ ์ด์ด๋ฅผ ๊ฐ๋ฅดํต๋๋ค.
- ๋จ์ ์ overlay๊ฐ ์ฌ์ฉํ ํ๋๋งํฌ ์์ฒด๊ฐ inode๋ฅผ ๋ง๋ค์ด๋ด์ง ์์ง๋ง, ์ด๋ฏธ์ง๊ฐ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ character device๋ฅผ ํฌํจํ๋ค๋ฉด ๋ ๋ง์ inode๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค(inode exhaustion).
2.3.2 overlay2
- ํ๋๋งํฌ ๋์ aufs์ฒ๋ผ overlay layer์ ์๋ฅผ ๋๋ฆฌ๊ณ ํ์ ๋ ์ด์ด์์ diff๋ง ๋ํ๋ ๋๋ค.
- ์ด๋ ๊ฒ๋ง ๋ณด๋ฉด aufs๋ ๋น์ทํ๋ฐ, aufs๋ณด๋ค cache์ ํจ์จ์ด ์ข์์ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
2.4 BTRFS (B-tree File System)
์ปจํ ์ด๋์ฉ ํ์ผ์์คํ ๋ก ์ฃผ๋ชฉ๋ฐ๋๋ค๊ธฐ๋ณด๋ค, Ext, ZFS, XFS ๋ฑ์ backing filesystem๋ก ๋ ์ค๋ฅด๊ณ ์์ต๋๋ค.
3. Docker Volume: ๋ฐ์ดํฐ ๋ณผ๋ฅจ ๊ด๋ฆฌ
๋์ปค ์ปจํ ์ด๋ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋์คํฌ์ persisent ๋ฐ์ดํฐ๋ก ๋จ๊ธฐ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ผ๋ก, ์ปจํ ์ด๋์ ํธ์คํธ ์ฌ์ด์ ๋๋ ํฐ๋ฆฌ ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ์์ ํ๊ณ ์๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํด๋ ๊ฐ์ ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ์ปจํ ์ด๋๋ฅผ ํ๊ธฐํด๋ ๋์คํฌ์ ๊ทธ๋๋ก ๋จ์ผ๋ฏ๋ก ์ปจํ ์ด๋๋ก ์ํ๋ฅผ ๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์ปจํ ์ด๋๋ค ๊ฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ํธ์คํธ์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์๋๊ธฐ์, ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ์ปจํ ์ด๋๊ฐ ์ญ์ ๋๋ ๊ณ์ ์ ์ง๋ฉ๋๋ค.
3.1 ๋ค์ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ
๋์ปค๋ ์ปจํ ์ด๋์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ํธ์คํธ ๋ด์ ์ ์ฅํ๊ธฐ ์ํด ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
3.1.1 Volumes
ํธ์คํธ์ ํ์ผ ์์คํ ๋ด์ ํน์ ์์ญ(๋ฆฌ๋ ์ค์ ๊ฒฝ์ฐ /var/lib/docker/volumes/)์ ๋์ปค๊ฐ ๊ด๋ฆฌํ๋ฉด์ ์ฌ์ฉ. ๋์ปค๊ฐ ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์์๋ ํด๋น ์์ญ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ. ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ์.
3.1.2 Bind mounts
ํธ์คํธ์ ํ์ผ์์คํ ์์ฒด๋ฅผ ์ฌ์ฉ. ์ค์ํ ์์คํ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ ์ ๊ทผ ๊ฐ๋ฅ. ํธ์คํธ์ ์ปจํ ์ด๋๊ฐ ์ค์ ํ์ผ์ ๊ณต์ ํ๊ฑฐ๋ ํธ์คํธ์์ ๊ฐ๋ฐํ๊ณ ์ปจํ ์ด๋๋ก ๋ฐฐํฌํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ.
3.1.3 tmpfs mounts
ํธ์คํธ์ ํ์ผ์์คํ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์. ํ์ผ ์์คํ ์ ์ ์ฅํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ.
- non-persistent state data๋ฅผ ๋ค๋ฃฐ ๋๋ tmpfs mount๊ฐ ๊ฐ์ฅ ์ข๋ค๊ณ ๊ณต์ ๋ฌธ์์๋ ์ ํ์์
์ฐธ๊ณ
- [Docker Official Docs] Storage Drivers: https://docs.docker.com/storage/storagedriver/
- [Blog] ๋์ปค Docker ๊ธฐ์ด ํ์คํ ๋ค์ง๊ธฐ: https://futurecreator.github.io/2018/11/16/docker-container-basics/
- [Blog] ๋์ปค ์ ๋ฆฌ: https://rokrokss.com/post/2019/10/17/%EB%8F%84%EC%BB%A4-Docker-%EC%A0%95%EB%A6%AC.html