์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿณ ๋„์ปค๋ฅผ ์ด์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ž๋™ํ™” ๐Ÿš€

๐Ÿณ ๋„์ปค๋ฅผ ์ด์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ž๋™ํ™” ๐Ÿš€

๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„์ปค ๋ฐฐํฌ ์ž๋™ํ™” ์™„์ „์ •๋ณต!

๋„์ปค ์ž๋™ ๋ฐฐํฌ ์ฝ”๋“œ โ†’ ๋นŒ๋“œ โ†’ ์ปจํ…Œ์ด๋„ˆ โ†’ ๋ฐฐํฌ โ†’ ์™„๋ฃŒ ์ฝ”๋“œ ๋นŒ๋“œ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ ์™„๋ฃŒ $ docker run -d -p 80:80 my-webapp ๋ฐฐํฌ ์™„๋ฃŒ

๐Ÿ“Œ ์•ˆ๋…•ํ•˜์„ธ์š”, ๋„์ปค ์„ธ๊ณ„๋กœ ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์—ฌ๋Ÿฌ๋ถ„~ ์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ์ •๋ง ํ•ซํ•œ ์ฃผ์ œ์ธ ๋„์ปค(Docker)๋ฅผ ์ด์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ž๋™ํ™”์— ๋Œ€ํ•ด ํ•จ๊ป˜ ์•Œ์•„๋ณผ๊ฒŒ์š”! ใ…‹ใ…‹ใ…‹ ์–ด๋ ต๊ฒŒ ๋“ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฑฑ์ • ๋…ธ๋…ธ~! ์ดˆ๋ณด์ž๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿค“

์š”์ฆ˜ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ "๋„์ปค ์•ˆ ์“ฐ๋ฉด ์™•๊ณ ์ˆ˜ ์•„๋‹˜" ์ด๋ผ๋Š” ๋ง์ด ์žˆ์„ ์ •๋„๋กœ ๋„์ปค๋Š” ํ•„์ˆ˜ ์Šคํ‚ฌ์ด ๋˜์—ˆ์–ด์š”. ํŠนํžˆ ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋„์ปค๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ์ž๋™ํ™”๋Š” ์ง„์งœ ๊ฟ€ํŒ ์ค‘์— ๊ฟ€ํŒ! ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ๋„์ปค ๊ด€๋ จ ์žฌ๋Šฅ์ด ์—„์ฒญ ์ธ๊ธฐ๋ผ๋”๋ผ๊ตฌ์š”. ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‹œ๊ฐ„์„ ํ™• ์ค„์—ฌ์ฃผ๋‹ˆ๊นŒ์š”! ๐Ÿ˜Ž

์ด ๊ธ€์„ ๋‹ค ์ฝ๊ณ  ๋‚˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„๋„ "๋„์ปค ๋งˆ์Šคํ„ฐ"๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿณ ๋„์ปค๊ฐ€ ๋ญ๊ธธ๋ž˜ ๋‹ค๋“ค ๋‚œ๋ฆฌ์ธ๊ฐ€์š”?

๋„์ปค๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿค—

๋„์ปค๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ์ƒ์ž์— ๋‹ด์•„์„œ ์–ด๋””์„œ๋“  ๋˜‘๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด์—์š”. ๋งˆ์น˜ ์—ฌ๋Ÿฌ๋ถ„์ด ์ด์‚ฌํ•  ๋•Œ ์ง์„ ๋ฐ•์Šค์— ๋‹ด์•„์„œ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ โžก๏ธ๐Ÿข

Node.js MongoDB Redis ๋„์ปค ์ปจํ…Œ์ด๋„ˆ

๋„์ปค๊ฐ€ ์—†๋˜ ์‹œ์ ˆ์—๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋Ÿฐ ๋ง์„ ์ž์ฃผ ํ–ˆ์–ด์š”. "๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ...?" ใ…‹ใ…‹ใ…‹ ๋„ˆ๋ฌด ์ต์ˆ™ํ•œ ๋ง์ด์ฃ ? ๐Ÿ˜…

