Study: DeveloperTools(DevTool)/DevTool: Container

[Docker] ๋„์ปค ์ปจํ…Œ์ด๋„ˆ, ๊ฐ€์ƒํ™”, ๋‚ด๋ถ€๊ตฌ์กฐ (feat. VM vs Container)

DrawingProcess 2022. 11. 27. 12:28
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” 'Docker ์ปจํ…Œ์ด๋„ˆ, ๊ฐ€์ƒํ™”, ๋‚ด๋ถ€๊ตฌ์กฐ'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ Docker๊ฐ€ ์ƒ๊ฒจ๋‚œ ๋ฐฐ๊ฒฝ๋ถ€ํ„ฐ Docker์˜ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์ƒ์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ด๋‹ˆ ์ฐธ๊ณ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ

1.1 ๊ฐ€์ƒํ™” ๊ธฐ์ˆ : Virtual Machine, Hypervisor...

1.1.1 Virtual Machine(์ดํ•˜ VM)

๊ฐ€์ƒํ™” ๊ธฐ์ˆ  ๋ฐœ์ „ ์ด์ „์—๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ๊ตฌ๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— ํ•˜๋‚˜์˜ OS, ํ”„๋กœ๊ทธ๋žจ ๋งŒ์„ ์šด์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด์—ˆ์ง€๋งŒ, ๋‚จ๋Š” ์„œ๋ฒ„ ์ž์›์„ ๊ทธ๋Œ€๋กœ ๋ฐฉ์น˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋น„ํšจ์œจ์„ฑ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด '๊ฐ€์ƒํ™” ๊ธฐ์ˆ '์ด๋ฉฐ, ์ด๋Š” ๋ฌผ๋ฆฌ์ ์ธ ํ•˜๋“œ์›จ์–ด ์ž์›์„ ๋…ผ๋ฆฌ์ ์ธ ๋ฆฌ์†Œ์Šค๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ฐ ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ 'ํ•˜์ดํผ๋ฐ”์ด์ €' ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒํ™”๊ฐ€ ๋งŽ์ด ์ด์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ• ๋œ ๊ณต๊ฐ„์—์„œ VM ์ด๋ผ๋Š” ๋…๋ฆฝ๋œ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ VM ์— ๊น”๋ฆฐ ๊ฒŒ์ŠคํŠธ OS ๋ฅผ ๊ตฌ๋™ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค(ํ•˜์ดํผ๋ฐ”์ด์ €์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‹จ์˜ '1.2 hypervisor (์ดํ•˜ ํ•˜์ดํผ๋ฐ”์ด์ €)'๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.). ํ•˜์ดํผ๋ฐ”์ด์ €๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒํ™”๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ์„œ๋ฒ„์˜ OS ์œ„์— ํ•˜๋‚˜ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ๋…๋ฆฝ์ ์ธ ์šด์˜์ฒด์ œ๊ฐ€ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ํ•˜๋‚˜์˜ OS ๋งŒ ๋Œ๋ฆด ๋•Œ ๋ณด๋‹ค ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„์˜ ์ž์›์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ๊ฐ์˜ OS ๋“ค์„ ์œ„ํ•ด ๋งค๋ฒˆ ์ž์›์„ ํ• ๋‹นํ•˜๊ณ  ๋ถ€ํŒ…์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ฐ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ํฝ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด VM์€ some level of hardware์™€ kernel virtualization ์„ ํ†ตํ•ด guest os๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜์ดํผ๋ฐ”์ด์ ธ ๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์กด์žฌํ•˜์—ฌ virtualized hw, virtual network interface, virtual cpu ๋“ฑ์„ ์ œ๊ณตํ•˜์—ฌ VM์„ ๊ตฌํ˜„์‹œ์ผฐ๊ณ , VM์€ guest kernel์„ ๊ฐ€์ ธ์„œ ๋งŒ๋“ค์–ด์ง„ virtual hw์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€์ƒํ™”ํ•ด์•ผํ•  ํŒŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ cost๊ฐ€ ํฝ๋‹ˆ๋‹ค. ์œ„ ๋‚˜์—ดํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์ฒ˜๋Ÿผ ํ•œ ๋จธ์‹ ์— isolated group์ด ๋งŽ์€๋ฐ, ์ด๋ฅผ ๋˜ ๋‚˜๋ˆ ์„œ VM์„ ๋งŒ๋“œ๋Š” HW virtualization์ด ํ•„์š”ํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

1.1.2 Hypervisor (์ดํ•˜ ํ•˜์ดํผ๋ฐ”์ด์ €)

๊ฐ€์ƒ ๋จธ์‹  ๋ชจ๋‹ˆํ„ฐ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ํ•˜์ดํผ๋ฐ”์ด์ € ์šด์˜ ์ฒด์ œ์™€ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•˜์ดํผ๋ฐ”์ด์ €์—๋Š” ๋‘๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์œผ๋ฉฐ, Type-1๊ณผ Type-2 ํ•˜์ดํผ๋ฐ”์ด์ €๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

TYPE-1 ํ•˜์ดํผ๋ฐ”์ด์ € (Bare Metal)

