Study: DeveloperTools(DevTool)/DevTool: Container

[Docker] ๋„์ปค ํŒŒ์ผ ์‹œ์Šคํ…œ, ์Šคํ† ๋ฆฌ์ง€ ์ •๋ฆฌ (feat. docker volume)

DrawingProcess 2022. 12. 12. 00:46
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” 'Docker ํŒŒ์ผ ์‹œ์Šคํ…œ, ์Šคํ† ๋ฆฌ์ง€'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
๋„์ปค์˜ ์ด๋ฏธ์ง€ ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์•Œ๊ณ , ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์•˜์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1. Docker File System

1.1 Image/Container์˜ Layer Structure

1.1.1 Image 

https://docs.docker.com/storage/storagedriver/

๋„์ปค ์ด๋ฏธ์ง€๋Š” Dockerfile ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  ๊ฐ ๋ ˆ์ด์–ด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ(Read-only)ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š”(Readable and Writable) ๋ ˆ์ด์–ด๊ฐ€ ์ถ”๊ฐ€๋˜๋Š”๋ฐ ์ด๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด(Container Layer)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด์— ์ €์žฅํ•˜๊ณ  ์ฝ์„ ๋•Œ๋Š” ๋„์ปค ์ด๋ฏธ์ง€์— ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ์กฐํ•ฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด๋Š” ์‚ฌ๋ผ์ง€์ง€๋งŒ, ๊ธฐ์กด ์ด๋ฏธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

1.1.2 Container

https://docs.docker.com/storage/storagedriver/#container-and-layers

๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€์—์„œ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋„์ปค ๋ณผ๋ฅจ์— ์ €์žฅํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธํ•จ์œผ๋กœ์จ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ 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 ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŠธ ๋‚ด์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

https://docs.docker.com/storage/#choose-the-right-type-of-mount

3.1.1 Volumes

ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‚ด์— ํŠน์ • ์˜์—ญ(๋ฆฌ๋ˆ…์Šค์˜ ๊ฒฝ์šฐ /var/lib/docker/volumes/)์„ ๋„์ปค๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์‚ฌ์šฉ. ๋„์ปค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ํ•ด๋‹น ์˜์—ญ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ. ๊ฐ€์žฅ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ์‹.

3.1.2 Bind mounts

ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ ์ž์ฒด๋ฅผ ์‚ฌ์šฉ. ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ค์ • ํŒŒ์ผ์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ŠคํŠธ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ.

3.1.3 tmpfs mounts

ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹. ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ.

  • non-persistent state data๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” tmpfs mount๊ฐ€ ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ๊ณต์‹ ๋ฌธ์„œ์—๋„ ์ ํ˜€์žˆ์Œ

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•