ํ•˜์ง€๋งŒ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์‹น~ ์‚ฌ๋ผ์ ธ์š”! ์™œ๋ƒํ•˜๋ฉด ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(์ฝ”๋“œ, ๋Ÿฐํƒ€์ž„, ์‹œ์Šคํ…œ ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋“ , ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด๋“ , ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์ด๋“  ์–ด๋””์„œ๋“  ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘

๐Ÿค” ๋„์ปค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์—ฌ๋Ÿฌ๋ถ„! ์™œ ๋„์ปค๋ฅผ ์จ์•ผ ํ• ๊นŒ์š”? ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค! ๐Ÿง

  1. ์ผ๊ด€์„ฑ ์žˆ๋Š” ํ™˜๊ฒฝ: "๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋˜๋Š”๋ฐ..." ๋ผ๋Š” ๋ง ์ด์ œ ์•ˆ๋…•~ ๐Ÿ‘‹ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์š”.
  2. ๋น ๋ฅธ ๋ฐฐํฌ: ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ€๋ณ๊ณ  ์‹œ์ž‘์ด ๋นจ๋ผ์„œ ๋ฐฐํฌ ์‹œ๊ฐ„์ด ์—„์ฒญ ๋‹จ์ถ•๋ผ์š”! โšก
  3. ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ: ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์–ด ์ถฉ๋Œ ๊ฑฑ์ • ์—†์Œ! ๐Ÿ›ก๏ธ
  4. ํ™•์žฅ์„ฑ: ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‰ฝ๊ฒŒ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์–ด์š”. ๋Œ€๋ฐ•! ๐Ÿ“ˆ
  5. ๋ฒ„์ „ ๊ด€๋ฆฌ: ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋ฒ„์ „์„ ๋งค๊ฒจ์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์š”. ๋กค๋ฐฑ๋„ ๊ฐ€๋Šฅ! ๐Ÿ”„

์ด๋Ÿฐ ์žฅ์ ๋“ค ๋•Œ๋ฌธ์— ์š”์ฆ˜ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ๋Š” "๋„์ปค ๋ชจ๋ฅด๋ฉด ๊ฐœ๋ฐœ์ž ์•„๋‹˜" ์ด๋ผ๋Š” ๋ง์ด ๋‚˜์˜ฌ ์ •๋„๋ž๋‹ˆ๋‹ค! ๊ณผ์žฅ์ด๊ธด ํ•˜์ง€๋งŒ, ๊ทธ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑฐ์ฃ ! ๐Ÿ˜‰

๐Ÿ› ๏ธ ๋„์ปค ์„ค์น˜ํ•˜๊ธฐ

์ž, ์ด์ œ ๋„์ปค๋ฅผ ์„ค์น˜ํ•ด๋ณผ๊นŒ์š”? ์šด์˜์ฒด์ œ๋ณ„๋กœ ์„ค์น˜ ๋ฐฉ๋ฒ•์ด ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์š”! ๐Ÿ–ฅ๏ธ

Windows์— ์„ค์น˜ํ•˜๊ธฐ

์œˆ๋„์šฐ ์œ ์ €๋ผ๋ฉด Docker Desktop for Windows๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. WSL 2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์•„์š”! ์„ค์น˜ ํ›„ ์žฌ๋ถ€ํŒ…ํ•˜๋ฉด ๋! ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

Mac์— ์„ค์น˜ํ•˜๊ธฐ

๋งฅ ์œ ์ €๋ผ๋ฉด Docker Desktop for Mac์„ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. ์„ค์น˜ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ  Applications ํด๋”๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ๋! ์• ํ”Œ ๋‹ต๊ฒŒ ์‹ฌํ”Œํ•˜์ฃ ? ๐ŸŽ

Linux์— ์„ค์น˜ํ•˜๊ธฐ

๋ฆฌ๋ˆ…์Šค ์œ ์ €๋ผ๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋„์ปค๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?

docker --version

๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด ์„ฑ๊ณต์ด์—์š”! ๐ŸŽ‰

๐Ÿ“ฆ ๋„์ปค ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ด์š”! ์–ด๋ ต์ง€ ์•Š์œผ๋‹ˆ ๊ฑฑ์ • ๋งˆ์„ธ์š”~ ๐Ÿ˜Š

Dockerfile ์ด๋ฏธ์ง€ (Image) ์ปจํ…Œ์ด๋„ˆ (Container) ๋ณผ๋ฅจ (Volume)

1. Dockerfile

Dockerfile์€ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„์˜ˆ์š”. ์—ฌ๊ธฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ช…๋ น์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์š”. ๋งˆ์น˜ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ ๊ฐ™์€ ๊ฑฐ์ฃ ! ๐Ÿณ

2. ์ด๋ฏธ์ง€ (Image)

์ด๋ฏธ์ง€๋Š” Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ฝ๊ธฐ ์ „์šฉ ํ…œํ”Œ๋ฆฟ์ด์—์š”. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(์ฝ”๋“œ, ๋Ÿฐํƒ€์ž„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ)์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์š”. ๋งˆ์น˜ ์š”๋ฆฌ์˜ ์žฌ๋ฃŒ๋ฅผ ๋ชจ๋‘ ์ค€๋น„ํ•ด๋†“์€ ์ƒํƒœ๋ž„๊นŒ์š”? ๐Ÿฅ•๐Ÿง…๐Ÿฅฉ

3. ์ปจํ…Œ์ด๋„ˆ (Container)

์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ธ์Šคํ„ด์Šค์˜ˆ์š”. ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋ผ์š”. ์š”๋ฆฌ๋กœ ์น˜๋ฉด ์™„์„ฑ๋œ ์š”๋ฆฌ ํ•œ ์ ‘์‹œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿฒ

4. ๋ณผ๋ฅจ (Volume)

๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด์—์š”. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋ผ์š”. ๋ƒ‰์žฅ๊ณ ์— ๋‚จ์€ ์Œ์‹์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐ŸงŠ

5. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Registry)

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ์ €์žฅ์†Œ์˜ˆ์š”. Docker Hub๊ฐ€ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜์ฃ ! ๋งˆ์น˜ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์›น์‚ฌ์ดํŠธ ๊ฐ™์€ ๊ฑฐ์˜ˆ์š”! ๐Ÿ“š