๋„ค์ดํ‹ฐ๋ธŒ, ๋ฒ ์–ด ๋ฉ”ํƒˆ ๋˜๋Š” microkernelized ํ•˜์ดํผ๋ฐ”์ด์ €๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” Type-1 ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ํ˜ธ์ŠคํŠธ์˜ H/W์—์„œ ์ง์ ‘ ๊ตฌ๋™๋˜์–ด ๊ฒŒ์ŠคํŠธ OS๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์šด์˜ ์ฒด์ œ ๋Œ€์‹  VM ๋ฆฌ์†Œ์Šค๋Š” ํ•˜์ดํผ๋ฐ”์ด์ €์— ์˜ํ•ด H/W์— ์ง์ ‘ ์˜ˆ์•ฝ๋˜๊ธฐ์— Type-2์— ๋น„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Type-1 ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • e.g. KVM, Microsoft Hyper-V, Citrix XenServer, VMware vSphere
    • KVM์€ 2007๋…„์— Linux ์ปค๋„๋กœ ํ†ตํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ˜„๋Œ€์ ์ธ ๋ฒ„์ „์˜ Linux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ KVM ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
  • ์ถ”๊ฐ€์ ์œผ๋กœ Type-1 Hypervisor๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ๊ฒŒ์ŠคํŠธOS์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋А๋ƒ๋กœ ์ „๊ฐ€์ƒํ™”, ๋ฐ˜๊ฐ€์ƒํ™” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

TYPE-2 ํ•˜์ดํผ๋ฐ”์ด์ € (Hosted)

ํ˜ธ์ŠคํŠธ ๋˜๋Š” monolithic ํ•˜์ดํผ๋ฐ”์ด์ €๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” Type-2 ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ๊ธฐ์กด์˜ ์šด์˜ ์ฒด์ œ์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ด์–ด ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ์„œ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ OS์—์„œ ๊ฒŒ์ŠคํŠธ OS๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. VM ๋ฆฌ์†Œ์Šค๋Š” ํ˜ธ์ŠคํŠธ OS์— ๋”ฐ๋ผ ์˜ˆ์•ฝ๋œ ํ›„ ํ•˜๋“œ์›จ์–ด์— ๋Œ€ํ•ด ์‹คํ–‰๋˜๊ธฐ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Type-2 ํ•˜์ดํผ๋ฐ”์ด์ €๋Š” ๊ฐœ์ธ ์ปดํ“จํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์šด์˜ ์ฒด์ œ๋ฅผ ๊ตฌ๋™ํ•˜๋ ค๋Š” ๊ฐœ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. 

  • e.g. VMware Workstation, MS Virtual Server, Oracle VirtualBox

1.1.3 ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์˜ ํŠน์ง• ๋ฐ ์žฅ์ 

์œ„์™€ ๊ฐ™์ด ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์€ ์ž์›์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ’€์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ€์ƒํ™”๋œ CPU, ๋ฉ”๋ชจ๋ฆฌ, ์Šคํ† ๋ฆฌ์ง€, ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ์˜ ํ• ๋‹น๋œ ์ž์›์„ ๊ฐ ๊ฐ€์ƒ ๋จธ์‹ ์— ์ œ๊ณตํ•˜๊ณ , ์‹ค์ œ ์ž์›์— ๋Œ€ํ•œ VM ์ž์›์˜ ์ผ์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ํ•˜๋“œ์›จ์–ด๋Š” ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์‹คํ–‰ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ํ•˜์ดํผ๋ฐ”์ด์ €๊ฐ€ VM ์˜ ์ž‘์—… ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ VM ์˜ ์ž‘์—…์„ ์š”์ฒญํ•˜๋ฉด CPU ๊ฐ€ VM ์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ CPU ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ดํผ๋ฐ”์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋‹ค๋ฅธ OS ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ OS ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ๊ฐ€์ƒํ™” ํ•˜๋“œ์›จ์–ด ์ž์›๊ณผ ํ•˜์ดํผ๋ฐ”์ด์ €๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒƒ์ด ๊ฐ€์ƒํ™”์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

1.1.4 ๊ฐ€์ƒํ™”์˜ ๋‹จ์ 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ง„ '๊ฐ€์ƒํ™”' ๊ธฐ์ˆ ๋„ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, OS level์กฐ์ฐจ๋„ ๊ฐ€์ƒํ™”ํ•ด์•ผ ํ•  ํŒŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ cost๊ฐ€ ํฌ๋‹ค๊ณ  ๋А๊ปด์งˆ ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. 
  • ๋˜ํ•œ VM ๋งˆ๋‹ค ๊ณ ์œ ํ•œ OS(๊ฒŒ์ŠคํŠธ OS)๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ๊ฐ CPU, RAM ๋ฐ ๊ธฐํƒ€ ๋ฆฌ์†Œ์Šค ๋“ฑ ๋ณ„๋„์˜ ์ž์›๋ฅผ ์†Œ๋น„ํ•˜๋ฉฐ ๋ณด๋‹ค ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์œ„์™€ ์—ฐ์žฅ์„ ์œผ๋กœ ์™„์ „ํ•œ ์šด์˜์ฒด์ œ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํ–‰ ์ž์ฒด๋งŒ์œผ๋กœ๋„ ๋Œ€๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฝ์šฐ ์ „ํ™˜์ด ๋งค์šฐ ๋น ๋ฅด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ sleep์ƒํƒœ๋กœ ์žˆ๊ธฐ์—, ์—ฌ๋Ÿฌ ๊ฐœ์˜ VM๋“ค์ด CPU๋ฅผ ๊ฒฝ์Ÿํ•ด๋„ ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” CPU ๋งŒํผ ๋น ๋ฅด๊ฒŒ ์ „ํ™˜(์ž์› ํšŒ์ˆ˜) ํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ์— ๋Œ€๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒํ™”๋ฅผ ํ•  ๋•Œ, ์ ์ • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ, ํŠน์ • OS๋Š” ๋ผ์ด์„ผ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด ๊ฒฝ์šฐ์—๋Š” Host OS ์œ„์—์„œ ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‹จ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1.2 ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ : Container

