
์ด ๊ธ์์๋ ์ปดํจํฐ ์์คํ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ถํฐ ์์ํด ๊ฐ์ํ ๊ธฐ์ , ๊ทธ๋ฆฌ๊ณ ๋์ปค์ ๊ฐ๋ ๊น์ง ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
์ปดํจํฐ ์์คํ ์ ํฌ๊ฒ ํ๋์จ์ด์ ์ํํธ์จ์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ๋์จ์ด๋ CPU, ๋ฉ๋ชจ๋ฆฌ, ์ ์ฅ์ฅ์น์ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ธ ์ ์ฐ ์์์ด ์ง์ค๋ ๋ถ๋ถ์ด๋ฉฐ, ์ํํธ์จ์ด๋ ์ด๋ฌํ ํ๋์จ์ด ์์์ ํ์ฉํ๋ ํ๋ก๊ทธ๋จ๋ค์ ๋๋ค.
์ํํธ์จ์ด๋ ๋ค์ ๋ ๊ฐ์ง๋ก ๋๋ฉ๋๋ค:
์ด์์ฒด์ ๋ ๋ชจ๋ ํ๋ก์ธ์ค์๊ฒ ๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณด์ฅํด์ฃผ๋๋ฐ, ์ด๋ ํ๋ก์ธ์ค์ ๋ ๋ฆฝ์ฑ๊ณผ ์์คํ ์์ ์ฑ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋๋ถ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋์์ ์ถฉ๋ ์์ด ์คํ๋ ์ ์์ต๋๋ค.
์ปดํจํฐ์ ์ ์ฒด์ฑ์ ๋๋ถ๋ถ ์ด๋ค ์ํํธ์จ์ด๋ฅผ ์คํํ๋๋์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ๋์ผํ ํ๋์จ์ด๋ผ๋ ์์ ์ ์คํํ๋ฉด ์ฌ๋ฌด์ฉ ๊ธฐ๊ธฐ, ๊ฒ์์ ์คํํ๋ฉด ๊ฒ์๊ธฐ, ์ํ๋ฅผ ๋ณด๋ฉด ์ํฐํ ์ธ๋จผํธ ๊ธฐ๊ธฐ๊ฐ ๋ฉ๋๋ค. ์ด์ฒ๋ผ ๋ค์ํ ์ํํธ์จ์ด๋ฅผ ์ค์นํ๊ณ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ๋ '๋ฒ์ฉ ์ปดํจํฐ'๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๊ณต์์ ๋น์ ๊ณต์๋ฅผ ๊ตฌ๋ถํ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ํ๋ฉด RAM์ ์๋ฏธํ์ง๋ง, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ RAM๊ณผ ํ๋๋์คํฌ ๊ฐ์ 2์ฐจ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฉ์ณ์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ถ์ํํ ๊ฒ์ ๋๋ค.
32๋นํธ ์์คํ ์์ ํ๋ก์ธ์ค๋ 4GB์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง์ง๋ง, ์ค์ ๋ก๋ ์ฝ 1.7GB๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋์์ ์คํ๋ ์ ์๋ ์ด์ ๋ ์ด์์ฒด์ ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ํ ํน์ง์ ํ๋ก์ธ์ค๋ง๋ค ๋ ๋ฆฝ์ ์ด๋ผ๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, MS ์๋ ๋ ๊ฐ๋ฅผ ์คํํ๋ฉด ๊ฐ๊ฐ์ ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค๋ก, ํ ํ๋ก์ธ์ค์์ ํธ์งํ ๋ด์ฉ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ์ด๋ฌํ ๋ ๋ฆฝ์ฑ ๋๋ถ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋์์ ์๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ฉํฐํ์คํน ์ด์์ฒด์ ๋ผ๊ณ ํฉ๋๋ค.
๊ฐ์ํ๋ ํ๋์ ๋ฌผ๋ฆฌ์ ์ปดํจํฐ์์ ์์ ํ ๊ฒฉ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ธฐ์ ์ ๋๋ค. VMware์ ๊ฐ์ ๊ฐ์ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ๋ฌผ๋ฆฌ์ ์ปดํจํฐ์์ ์ฌ๋ฌ ์ด์์ฒด์ ๋ฅผ ๋์์ ์คํํ ์ ์์ต๋๋ค.
ํธ์คํธ OS(์: Windows)์ VMware๋ฅผ ์ค์นํ๊ณ ๊ทธ ์์ ๊ฒ์คํธ OS(์: Linux)๋ฅผ ์ค์นํ๋ฉด, ๊ฒ์คํธ OS๋ ํธ์คํธ OS์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ ๋ชจ๋, ์ปค๋ ๋ชจ๋, ํ๋์จ์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ๊ฒ์คํธ OS์ ํ๋์จ์ด๋ ์ค์ ํ๋์จ์ด๊ฐ ์๋ ์ํํธ์จ์ด๋ก ๊ตฌํ๋ ๊ฐ์ ํ๋์จ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ํ ํ๊ฒฝ์์ ๊ฐ์ ๋จธ์ (VM)์ ์์ ํ ์ด์์ฒด์ ๋ถํฐ ํ๋์จ์ด๊น์ง ๋ชจ๋ ๊ณ์ธต์ ๊ฐ์ํํฉ๋๋ค. ๊ฐ VM์ ์์ฒด ์ด์์ฒด์ ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์์ ์๋ชจ๊ฐ ํฌ๊ณ , ๋ถํ ์๊ฐ์ด ๊ธธ๋ฉฐ, ์ฌ๋ฌ VM์ ์คํํ ๊ฒฝ์ฐ ๋ง์ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค.
VMware๋ VirtualBox๋ฅผ ์ค์นํ๋ฉด ๋ฒ์ถ์ผ ๋ ๋๋ผ์ด๋ฒ(Virtual NIC Driver)๋ผ๋ ๊ฒ์ด ์ค์น๋ฉ๋๋ค. ์ด๊ฒ์ ์ค์ ๋คํธ์ํฌ ์นด๋๊ฐ ์๋ ์ํํธ์จ์ด๋ก ๊ตฌํ๋ ๋คํธ์ํฌ ๋๋ผ์ด๋ฒ์ ๋๋ค.
๊ฒ์คํธ OS์ ์ํํธ์จ์ด ๋คํธ์ํฌ ์นด๋๋ ํธ์คํธ OS์ ๊ฐ์ ๋คํธ์ํฌ ์นด๋๋ฅผ ๋ง์น ๋ฌผ๋ฆฌ์ ์นด๋์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ์ ๋คํธ์ํฌ ์นด๋๋ L2 ์ค์์น์ฒ๋ผ ์๋ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฆฌ๋ ์ค ๊ฒ์คํธ OS์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ๋ฉด, ์์ฒญ์ด ๊ฐ์ ๋คํธ์ํฌ ์นด๋๋ฅผ ํตํด ํธ์คํธ OS๋ก ์ ๋ฌ๋ฉ๋๋ค. ํธ์คํธ OS๋ ์ฃผ๋ก NAT(Network Address Translation) ๋ฐฉ์์ ์ง์ํ์ฌ ๊ณต์ ๊ธฐ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ฒญ์ด ํธ์คํธ์ ๋ฌผ๋ฆฌ์ ๋คํธ์ํฌ ์นด๋๋ฅผ ํตํด ์ธํฐ๋ท์ผ๋ก ๋๊ฐ๊ณ , ์๋ต๋ ๊ฐ์ ๊ฒฝ๋ก๋ก ๋ค์ด์ต๋๋ค. ์ด์ฒ๋ผ ๊ฐ์ํ ๊ธฐ์ ์ ํ์ฉํ๋ฉด ํ๋์ ์ปดํจํฐ๋ก ์ฌ๋ฌ ๊ฐ์ ์ปดํจํฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ํ ํ๊ฒฝ์์๋ ํ๋์ ๋ฌผ๋ฆฌ์ ์ปดํจํฐ์์ ํธ์คํธ OS์ ์ฌ๋ฌ ๊ฒ์คํธ OS๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ ๋ง์ ์ค๋ณต๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. "์ด ๊ฒ์คํธ OS๋ค์ด ๊ผญ ํ์ํ๊ฐ? ์์ด๋ ๋์ง ์์๊น?"๋ผ๋ ์๋ฌธ์์ ๋์ปค(Docker)๋ผ๋ ๊ฐ๋ ์ด ํ์ํ์ต๋๋ค.
๋์ปค๋ "์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ๊ฐ์ OS๊ฐ ํ์ํ๋ฐ, ์ด์ฐจํผ ํธ์คํธ OS์ ๊ฒ์คํธ OS๊ฐ ๋๊ฐ๋ค๋ฉด, ์ค๋ณต๋๋ ๋ถ๋ถ์ ์ ๊ฑฐํ์"๋ ์์ด๋์ด์์ ์ถ๋ฐํ์ต๋๋ค. ๊ฒฐ๊ตญ ํ์ํ ๊ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์ข ์์ฑ๋ฟ์ด๋ฏ๋ก, ์ด๋ค๋ง ๋ฌถ์ด์ ์คํํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค๊ณ , OS๋ ๊ณต์ ํ์๋ ๊ฒ์ด ๋์ปค์ ํต์ฌ ๊ฐ๋ ์ ๋๋ค.
๋์ปค๋ ์ปจํ ์ด๋ํ๋ผ๋ ๊ฐ์ํ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ปจํ ์ด๋ํ๋ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์์กด์ฑ์ ํ์คํ๋ ๋จ์(์ปจํ ์ด๋)๋ก ๊ฒฉ๋ฆฌํ๊ณ ํจํค์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋์ปค๋ ์ด๋ฌํ ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ถ, ๋ฐฐํฌ, ์คํํ๊ธฐ ์ํ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
๋์ปค ์ปจํ ์ด๋๋ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ํ์ํ ๋ชจ๋ ๊ฒ(์ฝ๋, ๋ฐํ์, ์์คํ ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ค์ )์ ํฌํจํฉ๋๋ค. ์ปจํ ์ด๋๋ ๋ง์น ๊นกํต์ฒ๋ผ ๋ชจ๋ ๊ฒ์ ๋ด๊ณ ์์ด์ ์ด๋ฆ์ด ๋ถ์ฌ์ก์ต๋๋ค.
๋์ปค ์์ง(Docker Engine)์ ์ปจํ ์ด๋๊ฐ ํ์๋ก ํ๋ ์์คํ ํธ์ถ์ ๋์ ์ฒ๋ฆฌํด์ค๋๋ค. ์ดํ๋ฆฌ์ผ์ด์ ์ด ํ๋์จ์ด ์์์ ์์ฒญํ๋ฉด, ๋์ปค ์์ง์ด ํธ์คํธ OS์ ์์ฒญํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ปจํ ์ด๋์ ์ ๋ฌํฉ๋๋ค.
์ ํต์ ์ธ ๊ฐ์ํ์ ๋ฌ๋ฆฌ, ๋์ปค๋ ํธ์คํธ OS ์ปค๋์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ฌ์ฉ์ด ๋ ํจ์จ์ ์ด๊ณ ์์ ์๊ฐ์ด ๋น ๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด, 1GB ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ์์ ๋ VM์ ์ฌ์ฉํ๋ฉด ๊ฐ VM๋ง๋ค 1GB๊ฐ ํ์ํ์ง๋ง, ๋์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ปจํ ์ด๋ ๊ฐ์ ๊ทธ 1GB๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
๋์ปค๊ฐ ์๋ํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ์คํธ OS์ ์ปค๋์ด ๋ฆฌ๋ ์ค์ฌ์ผ ํฉ๋๋ค. ๋ฆฌ๋ ์ค ์ปค๋์ ๊ณต์ ํ์ฌ ๋ค๋ฅธ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ ์ปจํ ์ด๋๋ก ์คํํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋ํ๋ ๊ธฐ์กด์ ๊ฒ์คํธ OS์ ํธ์คํธ OS๊ฐ ๋์ผํ ๋ ์ค๋ณต๋๋ ๋ถ๋ถ์ ์ ๊ฑฐํจ์ผ๋ก์จ ๊ฐ๋ฅํด์ง๋๋ค. ์ฆ, ์ปค๋์ ๊ณต์ ํ๊ณ ์ดํ๋ฆฌ์ผ์ด์ ๋ ์ด์ด๋ง ๋ฐ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๋์ปค ์ปจํ ์ด๋๋ ํธ์คํธ OS์ ๋ค์์คํ์ด์ค์ ์ปจํธ๋กค ๊ทธ๋ฃน๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๊ฒฉ๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ์ปจํ ์ด๋๋ ๋ ๋ฆฝ๋ ํ๊ฒฝ์์ ์คํ๋๋ฉด์๋ ํธ์คํธ OS์ ์ปค๋์ ๊ณต์ ํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๋์ปค์ ํ์ผ ์์คํ ์ AuFS(Advanced Multi-Layered Unification Filesystem)๋ผ๋ ๊ณ์ธตํ๋ ํ์ผ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์์คํ ์ ์ฝ๊ธฐ ์ ์ฉ ๋ถ๋ถ๊ณผ ์ฐ๊ธฐ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํจ์ผ๋ก์จ ๊ณตํต ๋ถ๋ถ์ ๊ณต์ ํ๊ณ ๋ณ๊ฒฝ ์ฌํญ๋ง ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํ ์ ์๊ฒ ํฉ๋๋ค.
๋์ปค ์ปจํ ์ด๋๋ ๊ฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์ปจํ ์ด๋๊ฐ "๋ง์ด ๊ฐ๊ฑฐ๋" ์ฃฝ์ ์๋ ์๊ณ , ๋ ๋ง์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ปจํ ์ด๋ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฟ ๋ฒ๋คํฐ์ค(Kubernetes)๊ฐ ํ์ํ์ต๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ๋ฅผ ์๋ํํด์ฃผ๋ ํ๋ซํผ์ผ๋ก, ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, ๋ก๋๋ฐธ๋ฐ์ฑ, ์คํ ๋ฆฌ์ง ์ค์ผ์คํธ๋ ์ด์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์ด, ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ๋ฐฐํฌ๊ฐ ๋์ฑ ์์ ์ ์ด๊ณ ํ์ฅ์ฑ ์๊ฒ ๋ฉ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ํนํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๊ฐ์ด ๋ง์ ์์ ์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ํ๊ฒฝ์์ ์ ์ฉํฉ๋๋ค. ์ด๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ์ ์ ๋ ์ค์ํด์ง๊ณ ์๋ ํจํด์ ๋๋ค.
๋์ปค ์ด๋ฏธ์ง๋ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฝ๊ธฐ ์ ์ฉ ํ ํ๋ฆฟ์ ๋๋ค. ๋์ปค ์ด๋ฏธ์ง๋ Dockerfile์ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ฉฐ, ์ด๋ฏธ์ง ๋ด์ฉ๊ณผ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ ์ํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ ์ธก๋ฉด์์ ๋์ปค์ ์ฅ์ ์ ํ์คํ๋ ํ๊ฒฝ์ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ํ์ด์ฌ์ด๋ Node.js๋ก ๊ฐ๋ฐํ๋ ค๋ฉด ์ฌ๋ฌ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํ๋๋ฐ, ์ด๋ฐ ์ค์ ์ ๋ชจ๋ ๋ด์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ฏธ๋ฆฌ ํ์ํ ๋ชจ๋ ๊ฒ์ด ์ค์น๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋์ผ๋ฉด, ๊ฐ๋ฐ์๋ค์ ์ด๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค์ ์น ๊ฐ๋ฐ ๊ต์ก ํ๋ซํผ์ธ ์๋ฆฌ์ค, ๊ตฌ๋ฆ ๋ฑ์์๋ ์ด๋ฌํ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ์ฌ ํ์ต์๋ค์๊ฒ ํ์คํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ "๋ด ์ปดํจํฐ์์๋ ์๋ํ๋๋ฐ" ๋ผ๋ ํํ ๊ฐ๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์๋ํ๋ ํ๊ฒฝ์ ๊ทธ๋๋ก ๊ณต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ ์ฐจ์ด๋ก ์ธํ ๋ฌธ์ ๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค.
์๋ ํ๋ ์ ํต์ ์ธ ๊ฐ์ํ ๊ธฐ์ ๊ณผ ๋์ปค ์ปจํ ์ด๋์ ์ฃผ์ ์ฐจ์ด์ ์ ๋น๊ตํฉ๋๋ค.
| ํน์ฑ | ์ ํต์ ์ธ ๊ฐ์ํ(VM) | ๋์ปค ์ปจํ ์ด๋ |
|---|---|---|
| ์ํคํ ์ฒ | ํ์ดํผ๋ฐ์ด์ ๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ OS ์ธ์คํด์ค ์คํ | ํธ์คํธ OS ์ปค๋์ ์ปจํ ์ด๋ ๊ฐ์ ๊ณต์ |
| ๋ถํ ์๊ฐ | ๋ถ ๋จ์(๊ฐ VM์ ์์ ํ OS ๋ถํ ํ์) | ์ด ๋จ์(์ปจํ ์ด๋๋ ๊ฐ๋ฒผ์) |
| ์์ ์ฌ์ฉ | VM๋น ๋์ ์์ ์ค๋ฒํค๋ | ํจ์จ์ , ๋ ์ ์ ์์คํ ์์ ์ฌ์ฉ |
| ๊ฒฉ๋ฆฌ | ์์ ํ OS ์์ค์ ๊ฒฉ๋ฆฌ | ํ๋ก์ธ์ค ์์ค์ ๊ฒฉ๋ฆฌ |
| ์ด์์ฑ | OS ์์กด์ฑ์ผ๋ก ์ธํ ์ ํ๋ ์ด์์ฑ | ํ๊ฒฝ ๊ฐ ๋์ ์ด์์ฑ |
| ์ฑ๋ฅ | ์์ ํ OS ์คํ์ผ๋ก ์ธํ ๋ฎ์ ์ฑ๋ฅ | ์ต์ํ์ ์ค๋ฒํค๋๋ก ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ |
| ํ์ฅ์ฑ | ๋์ ํ์ฅ์ ์ ํฉํ์ง ์์ | ๋ง์ดํฌ๋ก์๋น์ค ๋ฐ ํ์ฅ์ ํ์ |
| ๋ณด์ | ์ ์ฉ OS๋ก ๊ฐ๋ ฅํ ๊ฒฉ๋ฆฌ | OS ๋ณด์์ ์์กดํ๋ ์ฝํ ๊ฒฉ๋ฆฌ |
์ ํต์ ์ธ ๊ฐ์ํ(VMware ๋ฑ)๋ ํธ์คํธ OS ์์ ์์ ํ ๊ฒ์คํธ OS๋ฅผ ์คํํ๋ ๋ฐฉ์์ผ๋ก, ํ๋์จ์ด๋ถํฐ OS๊น์ง ๋ชจ๋ ๊ณ์ธต์ ๊ฐ์ํํ๋ฏ๋ก ์์ ์๋ชจ๊ฐ ํฝ๋๋ค.
๋ฐ๋ฉด ๋์ปค๋ ํธ์คํธ OS์ ์ปค๋์ ๊ณต์ ํ๋ฉด์ ์ค๋ณต๋๋ OS ๋ถ๋ถ์ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ํ์ ์ฅ์ (๋ถ๋ฆฌ)์ ์ ์งํ๋ฉด์ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๋ค์์ผ๋ก ๋์ปค์ ํต์ฌ์ธ ์ด๋ฏธ์ง ๋ ์ด์ด ๊ตฌ์กฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ๋ด์ฉ์์๋ ๋์ปค ์ด๋ฏธ์ง์ ๋ ์ด์ด ๊ตฌ์กฐ, ์๋ ์๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๊ด๋ จ ๊ธฐ์ ์ ๊ฐ๋ ๋ค์ ๊น์ด ์๊ฒ ๋ค๋ฃจ์ด ๋ณด๊ฒ ์ต๋๋ค.