์ด ๊ฐœ๋…๋“ค๋งŒ ์ดํ•ดํ•˜๋ฉด ๋„์ปค์˜ ๊ธฐ๋ณธ์€ ๋งˆ์Šคํ„ฐํ•œ ๊ฑฐ๋‚˜ ๋‹ค๋ฆ„์—†์–ด์š”! ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Ž

๐Ÿ“ ์ฒซ ๋ฒˆ์งธ Dockerfile ๋งŒ๋“ค๊ธฐ

์ด์ œ ์‹ค์ œ๋กœ Dockerfile์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? ๊ฐ„๋‹จํ•œ Node.js ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ์š”! ๐Ÿš€

๋จผ์ €, ํ”„๋กœ์ ํŠธ ํด๋”์— Dockerfile์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”:

# Node.js ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ
FROM node:14

# ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
WORKDIR /usr/src/app

# ์•ฑ ์˜์กด์„ฑ ์„ค์น˜
# package.json๊ณผ package-lock.json์„ ๋ชจ๋‘ ๋ณต์‚ฌ
COPY package*.json ./

RUN npm install

# ์•ฑ ์†Œ์Šค ๋ณต์‚ฌ
COPY . .

# ์•ฑ์ด ์‚ฌ์šฉํ•  ํฌํŠธ ์„ค์ •
EXPOSE 8080

# ์•ฑ ์‹คํ–‰ ๋ช…๋ น
CMD [ "node", "app.js" ]

์šฐ์™€! ์ฒซ ๋ฒˆ์งธ Dockerfile์„ ๋งŒ๋“ค์—ˆ์–ด์š”! ๐Ÿ‘ ์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  1. FROM node:14: Node.js ๋ฒ„์ „ 14 ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด์—์š”.
  2. WORKDIR /usr/src/app: ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์ž‘์—…ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด์š”.
  3. COPY package*.json ./: package.json ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ด์š”.
  4. RUN npm install: ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์š”.
  5. COPY . .: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ด์š”.
  6. EXPOSE 8080: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ค˜์š”.
  7. CMD [ "node", "app.js" ]: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ˆ์š”.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! ์žฌ๋Šฅ๋„ท์—์„œ๋„ ์ด๋Ÿฐ ๋„์ปค ๊ด€๋ จ ์ง€์‹์„ ๊ณต์œ ํ•˜๋Š” ๋ถ„๋“ค์ด ๋งŽ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ตฌ์š”. ์—ญ์‹œ ํ•ซํ•œ ๊ธฐ์ˆ ์ด์ฃ ! ๐Ÿ”ฅ