์ปจํ…Œ์ด๋„ˆ์™€ VM ๋ชจ๋‘ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๊ฒฉ๋ฆฌ๋˜์–ด ์‹คํ–‰๋˜๊ธฐ์— ํ•˜์ด๋ ˆ๋ฒจ์—์„œ๋Š” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋กœ์šฐ๋ ˆ๋ฒจ์—์„œ๋Š” ๊ฒŒ์ŠคํŠธ OS ์˜ ์กด์žฌ ์œ ๋ฌด๋กœ ์ธํ•ด ํ™•์žฅ์„ฑ๊ณผ ์ด์‹์„ฑ, ์ž์› ํšจ์œจ์„ฑ ๋“ฑ์— ์ฐจ์ด๊ฐ€ ์žˆ์–ด ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1.2.1 ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์˜ ํŠน์ง• ๋ฐ ์žฅ์ 

์œ„์˜ VM ๋ชจ๋ธ์˜ ๋‹จ์ ๋“ค๋กœ ์ธํ•ด ๊ตฌ๊ธ€๊ณผ ๊ฐ™์€ ๋Œ€ํ˜• ํšŒ์‚ฌ๋“ค์€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋ชจ๋ธ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” VM๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ์ปจํ…Œ์ด๋„ˆ์— ์ž์ฒด์ ์ธ ํ•˜๋‚˜์˜ ์™„์ „ํ•œ OSfull-blown OS ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋ธ์—์„œ๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ์˜ OS๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CPU, RAM ๋ฐ ์Šคํ† ๋ฆฌ์ง€์™€ ๊ฐ™์€ ๋ง‰๋Œ€ํ•œ ์–‘์˜ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ™•๋ณด๋œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ผ์ด์„ผ์Šค ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๊ณ  OS ํŒจ์น˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์ฃผ๋ฉฐ VM์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด VM์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ ์‹œ๊ฐ„์ด๋‚˜ ๋ฆฌ์†Œ์Šค ๋ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๊ฒฝ์šฐ ๋ถ€ํŒ… ์ค€๋น„ํ•˜๋Š” ๊ฒƒ๋งŒ ํ•ด๋„ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ, ์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์„ ์œ„ํ•œ ํŒจํ‚ค์ง€(์ด๋ฏธ์ง€)๋งŒ ์žˆ์œผ๋ฉด ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋…ธํŠธ๋ถ์—์„œ ํด๋ผ์šฐ๋“œ๋กœ, ํ˜น์€ ๋ฒ ์–ด๋ฉ”ํƒˆ ์„œ๋ฒ„๋กœ ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ๋™ ์ž์ฒด๋„ ์ผ๋ฐ˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ์—†์œผ๋ฉฐ, ms ๋‹จ์œ„๋กœ ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

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

1.2.2 ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์˜ ๋‹จ์ 

