๐ก ๋ณธ ๋ฌธ์๋ '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. ์ปจํ ์ด๋ ๊ธฐ์ด: ์ปจํ ์ด๋์ ๋์ปค
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
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์ธ ๋์ปค ์์ง์ ๋ํด ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
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์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ํ์ฅ๋์์ต๋๋ค.
- [github] containerd: https://github.com/containerd
# 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๋ฅผ ๊ตฌํํ๋ ๊ธฐ์ ๋ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- [github] opencontainers/runC: https://github.com/opencontainers/runc
# 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๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ ๋ฌด๋ก ํ๊ณ ์๋ค๊ณ ๋ณผ ์ ์๊ฒ ์ต๋๋ค.
์ฐธ๊ณ
- [Redhat] What is a hypervisor: https://www.redhat.com/ko/topics/virtualization/what-is-a-hypervisor
- [Blog] Docker์ ์ปจ์ , ๋ด๋ถ ๊ตฌ์กฐ, ํ์ฉ ์ธ๋ฏธ๋ ์ ๋ฆฌ: https://gayuna.github.io/docker/docker/
- [Blog] ๋์ปค ์ ๋ฆฌ: https://rokrokss.com/post/2019/10/17/%EB%8F%84%EC%BB%A4-Docker-%EC%A0%95%EB%A6%AC.html