๐Ÿ—๏ธ ๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ธฐ

Dockerfile์„ ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ ์ด์ œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

docker build -t my-node-app .

์ด ๋ช…๋ น์–ด๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(.)์— ์žˆ๋Š” Dockerfile์„ ์‚ฌ์šฉํ•ด์„œ my-node-app์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์š”. -t ์˜ต์…˜์€ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ(์ด๋ฆ„)๋ฅผ ๋ถ™์ด๋Š” ์—ญํ• ์„ ํ•ด์š”! ๐Ÿ˜Š

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?

docker images

๋ชฉ๋ก์— my-node-app์ด ๋ณด์ธ๋‹ค๋ฉด ์„ฑ๊ณต์ด์—์š”! ์ง์ง์ง! ๐Ÿ‘

REPOSITORY TAG IMAGE ID CREATED SIZE my-node-app latest a1b2c3d4e5f6 2 minutes ago 950MB

๐Ÿš€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ํ•˜๊ธฐ

์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด์ œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”:

docker run -p 8080:8080 my-node-app

์ด ๋ช…๋ น์–ด๋Š” my-node-app ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 8080 ํฌํŠธ์— ์—ฐ๊ฒฐํ•ด์š”. ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080์— ์ ‘์†ํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”! ๋Œ€๋ฐ•! ๐Ÿ˜ฒ

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด -d ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด๋ณด์„ธ์š”:

docker run -d -p 8080:8080 my-node-app

์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”:

docker ps

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”:

docker stop [CONTAINER_ID]

์—ฌ๊ธฐ์„œ [CONTAINER_ID]๋Š” docker ps ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•œ ์ปจํ…Œ์ด๋„ˆ ID์˜ˆ์š”. ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”! ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜„

๐Ÿ”„ ๋„์ปค ์ปดํฌ์ฆˆ๋กœ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌํ•˜๊ธฐ

์‹ค์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณดํ†ต ์—ฌ๋Ÿฌ ์„œ๋น„์Šค(์›น ์„œ๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ ๋“ฑ)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์š”. ์ด๋Ÿฐ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ Docker Compose์˜ˆ์š”! ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— docker-compose.yml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด์„ธ์š”:

version: '3'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

์ด ํŒŒ์ผ์€ ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค(web, db)๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์–ด์š”:

  1. web: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ Dockerfile์„ ์‚ฌ์šฉํ•ด ๋นŒ๋“œํ•˜๊ณ , 8080 ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•ด์š”.
  2. db: MongoDB ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , 27017 ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ๋ฅจ์— ์ €์žฅํ•ด์š”.

์ด์ œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ํ•œ ๋ฒˆ์— ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”:

docker-compose up

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด -d ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

docker-compose up -d

๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

docker-compose down

์ด๋ ‡๊ฒŒ Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”! ์ง„์งœ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์˜ ์งˆ์ด ํ™• ์˜ฌ๋ผ๊ฐ€๋Š” ๋А๋‚Œ! ๐Ÿš€

Web ์„œ๋น„์Šค DB ์„œ๋น„์Šค Cache ์„œ๋น„์Šค Message Queue Docker Compose๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์„œ๋น„์Šค๋“ค

๐Ÿ”„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ปค ํ†ตํ•ฉํ•˜๊ธฐ

์ด์ œ ๋„์ปค๋ฅผ CI/CD(์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ) ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ด๋ณผ๊นŒ์š”? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ๋ณ€๊ฒฝ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿค–

์—ฌ๊ธฐ์„œ๋Š” GitHub Actions๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ์š”. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .github/workflows/docker-deploy.yml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด์„ธ์š”:

name: Docker Deploy

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}
    
    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: yourusername/your-app:latest
    
    - name: Deploy to server
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        key: ${{ secrets.SSH_KEY }}
        script: |
          docker pull yourusername/your-app:latest
          docker stop your-app || true
          docker rm your-app || true
          docker run -d -p 8080:8080 --name your-app yourusername/your-app:latest

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•ด์š”:

  1. main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์‹œ์ž‘๋ผ์š”.
  2. DockerHub์— ๋กœ๊ทธ์ธํ•ด์š”.
  3. ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  DockerHub์— ํ‘ธ์‹œํ•ด์š”.
  4. SSH๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ณ , ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰ํ•ด์š”.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์š”! ๊ฐœ๋ฐœ์ž์˜ ๊ฟˆ์ด ํ˜„์‹ค์ด ๋˜๋Š” ์ˆœ๊ฐ„์ด์ฃ ! ๐Ÿ˜

์ฝ”๋“œ ํ‘ธ์‹œ ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐฐํฌ CI/CD ํŒŒ์ดํ”„๋ผ์ธ

๐Ÿ” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ

๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ์—ฌ๋Ÿฌ ๋„๊ตฌ ์ค‘์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ์š”! ๐Ÿ“Š

1. Docker Stats

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ, ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”:

docker stats

์ด ๋ช…๋ น์–ด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์„ ๋ณด์—ฌ์ค˜์š”.

2. cAdvisor

Google์—์„œ ๋งŒ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ, ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”:

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

์‹คํ–‰ ํ›„ http://localhost:8080์— ์ ‘์†ํ•˜๋ฉด ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”.

3. Prometheus + Grafana

๋” ๊ฐ•๋ ฅํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์›ํ•œ๋‹ค๋ฉด Prometheus์™€ Grafana๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. Docker Compose๋กœ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:

version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
  
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus

์ด๋ ‡๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”! ์ง„์งœ ํ”„๋กœ ๊ฐœ๋ฐœ์ž์˜ ํ•„์ˆ˜ ์Šคํ‚ฌ์ด์ฃ ! ๐Ÿ˜Ž

๐Ÿ”’ ๋„์ปค ๋ณด์•ˆ ๊ฐ•ํ™”ํ•˜๊ธฐ

๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šด์˜ํ•  ๋•Œ ๋ณด์•ˆ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”! ๋ช‡ ๊ฐ€์ง€ ๋ณด์•ˆ ๊ฐ•ํ™” ํŒ์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿ›ก๏ธ

  1. ์ตœ์†Œ ๊ถŒํ•œ ์›์น™: ์ปจํ…Œ์ด๋„ˆ์— ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•˜์„ธ์š”. --cap-drop=ALL๋กœ ๋ชจ๋“  ๊ถŒํ•œ์„ ์ œ๊ฑฐํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒƒ๋งŒ --cap-add๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  2. ๋น„๋ฃจํŠธ ์‚ฌ์šฉ์ž ์‚ฌ์šฉ: Dockerfile์—์„œ USER ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋น„๋ฃจํŠธ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.
  3. ์ด๋ฏธ์ง€ ์Šค์บ๋‹: Trivy, Clair ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ด๋ฏธ์ง€์˜ ์ทจ์•ฝ์ ์„ ์Šค์บ”ํ•˜์„ธ์š”.
  4. ๊ณต์‹ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ: ๊ฒ€์ฆ๋œ ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  5. ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ: ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” Docker Secrets๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋ฃจํŠธ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Dockerfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”:

FROM node:14

# ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
WORKDIR /usr/src/app

# ์•ฑ ์˜์กด์„ฑ ์„ค์น˜
COPY package*.json ./
RUN npm install

# ์•ฑ ์†Œ์Šค ๋ณต์‚ฌ
COPY . .

# ๋น„๋ฃจํŠธ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ์ „ํ™˜
RUN groupadd -r appuser && useradd -r -g appuser appuser
RUN chown -R appuser:appuser /usr/src/app
USER appuser