์ด๋ ‡๊ฒŒ ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ง„ '์ปจํ…Œ์ด๋„ˆ' ๊ธฐ์ˆ ๋„ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž์›์˜ ๊ฒฉ๋ฆฌ์™€ ์ œํ•œ์ด ์–ด๋ ต๋‹ค. cgroup์™€ namespace์™€ ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์ด ๋ฐœ์ „ ํ•˜๊ณ  ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ฐ€์ƒ๋จธ์‹ ์— ๋น„ํ•ด์„œ๋Š” ๋ถ€์กฑํ•œ ์ ์ด ์žˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹œ์Šคํ…œ๊ณผ ๊ฒฉ๋ฆฌ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค ๋“ค์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์— ๋Œ€ํ•ด ์ด๋ฏธ ์ง€์ •๋œ ์ž์›๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ž์› ์ œํ•œ์œผ๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋ถ„ํ•œ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง„ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•˜๋‚˜์˜ ์šด์˜ ์ฒด์ œ๋งŒ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฆฌ๋ˆ…์Šค ์šด์˜์ฒด์ œ๋งŒ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
  • ์Šคํ† ๋ฆฌ์ง€ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค. ๊ฐ€์ƒ๋จธ์‹ ์€ ๋ธ”๋Ÿญ ๋””๋ฐ”์ด์Šค ์œ„์— ext3, ext4๋ฅผ ์ด์šฉํ•ด์„œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” AUFS, Device mapper, Overlay Filesystem๋“ฑ๊ณผ ๊ฐ™์€ ์œ ๋‹ˆ์˜จ ํŒŒ์ผ ์‹œ์Šคํ…œ(Union filesystem)์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ext4์™€ ๊ฐ™์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์œ„์— ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐ๋‹ค๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ , ๊ธฐ๋ก๋œ ๋‚ด์šฉ์œผ๋กœ ๋ถ€ํ„ฐ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋А๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์ผ๋ฐ˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Btrfs๋‚˜ ZFS ๊ฐ™์€ COWํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๋Š” ๋“ฑ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ฐ€์ƒ๋จธ์‹ ์— ๋น„ํ•ด์„œ ์‹ ๊ฒฝ์จ์•ผ ํ• ๊ฒŒ ๋งŽ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์ด ์–ด๋ ต๋‹ค. ๊ฐ€์ƒ๋จธ์‹ ์€ ๋ฌผ๋ฆฌ์ ์ธ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ๊ณผ ์ฐจ์ด๊ฐ€ ์—†์–ด์„œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์ด ํŠน๋ณ„ํžˆ ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ทธ๋ƒฅ ๊ฐ€์ƒ๋จธ์‹  ๋งˆ๋‹ค IP ์ฃผ์†Œ ๋ถ™์—ฌ์„œ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ๊ทธ๋Ÿฐ ๋ฐฉ์‹์„ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค์— IP๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ๋˜๋ฉฐ, ๊ฒŒ๋‹ค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋Œ€๋Ÿ‰์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— IP ์ฃผ์†Œ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋‚ญ๋น„๋‹ค. ํ˜ธ์ŠคํŠธ ์šด์˜์ฒด์ œ ๋ ˆ๋ฒจ์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ•œ๋ฒˆ ๋” ์ถ”์ƒํ™” ํ•ด์•ผ ํ•ด์„œ ๊ฐ€์ƒ๋จธ์‹  ๋ณด๋‹ค ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์— ์‹ ๊ฒฝ์„ ์จ์•ผ ํ• ๊ฒŒ ๋งŽ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ OS ์ปค๋„์—์„œ ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์œ ๋ฆฌํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ OS ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” VM ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค์ด๋ ‡๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ๋Š” ์˜คํ”ˆ์†Œ์Šค๋Š” '๋„์ปค'์ด๋ฉฐ, ์ด ๊ธฐ์ˆ ์˜ ํ† ๋Œ€๊ฐ€ ๋˜์—ˆ๋˜ Linux Container์™€ ๋น„๊ตํ•˜์—ฌ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ดˆ: ์ปจํ…Œ์ด๋„ˆ์™€ ๋„์ปค

Quelle: https://robinsystems.com/blog/containers-deep-dive-lxc-vs-docker-comparison/

2.1 Linux Container(์ดํ•˜ LXC)

2.1.1 LXC์˜ ํŠน์„ฑ

LXC๋Š” ๋‹จ์ผ ์ปจํŠธ๋กค ํ˜ธ์ŠคํŠธ ์ƒ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ณ ๋ฆฝ๋œ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ(์ปจํ…Œ์ด๋„ˆ)๋“ค์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์šด์˜ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ ๊ฐ€์ƒํ™” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” daemon์—๊ฒŒ Linux kernel์— ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ building block์— ๋Œ€ํ•œ namespaces๋‚˜ cgroups(control groups)์™€ ๊ฐ™์€ ์ ‘๊ทผ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

  • namespace๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด, ์šด์˜ ์‹œ์Šคํ…œ์„ ์ชผ๊ฐœ์„œ ๊ฐ๊ฐ ๊ณ ๋ฆฝ๋œ ์ƒํƒœ๋กœ ์šด์˜์ด ๋˜๋Š” ๊ฐœ๋…์„ ์˜๋ฏธํ•ด์š”. 
  • cgroups๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด, namespaces์œผ๋กœ ๊ณ ๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ž์›์„ ์ œํ•œํ•˜๋Š” ์—ญํ•  ๋“ฑ์„ ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ Building Block์„ ์ดํ•ดํ•œ ํ›„ ๋‹ค์‹œ ๋ณด๋ฉด ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์‹ค๊ฑฐ์—์š”.

์–ด์จŒ๋“ , ๋ถ„๋ฆฌ๋œ ํ›„ ๊ณ ๋ฆฝ๋œ ๊ฐ๊ฐ์˜ ํ™˜๊ฒฝ๋“ค์ด ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. container์˜ ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฐ”๋กœ ์ด ๊ธฐ์ˆ ์ด container ๊ธฐ์ˆ ์˜ ๊ทผ๊ฐ„์ด๋ผ๋Š” ๊ฒƒ์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VM์ฒ˜๋Ÿผ OS level์—์„œ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด namespace์„ ํ†ตํ•ด ๊ฐ€์ƒ์˜ ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  cgroups๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ†ต์ œํ•จ์œผ๋กœ์จ ์ด์ „๋ณด๋‹ค higher level์—์„œ isolation์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌํ•˜์ž๋ฉด ๊ฐ namespace๊ฐ€ ๊ทธ์— ์†ํ•œ process๋“ค์€ ํ•˜๋‚˜์˜ machine์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์„ ์ ‘๋ชฉํ•œ LXC (linux containers) ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉฐ, ์ดˆ๊ธฐ ๋ฒ„์ „์˜ ๋„์ปค๋Š” LXC๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

2.1.2 LXC์˜ ๋ฌธ์ œ์ 