์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์คํ์ ํ์ํ ๋ชจ๋ ์์กด์ฑ์ ํฌํจํ ๋ ๋ฆฝ์ ์ธ ํจํค์ง์ ๋๋ค. ์ด ํจํค์ง์๋ ์ฝ๋, ๋ฐํ์, ์์คํ ๋๊ตฌ, ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๊ฐ์ฅ ์ค์ํ ํน์ง์ ๋ถ๋ณ์ฑ(Immutability)์ ๋๋ค. ์ด๋ฏธ์ง๊ฐ ํ ๋ฒ ์์ฑ๋๋ฉด ๊ทธ ๋ด์ฉ์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ, ์ด๋ฌํ ํน์ฑ์ ์ผ๊ด๋ ํ๊ฒฝ์ ๋ณด์ฅํ๊ณ , ๊ฐ๋ฐ์์ ํ ์คํธ, ํ๋ก๋์ ํ๊ฒฝ์ ์ด๋ฅด๊ธฐ๊น์ง ๋์ผํ ํ๊ฒฝ์ ์ ์งํ ์ ์๊ฒ ํด์ค๋๋ค.
๋์ปค ์ด๋ฏธ์ง๋ ์ฃผ๋ก Dockerfile์ ํตํด ์ ์๋ฉ๋๋ค. Dockerfile์ ๊ฐ ๋ช ๋ น์ด(FROM, RUN, COPY ๋ฑ)๋ ์ด๋ฏธ์ง์ ์๋ก์ด ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ฉฐ, ์ด๋ฌํ ๋ ์ด์ด ๊ตฌ์กฐ๊ฐ ๋์ปค์ ํจ์จ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.