EXPOSE 8080
CMD [ "node", "app.js" ]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ดํ‚น๋˜๋”๋ผ๋„ ํ”ผํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๋ณด์•ˆ์€ ์•„๋ฌด๋ฆฌ ๊ฐ•์กฐํ•ด๋„ ์ง€๋‚˜์น˜์ง€ ์•Š์ฃ ! ๐Ÿ”

๐Ÿ’ก ๋„์ปค ์‚ฌ์šฉ ์‹œ ๊ฟ€ํŒ

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋„์ปค๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฟ€ํŒ์„ ๋ช‡ ๊ฐ€์ง€ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿฏ

  1. ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์†Œํ™”: ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:
# ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# ์‹คํ–‰ ์Šคํ…Œ์ด์ง€
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
EXPOSE 8080
CMD [ "node", "dist/app.js" ]
  1. ์บ์‹œ ํ™œ์šฉ: Dockerfile์˜ ๋ช…๋ น์–ด ์ˆœ์„œ๋ฅผ ์ž˜ ๋ฐฐ์น˜ํ•ด ์บ์‹œ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์„ธ์š”. ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํŒŒ์ผ์€ ๋‚˜์ค‘์— ๋ณต์‚ฌํ•˜์„ธ์š”.
  2. ๋ณผ๋ฅจ ์‚ฌ์šฉ: ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™œ์šฉ: ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅธ ์„ค์ •์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.
  4. ํ—ฌ์Šค ์ฒดํฌ ์ถ”๊ฐ€: HEALTHCHECK ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š”.

์ด๋Ÿฐ ํŒ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ๋„์ปค๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ์žฌ๋Šฅ๋„ท์—์„œ๋„ ์ด๋Ÿฐ ๋„์ปค ํ™œ์šฉ ํŒ์„ ๊ณต์œ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ๋‹ค๊ณ  ํ•˜๋‹ˆ, ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”! ๐Ÿ˜Š

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ๋„์ปค๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ๋†’์ด๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ๋„์ปค๋ฅผ ์ด์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ž๋™ํ™”์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”! ์ •๋ง ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜์ฃ ? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜„

๋„์ปค๋Š” ์ฒ˜์Œ์—๋Š” ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ต์ˆ™ํ•ด์ง€๋ฉด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ์—„์ฒญ๋‚˜๊ฒŒ ํ–ฅ์ƒ์‹œ์ผœ์ค˜์š”! "์ž‘๋™ํ•˜๊ธด ํ•˜๋Š”๋ฐ ์™œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด..."๋ผ๋Š” ์ƒํ™ฉ์„ ํฌ๊ฒŒ ์ค„์—ฌ์ฃผ์ฃ ! ๐Ÿ˜…

์š”์•ฝํ•˜์ž๋ฉด:

  1. ๋„์ปค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆํ™”ํ•ด์„œ ์–ด๋””์„œ๋“  ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.
  2. Dockerfile๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฏธ์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด์š”.
  3. Docker Compose๋กœ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ปค๋ฅผ ํ†ตํ•ฉํ•ด ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  5. ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋ณด์•ˆ์— ์‹ ๊ฒฝ ์จ์„œ ์•ˆ์ •์ ์ธ ์šด์˜ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ด์š”.

๋„์ปค๋Š” ์ด์ œ ๊ฐœ๋ฐœ์ž์˜ ํ•„์ˆ˜ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์–ด์š”. ํŠนํžˆ ์›น ๊ฐœ๋ฐœ์—์„œ๋Š” ๋”์šฑ ๊ทธ๋ ‡์ฃ ! ๋„์ปค๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ „ ๊ณผ์ •์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์งˆ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

์—ฌ๋Ÿฌ๋ถ„๋„ ๋„์ปค๋ฅผ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ๋ณด์„ธ์š”! ์–ด๋ ค์šด ์ ์ด ์žˆ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ๋„์ปค ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฌธํ™”, ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Š

๋„์ปค ์ž๋™ํ™” ๋ฐฐํฌ

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ๋„์ปค ๋งˆ์Šคํ„ฐ์˜ ๊ธธ๋กœ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ”์–ด์š”! ํ™”์ดํŒ…! ๐Ÿ’ช

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.