LXC๋Š” ๋ฆฌ๋ˆ…์Šค์— ํŠนํ™”๋˜์–ด ์žˆ๋Š”๋ฐ, Docker๊ฐ€ Multi-Platform์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š”๋ฐ ํฐ ๋ฆฌ์Šคํฌ์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์˜์กดํ•œ๋‹ค๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— Docker์‚ฌ๋Š” LXC๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด libcontainer๋ผ๋Š” ๋…์ž์ ์ธ ํˆด์„ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ, go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด platform-agnostic(๋ถˆํŠน์ • ํ”Œ๋žซํผ) ํˆด๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Docker 0.9๋ถ€ํ„ฐ ๊ธฐ๋ณธ ์‹คํ–‰ ๋“œ๋ผ์ด๋ฒ„๋ฅผ LXC์—์„œ libcontainer๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

2.1.3 Libcontainer

https://gngsn.tistory.com/128

Libcontainer๋Š” ํ˜„์žฌ์˜ Docker Engine์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. Go ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ ธ์„œ Container๋ฅผ ์ƒ์„ฑ ์‹œ namespaces, cgroups, capabilities ๋ฅผ ์ œ๊ณตํ•˜๊ณ , filesystem์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, Libcontainer๋Š” LXC์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Docker ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Docker์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ ์ œ์ž‘ํ•œ libcontainer์˜ CLI wrapper์ธ runc๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž, ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณผ๊ฒŒ์š”. ๋„์ปค ๋‚ด๋ถ€๋ฅผ ์•Œ์•„๊ฐ€๊ธฐ ์ „์— ๋„์ปค ์šฉ์–ด๋ฅผ ํ™•์‹คํžˆ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”. ๋„์ปค์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํ”ผ๋ฉฐ ์ž์ฃผ ์‚ฌ์šฉํ•  ๋‹จ์–ด๋“ค์„ ํ•œ๋ฒˆ์”ฉ ์งš๊ณ  ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

2.2 Docker(์ดํ•˜ ๋„์ปค)

“๋„์ปค๋Š” ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ์ธ runC๋ฅผ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ ์šด์˜์ฒด์ œ ์œ„์—์„œ ๊ฒฉ๋ฆฌ๋œ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์„ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ ๊ฐ€์ƒํ™” ์†Œํ”„ํŠธ์›จ์–ด” ...์˜€์ง€๋งŒ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด Windows ๋˜ํ•œ NT Kernel ์ƒ์—์„œ isolation์„ ํ†ตํ•ด windows(Host) → windows(Base) ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์œ„๋Š” outdated๋œ ์ •์˜์ž…๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ƒํ™”๋Š” ๊ฒŒ์ŠคํŠธ ์šด์˜์ฒด์ œ ์—†์ด ํ˜ธ์ŠคํŠธ ์šด์˜์ฒด์ œ ์œ„์— ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์ƒํ™”๋ฅผ ๊ตฌํ˜„ํ•จ
  • ๊ฒŒ์ŠคํŠธ ์šด์˜์ฒด์ œ๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋‹ˆ ํ˜ธ์ŠคํŠธ ์šด์˜์ฒด์ œ์˜ ์š”์†Œ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ๊ทธ๋งŒํผ ์ค‘๋ณต๋˜๋Š” ์š”์†Œ๊ฐ€ ์ค„์–ด ์„ฑ๋Šฅ์  ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Œ
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ์šด์˜ ์ฒด์ œ์˜ ๋™์ž‘์„ ์™„์ „ํžˆ ์žฌํ˜„ํ•˜์ง€๋Š” ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ข€ ๋” ์—„๋ฐ€ํ•œ ์šด์˜ ์ฒด์ œ์˜ ๋™์ž‘์ด ์š”๊ตฌ๋˜๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•œ๋‹ค๋ฉด VMWare๋‚˜ VirtualBox๊ฐ€ ๋‚˜์Œ

2.3 ๋„์ปค๊ฐ€ ๊ธฐ์กด Linux container(์ดํ•˜ LXC)์— ๋น„ํ•ด ๊ฐ€์ง„ ์žฅ์ 

  • ํ˜ธ์ŠคํŠธ ์šด์˜ ์ฒด์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ
    • Docker Engine์„ ์ด์šฉํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ ํ‘œ์ค€ํ™”
    • LXC๋ฅผ ์‚ฌ์šฉํ•  ๋• LXC์˜ ์„ค์ • ์ฐจ์ด๋กœ LXC์—์„œ ๋งŒ๋“  application์ด ๋‹ค๋ฅธ LXC์—์„œ ์•ˆ ๋Œ์•„๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณค ํ–ˆ์Œ
  • DSL(Domain Specific Language)๋ฅผ ์ด์šฉํ•œ Dockerfile
  • ์ด๋ฏธ์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ
  • ๋ ˆ์ด์–ด ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ด๋ฏธ์ง€ ํฌ๋งท(์ฐจ๋ถ„ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•จ)
  • ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(์ด๋ฏธ์ง€ ์ €์žฅ ์„œ๋ฒ„ ์—ญํ• )