๋์ปค ์ด๋ฏธ์ง๋ ์ฌ๋ฌ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๊ฐ ๋ ์ด์ด๋ ์ด์ ๋ ์ด์ด์ ๋ํ ๋ณ๊ฒฝ์ฌํญ๋ง์ ํฌํจํ๋ ์ฆ๋ถ(incremental) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
FROM alpine:latest
RUN apk update && apk add nodejs
RUN echo "console.log('Hello World')" > main.js
์ Dockerfile์ ์๋ก ๋ค๋ฉด:
1. ์ฒซ ๋ฒ์งธ ๋ ์ด์ด๋ alpine:latest ๋ฒ ์ด์ค ์ด๋ฏธ์ง์
๋๋ค.
2. ๋ ๋ฒ์งธ ๋ ์ด์ด๋ Node.js๋ฅผ ์ค์นํ๋ ๋ช
๋ น์ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค.
3. ์ธ ๋ฒ์งธ ๋ ์ด์ด๋ main.js ํ์ผ์ ์์ฑํ๋ ๋ช
๋ น์ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค.
์ค์ํ ์ ์ ๊ฐ ๋ ์ด์ด๊ฐ ์ด์ ๋ ์ด์ด์ ์ ์ฒด ๋ณต์ฌ๋ณธ์ด ์๋๋ผ, ์ค์ง ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ํฌํจํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ค๊ณ๋ ์ด๋ฏธ์ง ๋น๋ ์๊ฐ์ ๋จ์ถ์ํค๊ณ ์คํ ๋ฆฌ์ง ํจ์จ์ฑ์ ๋์ฌ์ค๋๋ค.
๋์ปค์ ๋ ์ด์ด๋ง ์์คํ ์ ์ด๋ฏธ์ง ์์ ์ ๋์ฑ ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ์ข๊ฒ ๋ง๋ญ๋๋ค. ์๋๋ ๊ทธ์ ๋ฐ๋ฅธ ์ด์ ๋ค ์ ๋๋ค.
๋์ปค ์ด๋ฏธ์ง์ ๋ชจ๋ ๋ ์ด์ด๋ ๋ถ๋ณ(immutable)์ ๋๋ค. ์ฆ, ํ๋ฒ ์์ฑ๋๋ฉด ์ฝ๊ธฐ ์ ์ฉ์ด ๋๋ฉฐ ์์ ํ ์ ์์ต๋๋ค. ์ด ๋ถ๋ณ์ฑ์ด ๋์ปค์ ํจ์จ์ฑ๊ณผ ์์ ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ปจํ ์ด๋์์ ํ์ผ์ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ปจํ ์ด๋๊ฐ ์์๋ ๋, ๋์ปค๋ ์ด๋ฏธ์ง์ ๋ชจ๋ ๋ ์ด์ด ์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ ์ด์ด(writable layer)๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ ์ด์ด๋ '์ปจํ ์ด๋ ๋ ์ด์ด' ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์ปจํ ์ด๋์ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ(ํ์ผ ์์ฑ, ์์ , ์ญ์ )์ด ์ด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค.
์์ ์ค์ผ ๋ ์งํ๋๋ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ด ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ ์ด์ด์๋ง ์ํฅ์ ๋ฏธ์น๊ณ , ์๋ณธ ์ด๋ฏธ์ง ๋ ์ด์ด๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ด ๋์ผํ ์ด๋ฏธ์ง์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์์ํ ์ ์๋ ์ด์ ์ ๋๋ค.
๋์ปค๋ ๋ ์ด์ด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด "Copy-on-Write(์ฐ๊ธฐ ์ ๋ณต์ฌ)" ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ธฐ์ ์ ์ปจํ ์ด๋๊ฐ ์ด๋ฏธ์ง์ ํ์ผ์ ์์ ํ๋ ค๊ณ ํ ๋๋ง ์๋ํฉ๋๋ค.
CoW์ ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๋ฉ์ปค๋์ฆ์ ์ฃผ์ ์ด์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ์ด์ ๋ค์ด ์กด์ฌํฉ๋๋ค.
๋์ปค ๋ ์ด์ด์ ๋ชจ๋ ๋ง๋ฒ์ ์ ๋์จ ํ์ผ ์์คํ ๋๋ถ์ ๊ฐ๋ฅํฉ๋๋ค. ์ ๋์จ ํ์ผ ์์คํ ์ ์ฌ๋ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ํ๋์ ํตํฉ๋ ๋๋ ํ ๋ฆฌ๋ก ํํํ ์ ์๊ฒ ํด์ฃผ๋ ํน๋ณํ ํ์ผ ์์คํ ์ ๋๋ค.
์ ๋์จ ๋ง์ดํธ(Union Mount)๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ์ ๋ณต์์ ํ์ผ ์์คํ ์ ํ๋์ ํ์ผ ์์คํ ์ผ๋ก ๋ง์ดํธํ๋ ๊ธฐ๋ฅ์ผ๋ก, ๋ ํ์ผ ์์คํ ์์ ๋์ผํ ํ์ผ์ด ์์ ๊ฒฝ์ฐ ๋์ค์ ๋ง์ดํธ๋ ํ์ผ ์์คํ ์ ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.
๋์ปค์์ ์ฌ์ฉ๋๋ ์ฃผ์ ์ ๋์จ ํ์ผ ์์คํ ๊ตฌํ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฌ ์ด๋ค ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง๋ docker info ๋ช
๋ น์ด๋ก ํ์ธํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋์ ์ค์ํ ํน์ฑ ์ค ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ฐ์ฑ(ephemeral)์ด๋ผ๋ ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ ํํ ๋ฌด์์ ์๋ฏธํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ปจํ
์ด๋๋ฅผ ์ค์ง(docker stop)ํ์ ๋
docker start ๋ช
๋ น์ผ๋ก ์ด์ ์ํ์์ ์ฌ์์ํ ์ ์์ต๋๋ค.์ปจํ
์ด๋๋ฅผ ์ ๊ฑฐ(docker rm)ํ์ ๋
์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋์ด ์ง์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
๋ณผ๋ฅจ(Volumes): ๋์ปค๊ฐ ๊ด๋ฆฌํ๋ ํธ์คํธ ํ์ผ ์์คํ ์ ์ผ๋ถ. ์ปจํ ์ด๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ฉฐ ์ฌ๋ฌ ์ปจํ ์ด๋ ๊ฐ ๊ณต์ ๊ฐ๋ฅ.
docker volume create data-volume
docker run -v data-volume:/app/data my-image
๋ฐ์ธ๋ ๋ง์ดํธ(Bind Mounts): ํธ์คํธ ํ์ผ ์์คํ ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋ ๋ด๋ถ๋ก ๋ง์ดํธ.
docker run -v /host/path:/container/path my-image
Docker Commit: ์ปจํ ์ด๋์ ํ์ฌ ์ํ๋ฅผ ์ ์ด๋ฏธ์ง๋ก ์ ์ฅ.
docker commit my-container my-new-image
๋์ปค ์ด๋ฏธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ๋ต:
๋ ์ด์ด ์ ์ต์ํ: Dockerfile ๋ช ๋ น์ด๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ AND(&&)๋ก ์ฐ๊ฒฐํฉ๋๋ค.
# ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ
RUN apt-get update
RUN apt-get install -y package1
# ํจ์จ์ ์ธ ๋ฐฉ๋ฒ
RUN apt-get update && apt-get install -y package1
๋ค๋จ๊ณ ๋น๋(Multi-stage builds) ์ฌ์ฉ: ๋น๋ ํ๊ฒฝ๊ณผ ์คํ ํ๊ฒฝ์ ๋ถ๋ฆฌํ์ฌ ์ต์ข ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
.dockerignore ํ์ผ ์ฌ์ฉ: ๋ถํ์ํ ํ์ผ์ด ์ด๋ฏธ์ง์ ํฌํจ๋์ง ์๋๋ก ํฉ๋๋ค.
๊ธฐ๋ณธ ์ด๋ฏธ์ง ์ ํ์ ์ฃผ์: ๊ฐ๋ฅํ ์์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง(alpine ๋ฑ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์บ์ ํ์ฉ: ์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ ์ด์ด๋ Dockerfile์ ํ๋ฐ๋ถ์ ๋ฐฐ์นํ์ฌ ๋น๋ ์บ์๋ฅผ ์ต๋ํ ํ์ฉํฉ๋๋ค.
๋์ปค ์ด๋ฏธ์ง ๋น๋์ ํต์ฌ์ธ Dockerfile๊ณผ ์ด๋ฏธ์ง ๋ ์ด์ด์ ์ํธ์์ฉ์ ์ดํดํ๋ฉด ํจ์จ์ ์ธ ์ปจํ ์ด๋ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
FROM alpine:3.18 # alpine์ ์ ์ฒด ๋ ์ด์ด ์ฒด์ธ์ ๊ฐ์ ธ์ดRUN apk add --no-cache nodejs # 5MB ํฌ๊ธฐ์ ์ ๋ ์ด์ด ์ถ๊ฐ
COPY app.js /app/ # ํ์ผ ๋ณต์ฌ ๋ ์ด์ด ์์ฑENV NODE_ENV=production # ํ๊ฒฝ๋ณ์ ์ค์ (๋ ์ด์ด ํฌ๊ธฐ 0B)๊ฒ์ฌ ๋๊ตฌ ๋น๊ต
| ํน์ฑ | docker history | docker inspect |
|---|---|---|
| ํ์ ๋ด์ฉ | ๋ชจ๋ ๋น๋ ๋ช ๋ น์ด ๊ธฐ๋ก | ์ค์ ํ์ผ ์์คํ ๋ ์ด์ด |
| Empty Layer ํ์ | โ (ํฌ๊ธฐ 0B๋ก ํ์) | โ |
| ์คํ ์์ | docker history my-image | docker inspect my-image |
| ์ถ๋ ฅ ํ์ | ํ ์ด๋ธ | JSON |
# docker history ์ถ๋ ฅ ์์
IMAGE CREATED COMMAND SIZE
d9eaf6fd6d0a 2 minutes ago /bin/sh -c #(nop) ENV 0B
a1b2c3d4e5f6 3 minutes ago COPY app.js /app/ 1.2kB
# ๋ ์ด์ด ์๋ณ์ ์์
sha256:38a8310d387e375e0ec6fabe047a9149e8eb214073db9f461fee6251fd936a75# ๋นํจ์จ์ ์์ (๋ ์ด์ด 3๊ฐ)
RUN apt-get update
RUN apt-get install -y python3
RUN rm -rf /var/lib/apt/lists/*
# ์ต์ ํ ์์ (๋ ์ด์ด 1๊ฐ)
RUN apt-get update && \
apt-get install -y python3 && \
rm -rf /var/lib/apt/lists/*
# ๋น๋ ์คํ
์ด์ง
FROM node:18 as builder
COPY . .
RUN npm install && npm run build # 1.2GB
# ์ต์ข
์คํ
์ด์ง
FROM node:18-alpine
COPY --from=builder /app/dist ./ # 150MB
โ ๊ฒฐ๊ณผ: ์ด๋ฏธ์ง ํฌ๊ธฐ 87% ๊ฐ์
node_modules/
.git/
*.log
โ ๋ถํ์ ํ์ผ ์ ์ธ๋ก ๋ ์ด์ด ํฌ๊ธฐ ๊ฐ์
# ์บ์ ์นํ์ ๊ตฌ์กฐ
COPY package.json .
RUN npm install # ํจํค์ง ๋ณ๊ฒฝ์๋ง ์ฌ์คํ
COPY . .
โ ์์ค ์ฝ๋ ๋ณ๊ฒฝ ์ package.json ๋ ์ด์ด ์บ์ ์ ์ง
FROM alpine
LABEL maintainer="dev@example.com" # Empty Layer 1
ENV APP_ENV=production # Empty Layer 2
COPY app.js /app/ # 120kB ๋ ์ด์ด
CMD ["node", "/app/app.js"] # Empty Layer 3
โ docker history ์ถ๋ ฅ์ 4๊ฐ ๋ ์ด์ด (3 Empty + 1 Real)
docker image prune -a๋ก ๋ฏธ์ฌ์ฉ ๋ ์ด์ด ์ ๋ฆฌdive ๋๊ตฌ๋ก ๋ ์ด์ด๋ณ ์ทจ์ฝ์ ์ค์บ๋์ปค ์ด๋ฏธ์ง ๋ ์ด์ด ๊ตฌ์กฐ๋ฅผ ๋ง์คํฐํ๋ ค๋ฉด ๋ค์ ์์น์ ์ค์ํด์ผ ํฉ๋๋ค:
1. ๋ ์ด์ด ์ ์ต์ํ: ๊ด๋ จ ๋ช
๋ น์ด ํตํฉ
2. ์บ์ ํ์ฉ ๊ทน๋ํ: ๋ณ๊ฒฝ ๋น๋์ ๋ฐ๋ฅธ ๋ช
๋ น์ด ๋ฐฐ์น
3. ๋ณด์ ๊ณ ๋ ค: ์ต์ ๊ถํ ์์น ์ ์ฉ
4. ์ง์์ ๋ชจ๋ํฐ๋ง: dive, docker-slim ๋ฑ ๋๊ตฌ ํ์ฉ
์ด ๊ธ์์๋ ๋์ปค์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ ๋ฉํฐ์คํ ์ด์ง(Multi-stage) ๋น๋์ ๋ํด ์์ธํ ์์๋ณด๊ณ , ์ด๋ป๊ฒ ์ด๋ฏธ์ง ์ต์ ํ์ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋๋ ํ๋์ Dockerfile ๋ด์์ ์ฌ๋ฌ FROM ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋จ๊ณ(stage)๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๋ฐฉ์์ ๋๋ค. ๊ฐ ๋จ๊ณ๋ ๋ ๋ฆฝ์ ์ธ ๋น๋ ํ๊ฒฝ์ผ๋ก, ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์ ๋จ๊ณ๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋์ปค์ ๋ฉํฐ์คํ ์ด์ง ๊ธฐ๋ฅ์ ๋์ปค 17.05 ๋ฒ์ ๋ถํฐ ๋์ ๋์์ผ๋ฉฐ, ์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ธฐ ์ ์๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ Dockerfile์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋์ ํต์ฌ์ ๋น๋ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฌผ๋ง ์ต์ข ์ด๋ฏธ์ง์ ํฌํจ์ํค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด Go ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ๋, ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์๋ Go ์ปดํ์ผ๋ฌ์ ๋ชจ๋ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ํฌํจํ ํฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , ๋ ๋ฒ์งธ ๋จ๊ณ์์๋ ๋งค์ฐ ์์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ์ปดํ์ผ๋ ์คํ ํ์ผ๋ง ๋ณต์ฌํ๋ ๋ฐฉ์์ ๋๋ค.
๋ค์์ ๊ธฐ๋ณธ์ ์ธ ๋ฉํฐ์คํ ์ด์ง Dockerfile์ ์์์ ๋๋ค:
# ์ฒซ ๋ฒ์งธ ์คํ
์ด์ง: ๋น๋ ํ๊ฒฝ
FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
# ๋ ๋ฒ์งธ ์คํ
์ด์ง: ์ต์ข
์ด๋ฏธ์ง
FROM alpine:latest
COPY --from=builder /app/main /app/
CMD ["/app/main"]
์ ์์์์๋ ์ฒซ ๋ฒ์งธ ์คํ ์ด์ง์์ Go ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ํ, ๋ ๋ฒ์งธ ์คํ ์ด์ง์์๋ Alpine Linux๋ผ๋ ๋งค์ฐ ์์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๋ ์คํ ํ์ผ๋ง ๋ณต์ฌํฉ๋๋ค. ์ด ๋ฐฉ์์ ํตํด ์ต์ข ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ต์ข ์ด๋ฏธ์ง ํฌ๊ธฐ์ ํ๊ธฐ์ ์ธ ๊ฐ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, Go ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋จ์ผ ์คํ ์ด์ง ์ด๋ฏธ์ง๋ ์ฝ 840MB์ ๋ฌํ ์ ์์ง๋ง, ๋ฉํฐ์คํ ์ด์ง ๋น๋๋ฅผ ์ฌ์ฉํ๋ฉด 12MB ์ ๋๋ก ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ์ปจํ ์ด๋ ๋ค์ด๋ก๋ ์๊ฐ, ์ ์ฅ ๊ณต๊ฐ, ์์ ์๊ฐ ๋ชจ๋์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ต์ข ์ด๋ฏธ์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ํ์ผ๋ง ํฌํจ๋๋ฏ๋ก ๊ณต๊ฒฉ ํ๋ฉด์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค. ์์ค ์ฝ๋, ๋น๋ ๋๊ตฌ, ์์ ํ์ผ ๋ฑ ๋ถํ์ํ ์์๋ค์ด ์ ๊ฑฐ๋์ด ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ด ๊ฐ์ํฉ๋๋ค. ์ด๋ ์ปจํ ์ด๋ ๋ณด์์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋ ์ด์ ์๋ ๊ฐ๋ฐ์๋ค์ด ๋น๋์ฉ๊ณผ ๋ฐฐํฌ์ฉ์ผ๋ก ๋ ๊ฐ์ Dockerfile์ ๊ด๋ฆฌํด์ผ ํ์ต๋๋ค. ๋ฉํฐ์คํ ์ด์ง๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ Dockerfile์ ๋ชจ๋ ๋น๋ ๋จ๊ณ๋ฅผ ์ ์ํ ์ ์์ด ๊ด๋ฆฌ๊ฐ ๋จ์ํด์ง๊ณ ์ผ๊ด์ฑ์ด ๋์์ง๋๋ค.
Docker BuildKit์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ์ด ์๋ ์คํ ์ด์ง๋ฅผ ๋ณ๋ ฌ๋ก ๋น๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ๋น๋ ์๊ฐ์ ๋จ์ถํ ์ ์์ผ๋ฉฐ, ํจ์จ์ ์ธ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฐ๋ณต์ ์ธ ๋น๋ ์๊ฐ๋ ์ค์ผ ์ ์์ต๋๋ค.
# ๋ณ๋ ฌ ๋น๋ ์์
FROM docker-image as deps
RUN commands-that-builds-dependencies
FROM deps as server
RUN command-that-builds-app-server
FROM deps as client
RUN command-that-builds-app-client
์ ์์์์ server์ client ์คํ ์ด์ง๋ deps ์คํ ์ด์ง๊ฐ ์๋ฃ๋ ํ ๋ณ๋ ฌ๋ก ๋น๋๋ ์ ์์ต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋๋ ํนํ ์ปดํ์ผ ์ธ์ด๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํฉ๋๋ค. Go, Java, C/C++ ๋ฑ์ ์ธ์ด๋ ์ปดํ์ผ ๊ณผ์ ์์ ๋ค์ํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ์ง๋ง, ์คํ ์์๋ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
Go ์ธ์ด๋ ๋ฉํฐ์คํ ์ด์ง ๋น๋์ ์ด์ ์ ๊ทน๋ํํ ์ ์์ต๋๋ค. Go๋ ์ ์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ด, ์คํ ํ๊ฒฝ์ ์ถ๊ฐ ์ข ์์ฑ์ด ๊ฑฐ์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
# ๋น๋ ์คํ
์ด์ง
FROM golang:1.23 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
# ์ต์ข
์คํ
์ด์ง
FROM scratch
COPY --from=build /app/app /
ENTRYPOINT ["/app"]
์ด ์์์์๋ ์ฒซ ๋ฒ์งธ ์คํ ์ด์ง์์ Go ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผํ๊ณ , ๋ ๋ฒ์งธ ์คํ ์ด์ง์์๋ 'scratch'๋ผ๋ ์์ ํ ๋น ์ด๋ฏธ์ง์ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ๋ง ๋ณต์ฌํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ต์ข ์ด๋ฏธ์ง ํฌ๊ธฐ๋ ๋ช MB์ ๋ถ๊ณผํฉ๋๋ค.
Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ์๋ ๋ฉํฐ์คํ ์ด์ง ๋น๋๊ฐ ์ ์ฉํฉ๋๋ค. Maven์ด๋ Gradle๋ก ๋น๋ํ ํ, JRE๋ง ํฌํจ๋ ์ด๋ฏธ์ง๋ก JAR ํ์ผ์ ๋ณต์ฌํ์ฌ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
# ๋น๋ ์คํ
์ด์ง
FROM eclipse-temurin:21-jdk-jammy AS build
WORKDIR /build
COPY --chmod=0755 mvnw mvnw
COPY .mvn/ .mvn/
COPY ./src src/
COPY pom.xml .
RUN ./mvnw package -DskipTests
# ๋ฐํ์ ์คํ
์ด์ง
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=build /build/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
์ด ์์์์๋ ์ฒซ ๋ฒ์งธ ์คํ ์ด์ง์์ JDK๋ฅผ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ , ๋ ๋ฒ์งธ ์คํ ์ด์ง์์๋ JRE๋ง ํฌํจ๋ ๋ ์์ ์ด๋ฏธ์ง์ ๋น๋๋ JAR ํ์ผ๋ง ๋ณต์ฌํฉ๋๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๋ ๋ฉํฐ์คํ ์ด์ง ๋น๋๊ฐ ํ์ฉ๋ฉ๋๋ค. Node.js ํ๊ฒฝ์์ React๋ Vue.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ํ, ์ ์ ํ์ผ๋ง Nginx ์ด๋ฏธ์ง๋ก ๋ณต์ฌํ์ฌ ๊ฐ๋ฒผ์ด ์น ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
# ๋น๋ ์คํ
์ด์ง
FROM node:22-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# ๋ฐํ์ ์คํ
์ด์ง
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
ENTRYPOINT ["nginx", "-g", "daemon off;"]
์ด ์์์์๋ ์ฒซ ๋ฒ์งธ ์คํ ์ด์ง์์ Node.js ํ๊ฒฝ์ผ๋ก React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ , ๋ ๋ฒ์งธ ์คํ ์ด์ง์์๋ Nginx ์ด๋ฏธ์ง์ ๋น๋๋ ์ ์ ํ์ผ๋ง ๋ณต์ฌํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Node.js ๋ฐํ์์ด๋ npm ํจํค์ง๊ฐ ์๋ ์์ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ฉ๋๋ค.
์คํฌ๋์น(scratch)๋ ๋น ์ด๋ฏธ์ง๋ก, ์ด๋ค ํ์ผ ์์คํ ์ด๋ ์๋ ํฌํจํ์ง ์์ ๊ฐ์ฅ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Go๋ Rust์ ๊ฐ์ด ์ ์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ ์ธ์ด์ ํนํ ์ ํฉํฉ๋๋ค.
FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
FROM scratch
COPY --from=builder /app/main /
CMD ["/main"]
๋จ, ์คํฌ๋์น ์ด๋ฏธ์ง๋ ์์ด๋ ๋๋ฒ๊น ๋๊ตฌ๊ฐ ์์ด ๋ฌธ์ ํด๊ฒฐ์ด ์ด๋ ค์ธ ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๋ฉํฐ์คํ
์ด์ง ๋น๋๋ ํน์ ์คํ
์ด์ง๋ถํฐ ๋น๋ํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค. docker build --target ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ํน์ ์คํ
์ด์ง๊น์ง๋ง ๋น๋ํ ์ ์์ด, ๋๋ฒ๊น
์ด๋ ํ
์คํธ์ ์ ์ฉํฉ๋๋ค.
# ๊ฐ๋ฐ ๋จ๊ณ๋ง ๋น๋
docker build --target development -t myapp:dev .
์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ํ๋์ Dockerfile๋ก ๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ ํ๊ฒฝ์ ๋ง๋ ๋ค์ํ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํจ์จ์ ์ธ ๋น๋๋ฅผ ์ํด ์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ ์ด์ด์ ๊ทธ๋ ์ง ์์ ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํนํ ์์กด์ฑ ํ์ผ(package.json, requirements.txt ๋ฑ)์ ๋จผ์ ๋ณต์ฌํ๊ณ ์์กด์ฑ์ ์ค์นํ ํ, ์์ค ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ฉด ์บ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
# ์์กด์ฑ ๋ ์ด์ด ๋ถ๋ฆฌ ์์
FROM node:22-slim AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# ๋น๋ ์คํ
์ด์ง
FROM deps AS build
WORKDIR /app
COPY . .
RUN npm run build
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์์ค ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์์กด์ฑ ๋ ์ด์ด๋ ์บ์์์ ์ฌ์ฌ์ฉ๋๋ฏ๋ก ๋น๋ ์๊ฐ์ด ๋จ์ถ๋ฉ๋๋ค.
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ง์ํ๋ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ๋ฉํฐ์คํ ์ด์ง ๋น๋๋ฅผ ํตํด ๊ฐ๋ฐ ์ข ์์ฑ์ ์ ์ธํ๊ณ ํ๋ก๋์ ์ ํ์ํ ํ์ผ๋ง ํฌํจํ ์ ์์ต๋๋ค.
# ์์กด์ฑ ์คํ
์ด์ง
FROM node:22-slim AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# ํ
์คํธ ์คํ
์ด์ง
FROM deps AS test
WORKDIR /app
RUN npm run test
# ๋น๋ ์คํ
์ด์ง
FROM deps AS build
WORKDIR /app
COPY . .
RUN npm run build
# ๋ฐํ์ ์คํ
์ด์ง
FROM node:22-slim AS runtime
WORKDIR /app
COPY --from=build /app/public ./public
COPY --from=build /app/.next/standalone ./
COPY --from=build /app/.next/static ./.next/static
ENV NODE_ENV=production
EXPOSE 3000
USER node
CMD ["node", "server.js"]
์ด ์์์์๋ ์์กด์ฑ ์ค์น, ํ ์คํธ, ๋น๋, ๋ฐํ์ ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ ๋จ๊ณ์ ํ์ํ ์์๋ง ํฌํจํ๋ ์ต์ ํ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
Java Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ Maven์ด๋ Gradle์ ์ฌ์ฉํ์ฌ ๋น๋๋๋ฉฐ, ๋ฉํฐ์คํ ์ด์ง ๋น๋๋ฅผ ํตํด JDK ๋์ JRE๋ง ํฌํจ๋ ๋ ์์ ๋ฐํ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
# ๋น๋ ์คํ
์ด์ง
FROM eclipse-temurin:21-jdk-jammy AS build
WORKDIR /build
COPY . .
RUN ./mvnw package -DskipTests && \
mv target/*.jar target/app.jar
# ์ถ์ถ ์คํ
์ด์ง
FROM build AS extract
WORKDIR /build
RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted
# ๋ฐํ์ ์คํ
์ด์ง
FROM eclipse-temurin:21-jre-jammy AS runtime
WORKDIR /app
COPY --from=extract /build/target/extracted/dependencies/ ./
COPY --from=extract /build/target/extracted/spring-boot-loader/ ./
COPY --from=extract /build/target/extracted/snapshot-dependencies/ ./
COPY --from=extract /build/target/extracted/application/ ./
EXPOSE 8080
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
์ด ์์์์๋ Spring Boot์ ๋ ์ด์ด ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ JAR ํ์ผ์ ์ฌ๋ฌ ๋ ์ด์ด๋ก ์ถ์ถํ๊ณ , ๋ฐํ์ ์ด๋ฏธ์ง์ ํ์ํ ๋ ์ด์ด๋ง ๋ณต์ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ ์ด์ด ์บ์ฑ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฉํฐ์คํ ์ด์ง ๋น๋๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค:
๋ฐ๋ฉด, ์ธํฐํ๋ฆฌํฐ ์ธ์ด(Python, Ruby, PHP ๋ฑ)๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฉํฐ์คํ ์ด์ง ๋น๋์ ์ด์ ์ด ์๋์ ์ผ๋ก ์ ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ธ์ด๋ ์คํ ์ ์์ค ์ฝ๋์ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ชจ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ผ์๋ ๊ฐ๋ฐ ์ข ์์ฑ๊ณผ ํ๋ก๋์ ์ข ์์ฑ์ ๋ถ๋ฆฌํ๋ ๋ฐ ๋ฉํฐ์คํ ์ด์ง๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.