2.4 (ํ˜„์žฌ)๋„์ปค์˜ ํ•œ๊ณ„: Kernel ๋ฐ Architecture์˜ ์ฐจ์ด

  • ํ˜ธ์ŠคํŠธํ˜• ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์ฒ˜๋Ÿผ ํ•˜๋“œ์›จ์–ด๋ฅผ ์—ฐ์‚ฐ์œผ๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ๋‹ฌ๋ฆฌ, ๋„์ปค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆํ˜• ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์€ ํ˜ธ์ŠคํŠธ ์šด์˜ ์ฒด์ œ์™€ ์ปค๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์ด๋Š” ์‚ฌ์‹ค์ƒ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ˜ธ์ŠคํŠธ๊ฐ€ ํŠน์ • CPU ์•„ํ‚คํ…์ฒ˜ ํ˜น์€ ์šด์˜ ์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ. ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์™€ ๊ฐ™์€ ARM ๊ณ„์—ด์˜ arm7I ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฑ„์šฉํ•œ ํ”Œ๋žซํผ์—์„œ๋Š” ์ธํ…”์˜ x86_64 ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นŒ๋“œํ•œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.
  • microsoft์˜ windowsservercore ์ด๋ฏธ์ง€๋Š” ๋ฆฌ๋ˆ…์Šค๋‚˜ macOS๋“ฑ์˜ ํ”Œ๋žซํผ์—์„œ๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

2.5 “Container Host”์™€ “Container OS”์˜ ์ฐจ์ด

2.5.1 Container Host (Host OS)

  • Docker client์™€ Docker daemon์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ณณ์˜ OS
  • linux์™€ non-Hyper-V container๋“ค์€ Host OS๊ฐ€ Docker container์—๊ฒŒ kernel์„ ๋‚˜๋ˆ„์–ด์ฃผ์ง€๋งŒ, Hyper-V container๋Š” ๊ฐ์ž์˜ Hyper-V kernel์„ ๊ฐ€์ง„๋‹ค.

2.5.2 Container OS (Base OS)

  • Ubuntu, CentOS, windowsservercore์™€ ๊ฐ™์ด ์ปจํ…Œ์ด๋„ˆ์˜ OS
  • Base OS๋ฅผ ๋‹ด์€ ์ด๋ฏธ์ง€ ์œ„๋กœ ์Œ“์ด๋Š” ์ด๋ฏธ์ง€๋Š” Base OS๋ฅผ utilizeํ•จ.

์ญ‰ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋„์ปค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Linux kernel์„ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค. Docker for Windows/Mac์ด linux container๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” LinuxKit(linux vm)์„ ์ด์šฉํ•œ๋‹ค. → Linux containers are running on Linux, and Windows containers are running on Windows. → ๊ทธ๋žฌ๋Š”๋ฐ ์ด๊ฒŒ ๋˜ windows์—์„  LCOW๊ฐ€ ๊ธฐ๋ณธ์ด ๋˜๋ฉด์„œ ๋ฐ”๋€Œ์—ˆ๋‹ค.

  • The setup for running Linux containers with LCOW is a lot simpler than the previous architecture where a Hyper-V Linux VM runs a Linux Docker daemon, along with all your containers. With LCOW, the Docker daemon runs as a Windows process (same as when running Docker Windows containers), and every time you start a Linux container Docker launches a minimal Hyper-V hypervisor running a VM with a Linux kernel, runc and the container processes running on top.
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด Docker Daemon์ด windows(Host OS) ์œ„์—์„œ ๋Œ์•„๋„ Linux Container๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์„œ Windows์™€ Linux ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • windows container๊ฐ€ windows์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์ด๋‚˜, docker ์ž์ฒด ๊ธฐ์ˆ ์ด๋‚˜, ํ˜„์žฌ ์ง„ํ–‰ํ˜•์œผ๋กœ ์ƒˆ๋กœ ๊ฐœ๋ฐœ๋˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

3. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ  ์‹ฌํ™”: ๋„์ปค ๋™์ž‘์›๋ฆฌ ๋ฐ ๋„์ปค ์—”์ง„

3.1 ๋„์ปค ๋™์ž‘์›๋ฆฌ

๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ OS ์˜ ์ปค๋„์„ ๊ณต์œ ํ•œ๋‹ค. ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ํ• ๋‹นํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ๊ฒฉ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋•Œ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ Cgroup ๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๋…๋ฆฝ๋œ ๊ณต๊ฐ„์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค, ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์— ๋ฒฝ์„ ๋งŒ๋“ ๋‹ค.

ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ๊ณผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•˜๋‚˜์˜ ์ปค๋„์„ ๊ณต์œ ํ•˜๊ธฐ ๋–„๋ฌธ์— ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ps ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„์ปค๋Š” ๋„์ปค ์—”์ง„์„ ํ†ตํ•ด์„œ ์‹คํ–‰๋˜๊ณ  ๊ด€๋ฆฌ๋œ๋‹ค. ๋„์ปค๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์ด ๋ฆฌ๋ˆ…์Šค๊ฑฐ๋‚˜ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” OS ์—ฌ์•ผ ํ•œ๋‹ค. ๋„์ปค ์—”์ง„์€ ๋˜ ํ•˜๋‚˜์˜ VM ์œผ๋กœ ๋ฆฌ๋ˆ…์Šค๋ฅผ ๊ฒŒ์ŠคํŠธ OS ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ŠคํŠธ OS ์ธ ๋ฆฌ๋ˆ…์Šค์˜ ์ปค๋„์„ ์ปจํ…Œ์ด๋„ˆ์— ํ• ๋‹นํ•˜์—ฌ์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์ด ์ปค๋„์„ ํ†ตํ•ด์„œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ๊ฒฉ๋ฆฌ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— ํ˜ธ์ŠคํŠธ OS ๊ฐ€ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3.2 ๋„์ปค ์—”์ง„(Docker Engine)

์ด์ œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ•ต์‹ฌ SW์ธ ๋„์ปค ์—”์ง„์— ๋Œ€ํ•ด ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://gngsn.tistory.com/128

Docker Engine์€ Docker Daemon, REST API, API๋ฅผ ํ†ตํ•ด ๋„์ปค ๋ฐ๋ชฌ๊ณผ ํ†ต์‹ ํ•˜๋Š” CLI๋กœ ๋ชจ๋“ˆ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์ด Docker๋ผ๊ณ  ํ•  ๋•Œ, ์ฃผ๋กœ Docker engine์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œ, ์‹คํ–‰, ๋ฐฐํฌํ•˜๋Š” ๋“ฑ์˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ Docker Daemon์ด ํ•˜๋ฉฐ, Docker Client๋Š” ์ด๋Ÿฌํ•œ ๋กœ์ปฌ ํ˜น์€ ์›๊ฒฉ์˜ Docker Daemon๊ณผ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. ํ†ต์‹ ์„ ํ•  ๋•Œ์—๋Š” UNIX socket(/var/run/docker.sock) ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ REST API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3.2.1 docker client (= Docker CLI): docker cli ๋ช…๋ น์„ dockerd์— ์š”์ฒญ

docker cli ๋“ฑ์— ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด(e.g. docker run)๋ฅผ ์ ์ ˆํ•œ REST API payload๋กœ ๋ณ€ํ™˜ํ•ด์„œ dockerd์— post ์š”์ฒญ(e.g. POST /containers/create HTTP/1.1)ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Docker Client๋Š” ๋‹ค์ˆ˜์˜ ๋ฐ๋ชฌ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ /var/run/docker.sock์— ์žˆ๋Š” ์œ ๋‹‰์Šค ์†Œ์ผ“์„ ํ†ตํ•ด ๋„์ปค ๋ฐ๋ชฌ์˜ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋„์ปค ๋ฐ๋ชฌ๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ 'Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?'๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.

  • Linux์—์„œ socket์€ /var/run/docker.sock ์ด๊ณ , Windows์—์„œ๋Š” \pipe\docker_engine ์ž…๋‹ˆ๋‹ค.

3.2.2 dockerd (docker deamon): ๋„์ปค ์„œ๋น„์Šค ๊ด€๋ฆฌ

๋„์ปค ๋ฐ๋ชฌ์€ Docker API ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฐ๋ชฌ๊ณผ ํ†ต์‹ ํ•˜์—ฌ ๋„์ปค ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. dockerd์˜ ์—ญํ• ๋กœ๋Š” ๋„์ปค ์ด๋ฏธ์ง€์˜ ๊ด€๋ฆฌ, ์ด๋ฏธ์ง€ ๋นŒ๋“œ, REST API, ์ธ์ฆ, ๋ณด์•ˆ, ์ฝ”์–ด ๋„คํŠธ์›Œํ‚น, ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

๋˜ํ•œ logging drivers, volume ๋ฐ volume drivers, network๋ฅผ ์„ค์ •ํ•˜๋Š” ๋“ฑ ์ปจํ…Œ์ด๋„ˆ์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๋„์ปค ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ด dockerd๋Š” ๋”์ด์ƒ ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ์˜ ์‹คํ–‰๊ณผ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๋ถ„๋ฆฌ(containerd)ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ๋งŒ์•ฝ dockerd๊ฐ€ client๋กœ๋ถ€ํ„ฐ ‘์ƒˆ๋กœ์šด container๋ฅผ ์ƒ์„ฑํ•˜๋ผ’๋Š” ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜๋ฉด containerd๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, dockerd๋Š” CRUD ์Šคํƒ€์ผ API๋ฅผ ํ†ตํ•ด gRPC๋กœ containerd์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

3.2.3 containerd

ํ˜„์žฌ๋Š” docker์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ์˜คํ”ˆ์†Œ์Šค๋กœ ์šด์˜๋˜๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. containerd๋Š” ์‹ค์ œ๋กœ containers๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ณ  runc๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜์ง€๋งŒ, Docker ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜์—ฌ runc๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” OCI ๋ฒˆ๋“ค๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. containerd๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€์žฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋งŒ๋“  Container Runtime Interface(CRI)๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€์žฅํ•˜๋Š”๋ฐ, ์ด ๋•Œ runC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜ containerd๋Š” ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด Container lifecycle operations์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋Š”๋ฐ, ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ image pulls, volumes and networks์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

# High-Level Runtime

containerd๋Š” High-Level Runtime์ด๋ฉฐ, High-Level Runtime์€ ๋ณดํ†ต ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ, gRPC/Web API์™€ ๊ฐ™์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ๋†’์€ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋Ÿฐํƒ€์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "high-level container tools", "high-level container runtimes" ์œผ๋กœ ๋ถ€๋ฅด๊ฑฐ๋‚˜, ๊ฐ€๋”์€ ๊ทธ๋ƒฅ "container runtimes”์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ, Low-Level Runtime์—๋Š” ๋‹ค์Œ์œผ๋กœ ๋ณผ runC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

Docker Client๋กœ๋ถ€ํ„ฐ Container ๊ด€๋ จ ์š”์ฒญ์€ dockerd๋ฅผ ๊ฑฐ์ณ gRPC ํ†ต์‹ ์„ ํ†ตํ•ด containerd ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, containerd๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด runc๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. ๊ทธ๋Ÿผ, runc๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ๊ฒŒ์š”. 

3.2.4 runC: Container ์ƒ์„ฑ

runC๋Š” *libcontainer์šฉ CLI Wrapper๋กœ, ๋…๋ฆฝ๋œ container runtime์ž…๋‹ˆ๋‹ค. Docker์—์„œ runc๋Š” ๋ชฉ์ ์€ ๋‹จ ํ•˜๋‚˜์ธ๋ฐ์š”, ๋ฐ”๋กœ Container ์ƒ์„ฑ์ž…๋‹ˆ๋‹ค.
* libcontainer : Docker์‚ฌ๊ฐ€ multi-platform ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํŒจํ‚ค์ง€.

docker์—์„œ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ฆฌ๋ˆ…์Šค์˜ namespace, control group๋“ค๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, OS ์ปค๋„์— ์ ‘์†ํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ(๋„ค์ž„์ŠคํŽ˜์ด์Šค, cgroup ๋“ฑ)์„ ํ•˜๋‚˜์˜ low-level component๋กœ ๋ฌถ๊ณ  runC๋ผ๊ณ  ์ด๋ฆ„๋ถ™์˜€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ runc๋กœ ์ƒˆ๋กœ์šด container๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ธฐ๋ถ€๋˜์–ด ํ•˜๋‚˜์˜ standalone ํ”„๋กœ์ ํŠธ๋กœ์„œ ํ”Œ๋žซํผ์— ๊ด€๊ณ„ ์—†์ด container๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

# OCI(Open Container Initiative)

runC๋Š” OCI container-runtime-spec์˜ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. OCI๋Š” kernel์˜ container ๊ด€๋ จ ๊ธฐ์ˆ ์„ ๋‹ค๋ฃจ๋Š” interface๋ฅผ ํ‘œ์ค€ํ™”์‹œํ‚จ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ runc๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ณ„์ธต์„ OCI Layer๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

# Low-Level Runtimes

Low-Level Runtimes๋Š” ๋ณดํ†ต ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

runC๋Š” ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋‹ค์šด๋ฐ›๊ณ  ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. runC(OCI) container๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ค๋Š”๋ฐ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๊ณจ๊ฒฉ(bare bones)์ผ ๋ฟ์ด๋ฉฐ ๋งค์šฐ ๋‚ฎ์€ ๋ ˆ๋ฒจ(low-level)์ž…๋‹ˆ๋‹ค.์ฆ‰, ์™„์ „ํ•œ Docker ์—”์ง„์˜ ํŠน์„ฑ(full-blown)์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. 

3.2.5 containerd-shim: ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€์—ฌ

์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๋Š” runc์˜ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋กœ ์‹œ์ž‘๋˜๋Š”๋ฐ(์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  container ๋‹น runc์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ fork ), ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ํ•˜์ž๋งˆ์ž runc๊ฐ€ ์ข…๋ฃŒ(exit)๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ๋ถ€ํ„ฐ containered-shim์ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜์–ด ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๊ด€์—ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” containerd์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ์˜ *file descriptor(e.g. stdin/out)์™€ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ๊น๋‹ˆ๋‹ค.

* file descriptor

  • ํ”„๋กœ์„ธ์Šค์—์„œ ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์„ธ์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰๋  ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ํŒŒ์ผ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ํ‘œ์ค€์ž…๋ ฅ(Standard Input), ํ‘œ์ค€ ์ถœ๋ ฅ(Standard Output), ํ‘œ์ค€์—๋Ÿฌ(Standard Error)์ด๋ฉฐ ์ด๋“ค์—๊ฒŒ ๊ฐ๊ฐ 0, 1, 2๋ผ๋Š” ์ •์ˆ˜(file table์˜ ์ธ๋ฑ์Šค)๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • daemon์ด ์žฌ์‹œ์ž‘๋  ๋•Œ, ํŒŒ์ดํ”„๊ฐ€ ๋‹ซํžˆ๋Š” ๋“ฑ์˜ ์ด์œ  ๋•Œ๋ฌธ์— container๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก STDIN๊ณผ STDOUT ์ŠคํŠธ๋ฆผ์„ ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

3.3 ์˜คํ”ˆ์†Œ์Šค๋กœ์„œ์˜ ๋„์ปค

์—ฌ๊ธฐ๊นŒ์ง€ ์‚ดํŽด๋ณด๊ณ  ๋‚˜๋‹ˆ ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ํฌ๊ฒŒ docker๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์€ Docker, Inc ๋น ์ ธ๋‚˜์™€ ๋Œ€๋ถ€๋ถ„ ์˜คํ”ˆ์†Œ์Šคํ™” ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋„ค์š”. ํ˜„์žฌ์˜ ๋„์ปค ์ฃผ์‹ํšŒ์‚ฌ๋Š” ์ด๋Ÿฐ ์˜คํ”ˆ์†Œ์Šค๋“ค์„ ๋” ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” Interface๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์—…๋ฌด๋กœ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•