CI/CD ์ฒด์ธ ์ƒ์„ฑ ๋ฐ Docker๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—… ์ž๋™ํ™”

๋‚˜๋Š” 90๋…„๋Œ€ ํ›„๋ฐ˜์— ์ฒซ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์—๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ž‘๋™ ์ˆœ์„œ๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ณต์œ  ํ˜ธ์ŠคํŒ…์—๋Š” Apache ์„œ๋ฒ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์—ฌ FTP๋ฅผ ํ†ตํ•ด ์ด ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ftp://ftp.example.com. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ๋Œ€๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ง€๊ธˆ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

CI/CD ์ฒด์ธ ์ƒ์„ฑ ๋ฐ Docker๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—… ์ž๋™ํ™”

๊ทธ๋กœ๋ถ€ํ„ฐ XNUMX๋…„ ๋™์•ˆ ๋ชจ๋“  ๊ฒƒ์ด ๋งŽ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ์›น์‚ฌ์ดํŠธ๋Š” ๋”์šฑ ๋ณต์žกํ•ด์กŒ์œผ๋ฉฐ ํ”„๋กœ๋•์…˜์— ์ถœ์‹œ๋˜๊ธฐ ์ „์— ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์„œ๋ฒ„๊ฐ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋˜์—ˆ๊ณ , ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ์ด ์ผ๋ฐ˜ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—๋Š” ํŠน๋ณ„ํ•œ ๊ตฌ์„ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹จ ํ•œ ๊ฐ€์ง€ ์ž‘์—…, ์ฆ‰ ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. master GitHub์—์„œ. ๋˜ํ•œ ์†Œ๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘๋™์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ Docker Swarm ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํฌ๋“œ, ์—์ด์ „ํŠธ ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์„œ๋ฒ„๊ฐ€ ํฌํ•จ๋œ ์„œ๋ฒ„ ์ง‘ํ•ฉ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žก์„ฑ. ์—…๋ฌด๋ฅผ ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ํ•œ๋‹ค๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” CI/CD์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ(์ด ๊ฒฝ์šฐ Node.js ํ”„๋กœ์ ํŠธ)๊ฐ€ ์žˆ๊ณ  ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ๋‚ด์šฉ์ด ํ”„๋กœ๋•์…˜์—์„œ ์ž‘๋™ํ•˜๋Š” ๋‚ด์šฉ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด์„œ ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ๋‹น์‹ ์ด ์ด ๊ธฐ์‚ฌ์— ๊ด€์‹ฌ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.

์ „์ œ ์กฐ๊ฑด

์ด ๊ธ€์„ ์ฝ๋Š” ๋…์ž๋Š” ๋ช…๋ น์ค„๊ณผ Bash ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๋Š” ๊ณ„์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ํŠธ๋ž˜๋น„์Šค CI ะธ ๋„์ปค ํ—ˆ๋ธŒ.

๋Œ€์ƒ

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

์ด๊ฒƒ์ด ๋‚ด ์ž‘์—… ํ๋ฆ„์˜ ๊ฒฐ๊ณผ์˜€์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ €์žฅ์†Œ ๋ถ„๊ธฐ์— ๊ฒŒ์‹œ๋œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ master, ๋‹ค์Œ ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Travis CI ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋‹จ์œ„, ํ†ตํ•ฉ ๋ฐ ์—”๋“œํˆฌ์—”๋“œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ์—๋งŒ ํ•ด๋‹น master, ๋‹ค์Œ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

  • ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ๊ฒƒ ์™ธ์—๋„...
  • ํ˜„์žฌ ์ฝ”๋“œ, ์„ค์ • ๋ฐ ํ™˜๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • Docker Hub์— ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • Docker Hub์—์„œ ์„œ๋ฒ„๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ.
  • ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Docker, ์ด๋ฏธ์ง€, ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ชจ๋‘ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CI/CD๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ฝ์–ด CI/CD๋Š” "์ง€์†์ ์ธ ํ†ตํ•ฉ/์ง€์†์ ์ธ ๋ฐฐํฌ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โ–์ง€์†์ ์ธ ํ†ตํ•ฉ

์ง€์†์ ์ธ ํ†ตํ•ฉ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์†Œ์Šค ์ฝ”๋“œ ์ €์žฅ์†Œ(์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ„๊ธฐ)์— ์ปค๋ฐ‹ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. master). ๋™์‹œ์— ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

โ–์ง€์†์  ๋ฐฐํฌ

์ง€์†์ ์ธ ๋ฐฐํฌ๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. CI/CD ์•ฝ์–ด์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ๋•Œ๋•Œ๋กœ "์ง€์†์ ์ธ ์ „๋‹ฌ"๋กœ ํ‘œ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "์ง€์†์  ๋ฐฐํฌ"์™€ ๋™์ผํ•˜์ง€๋งŒ "์ง€์†์  ์ „๋‹ฌ"์€ ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ

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

๋‚ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Node.js ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š” Express ์„œ๋ฒ„๋กœ, ๋‹จ์ผ ํŽ˜์ด์ง€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์•ˆ์ „ํ•œ ์„œ๋ฒ„ ์ธก API๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ „๋žต์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ํ’€์Šคํƒ ์ธ์ฆ ๊ฐ€์ด๋“œ.

์™€ ์ƒ๋‹ดํ–ˆ์–ด์š” ะดั€ัƒะณะพะผ์ž๋™ํ™” ์ „๋ฌธ๊ฐ€์ธ , ๊ทธ์—๊ฒŒ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ด ๋ฌธ์„œ์˜ ๋ชฉํ‘œ ์„น์…˜์— ์„ค๋ช…๋œ ์ž๋™ํ™”๋œ ์ž‘์—… ํ๋ฆ„์ด ์–ด๋–ค ๋ชจ์Šต์ด์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋‚˜์—๊ฒŒ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชฉํ‘œ๋ฅผ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์€ Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„์ปค

Docker๋Š” ์ปจํ…Œ์ด๋„ˆํ™” ๊ธฐ์ˆ  ๋•๋ถ„์— Docker ํ”Œ๋žซํผ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋”๋ผ๋„ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋ฐฐํฌ, ๋ฐฐํฌ ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋จผ์ € Docker ๋ช…๋ น์ค„ ๋„๊ตฌ(CLI)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ต์ˆ˜ Docker ์„ค์น˜ ๊ฐ€์ด๋“œ๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ์„ค์น˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Docker Desktop(Mac ๋˜๋Š” Windows์šฉ)์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker Hub๋Š” ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. GitHub์˜ git ์ €์žฅ์†Œ ๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ npm JavaScript ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ. Docker ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ ์˜จ๋ผ์ธ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. Docker Desktop์ด ์—ฐ๊ฒฐ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Docker๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Docker ๋ฒ„์ „์„ ํ™•์ธํ•˜์—ฌ Docker CLI๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker -v

๋‹ค์Œ์œผ๋กœ, ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Docker Hub์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”.

docker login

Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ–์ด๋ฏธ์ง€

์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ ์กฐ๋ฆฝ ์ง€์นจ์ด ํฌํ•จ๋œ ์ฒญ์‚ฌ์ง„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฐ ์„ค์ •์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์‰ฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ะ’ั‹ะฒะพะด ัะฒะตะดะตะฝะธะน ะพะฑะพ ะฒัะตั… ะพะฑั€ะฐะทะฐั…
docker images

์ด ๋ช…๋ น์€ ๋‹ค์Œ ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ด๋ธ”์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

๋‹ค์Œ์œผ๋กœ ๋™์ผํ•œ ํ˜•์‹์˜ ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ฃผ์„์ด ํฌํ•จ๋œ ๋ช…๋ น์ด ์žˆ๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–์ปจํ…Œ์ด๋„ˆ

์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ธํ”„๋ผ์— ๊ด€๊ณ„์—†์ด ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์š”์ ์€ ๋™์ผํ•œ ์ด๋ฏธ์ง€์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# ะŸะตั€ะตั‡ะธัะปะตะฝะธะต ะฒัะตั… ะบะพะฝั‚ะตะนะฝะตั€ะพะฒ
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

โ–ํƒœ๊ทธ

ํƒœ๊ทธ๋Š” ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

โ–Docker ๋ช…๋ น์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ฐธ์กฐ

๋‹ค์Œ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Docker ๋ช…๋ น์˜ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค.

ํŒ€

๋ฌธ๋งฅ

ะ”ะตะนัั‚ะฒะธะต

๋„์ปค ๋นŒ๋“œ

์ด๋ฏธ์ง€

Dockerfile์—์„œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

๋„์ปค ํƒœ๊ทธ

์ด๋ฏธ์ง€

์ด๋ฏธ์ง€ ํƒœ๊น…

๋„์ปค ์ด๋ฏธ์ง€

์ด๋ฏธ์ง€

์ด๋ฏธ์ง€ ๋‚˜์—ด

๋„์ปค ์‹คํ–‰

์ปจํ…Œ์ด๋„ˆ

์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

๋„์ปค ํ‘ธ์‹œ

์ด๋ฏธ์ง€

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

๋„์ปค ํ’€

์ด๋ฏธ์ง€

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ๋กœ๋“œ

๋„์ปค ps

์ปจํ…Œ์ด๋„ˆ

์ปจํ…Œ์ด๋„ˆ ๋‚˜์—ด

๋„์ปค ์‹œ์Šคํ…œ ์ •๋ฆฌ

์ด๋ฏธ์ง€/์ปจํ…Œ์ด๋„ˆ

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ

โ–๋„์ปคํŒŒ์ผ

ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋„๋ก ์„ค๊ณ„๋œ Webpack ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํฌํŠธ์—์„œ Node.js ๊ธฐ๋ฐ˜ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. 5000. ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

npm i         # ัƒัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน
npm run build # ัะฑะพั€ะบะฐ React-ะฟั€ะธะปะพะถะตะฝะธั
npm run start # ะทะฐะฟัƒัะบ Node-ัะตั€ะฒะตั€ะฐ

์ด ์ž๋ฃŒ์— ๋Œ€ํ•œ ์˜ˆ์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋Š” ์‹คํ—˜์„ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ Node ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Docker์— ์ง€์นจ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์ด๋ผ๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. Dockerfile, ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์ฒ˜์Œ์—๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ํฌํ•จ๋œ ๋‚ด์šฉ์€ ์ž‘์—… ํ™˜๊ฒฝ ์„ค์ •๊ณผ ์œ ์‚ฌํ•œ ํŠน์ˆ˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ๋ช…๋ น ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

  • FROM โ€” ์ด ๋ช…๋ น์€ ํŒŒ์ผ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นŒ๋“œ๋˜๋Š” ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์‚ฌ โ€” ๋กœ์ปฌ ์†Œ์Šค์˜ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ โ€” ๋‹ค์Œ ๋ช…๋ น์— ๋Œ€ํ•œ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์šด์˜ - ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํญ๋กœํ•˜๋‹ค โ€” ํฌํŠธ ์„ค์ •.
  • ์ง„์ž… ์ง€์  โ€” ์‹คํ–‰ํ•  ๋ช…๋ น์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Dockerfile ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ะ—ะฐะณั€ัƒะทะธั‚ัŒ ะฑะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท
FROM node:12-alpine

# ะกะบะพะฟะธั€ะพะฒะฐั‚ัŒ ั„ะฐะนะปั‹ ะธะท ั‚ะตะบัƒั‰ะตะน ะดะธั€ะตะบั‚ะพั€ะธะธ ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ app/
COPY . app/

# ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ app/ ะฒ ั€ะพะปะธ ั€ะฐะฑะพั‡ะตะน ะดะธั€ะตะบั‚ะพั€ะธะธ
WORKDIR app/

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะทะฐะฒะธัะธะผะพัั‚ะธ (ะบะพะผะฐะฝะดะฐ npm ci ะฟะพั…ะพะถะฐ npm i, ะฝะพ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะพะฒะฐะฝะฝั‹ั… ัะฑะพั€ะพะบ)
RUN npm ci --only-production

# ะกะพะฑั€ะฐั‚ัŒ ะบะปะธะตะฝั‚ัะบะพะต React-ะฟั€ะธะปะพะถะตะฝะธะต ะดะปั ะฟั€ะพะดะฐะบัˆะฝะฐ
RUN npm run build

# ะŸั€ะพัะปัƒัˆะธะฒะฐั‚ัŒ ัƒะบะฐะทะฐะฝะฝั‹ะน ะฟะพั€ั‚
EXPOSE 5000

# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ Node-ัะตั€ะฒะตั€
ENTRYPOINT npm run start

์„ ํƒํ•œ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ผ๋ถ€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€(์˜ˆ: Node Alpine Linux)๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ปดํŒฉํŠธํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ท€ํ•˜๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ผ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ, ํƒœ๊ทธ ์ง€์ • ๋ฐ ์‹คํ–‰

์ปจํ…Œ์ด๋„ˆ์˜ ํ˜„์ง€ ์กฐ๋ฆฝ ๋ฐ ์ถœ์‹œ๋Š” ๋‹น์‚ฌ๊ฐ€ ์™„๋ฃŒํ•œ ํ›„์ž…๋‹ˆ๋‹ค. Dockerfile, ์ž‘์—…์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ Docker Hub์— ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ–์กฐ๋ฆฝ

๋จผ์ € ์ˆ˜์ง‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ์ด๋ฏธ์ง€, ์ด๋ฆ„ ์ง€์ • ๋ฐ ์„ ํƒ์ ์œผ๋กœ ํƒœ๊ทธ ์ง€์ •(ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ํ• ๋‹นํ•จ) latest).

# ะกะฑะพั€ะบะฐ ะพะฑั€ะฐะทะฐ
docker build -t <image>:<tag> .

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„ Docker๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...ะฒั‹ะฟะพะปะฝะตะฝะธะต ัั‚ะฐะฟะพะฒ ัะฑะพั€ะบะธ...
Successfully built 123456789123
Successfully tagged <image>:<tag>

๋นŒ๋“œ์—๋Š” ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์†์„ฑ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docker images ์ƒˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์‚ดํŽด๋ณด์„ธ์š”.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

โ–์ถœ์‹œ

์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. localhost:5000, ๋‚˜, ์Œ์˜ ์™ผ์ชฝ์— 5000:5000 ์„ค์น˜๋œ ๋‹ค์Œ ๋ช…๋ น์—์„œ 5000. ์˜ค๋ฅธ์ชฝ์—๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

# ะ—ะฐะฟัƒัะบ ั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะตะผ ะปะพะบะฐะปัŒะฝะพะณะพ ะฟะพั€ั‚ะฐ 5000 ะธ ะฟะพั€ั‚ะฐ ะบะพะฝั‚ะตะนะฝะตั€ะฐ 5000
docker run -p 5000:5000 <image>:<tag>

์ด์ œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docker ps ์ด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด(๋˜๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) docker ps -a, ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm runโ€ฆ"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

์ง€๊ธˆ ์ฃผ์†Œ๋กœ ๊ฐ€์‹œ๋ฉด localhost:5000 โ€” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŽ˜์ด์ง€์™€ ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋Š” ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–ํƒœ๊ทธ ์ง€์ • ๋ฐ ๊ฒŒ์‹œ

ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Docker Hub์—์„œ ์ด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋จผ์ € Docker Hub์—์„œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด Docker Hub ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘๋˜๋„๋ก ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค์—๋Š” ์ €์žฅ์†Œ ์ด๋ฆ„์ด ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํƒœ๊ทธ๋Š” ์ด๋ฆ„ ๋์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ๊ตฌ์„ฑํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์ƒˆ ์ด๋ฆ„์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docker push Docker Hub ์ €์žฅ์†Œ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# ะะฐ ะฟั€ะฐะบั‚ะธะบะต ัั‚ะพ ะผะพะถะตั‚ ะฒั‹ะณะปัะดะตั‚ัŒ, ะฝะฐะฟั€ะธะผะตั€, ั‚ะฐะบ:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋˜๋ฉด ์ด๋ฏธ์ง€๋Š” Docker Hub์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„์— ์‰ฝ๊ฒŒ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

์ด์ œ Docker ์ปจํ…Œ์ด๋„ˆ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ Docker Hub์— ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•ด ๋งค์šฐ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ๋” ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ CI ๋„๊ตฌ ์„ค์ •
  • ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ž˜๋น„์Šค CI. ์„œ๋ฒ„๋กœ์„œ - ๋””ํ‹ฐ๊ฐˆ์˜ค์…˜.

์—ฌ๊ธฐ์„œ๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Travis CI ๋Œ€์‹  CircleCI ๋˜๋Š” Github Actions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  DigitalOcean ๋Œ€์‹  AWS ๋˜๋Š” Linode๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Travis CI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์ด ์„œ๋น„์Šค์—๋Š” ์ด๋ฏธ ๋ญ”๊ฐ€๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ œ ์ž‘์—… ์ค€๋น„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ž˜๋น„์Šค CI

Travis CI๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” ๊ณ ์œ ํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— Travis CI ์„ค์ •์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Travis CI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. Travis CI, CircleCI, Jenkins ๋“ฑ์„ ์„ ํƒํ•˜๋“  ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์ด ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Travis CI๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”. ํ”„๋กœ์ ํŠธ ์›น์‚ฌ์ดํŠธ ๊ทธ๋ฆฌ๊ณ  ๊ณ„์ •์„ ๋งŒ๋“œ์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ Travis CI๋ฅผ GitHub ๊ณ„์ •๊ณผ ํ†ตํ•ฉํ•˜์„ธ์š”. ์‹œ์Šคํ…œ์„ ์„ค์ •ํ•  ๋•Œ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ์ €์žฅ์†Œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ €๋Š” GitHub๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Travis CI๊ฐ€ BitBucket, GitLab ๋ฐ ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค์™€ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.)

Travis CI๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ธŒ๋žœ์น˜ ๋ฐฐํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ง€์ •๋œ ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

โ–์ง์—… ์ƒ์• ์ฃผ๊ธฐ

Travis CI ๊ตฌ์„ฑ ํŒŒ์ผ์ด ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .travis.yml ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ ์ด๋ฒคํŠธ ๊ฐœ๋…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ž‘์—…. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋Š” ๋ฐœ์ƒ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success ะธะปะธ after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

โ–ํ…Œ์ŠคํŠธ

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋กœ์ปฌ Travis CI ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด๋กœ Node 12๋ฅผ ์„ ํƒํ•˜๊ณ  Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋„๋ก ์‹œ์Šคํ…œ์— ์ง€์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์— ๋‚˜์—ด๋œ ๋ชจ๋“  ๊ฒƒ .travis.yml, ๋‹ฌ๋ฆฌ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ํ’€ ์š”์ฒญ์ด ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ๋ถ„๊ธฐ์— ์ด๋ฃจ์–ด์งˆ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ์†Œ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ถ„๊ธฐ์— ์“ธ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. master, ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋˜๋Š”์ง€ ์—ฌ๋ถ€. ์ด ์ „์—ญ ๊ตฌ์„ฑ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋กœ์ปฌ์— ์„ค์น˜ํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ Webpack ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ (์ด๊ฒƒ์ด ๋‚ด ์›Œํฌํ”Œ๋กœ์˜ ๊ธฐ๋Šฅ์ž„) ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ €์žฅ์†Œ์— ํ…Œ์ŠคํŠธ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ์—ฌ๊ธฐ์— Jest, Travis CI ๋ฐ Coveralls๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ง€์นจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ํŒŒ์ผ ๋‚ด์šฉ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค .travis.yml:

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ัะทั‹ะบ
language: node_js

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฒะตั€ัะธัŽ Node.js
node_js:
  - '12'

services:
  # ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะพะผะฐะฝะดะฝัƒัŽ ัั‚ั€ะพะบัƒ Docker
  - docker

install:
  # ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะทะฐะฒะธัะธะผะพัั‚ะธ ะดะปั ั‚ะตัั‚ะพะฒ
  - npm ci

before_script:
  # ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ัะตั€ะฒะตั€ ะธ ะบะปะธะตะฝั‚ ะดะปั ั‚ะตัั‚ะพะฒ
  - npm run dev &

script:
  # ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹
  - npm run test

์—ฌ๊ธฐ์—์„œ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ๋ธŒ๋žœ์น˜์™€ ํ’€ ์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

โ–๋ฐฐํฌ

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

deploy:
  # ะกะพะฑั€ะฐั‚ัŒ Docker-ะบะพะฝั‚ะตะนะฝะตั€ ะธ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ะตะณะพ ะฝะฐ Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • CI ๋„๊ตฌ(์ด ๊ฒฝ์šฐ Travis CI)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ  Docker Hub๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์— ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ด์ „ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•œ ํ›„ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” DigitalOcean ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค).

๋จผ์ € ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ  Docker Hub์— ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์— ๊ณ ์œ ํ•œ ํƒœ๊ทธ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋กœ๊ทธ์ธ์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ์ด๋Š” ์ด๋ฏธ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ ์ง€์ • ์ „๋žต, ๋กœ๊ทธ์ธ, SSH ํ‚ค ์ธ์ฝ”๋”ฉ, SSH ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ๊ฐ™์€ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šด ์ข‹๊ฒŒ๋„ ๋‚ด ๋‚จ์ž์นœ๊ตฌ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bash์—๋„ ๋Šฅ์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋‚ด๊ฐ€ ์ด ๋Œ€๋ณธ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์ด๋ฏธ์ง€๋ฅผ Docker Hub์— ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ํƒœ๊ทธ ์ง€์ • ๋ฐฉ์‹์—๋Š” git ํ•ด์‹œ์™€ git ํƒœ๊ทธ(์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒœ๊ทธ๊ฐ€ ๊ณ ์œ ํ•˜๊ฒŒ ๋˜๋ฉฐ ํƒœ๊ทธ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DOCKER_USERNAME ะธ DOCKER_PASSWORD Travis CI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. Travis CI๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ชป๋œ ์‚ฌ๋žŒ์˜ ์†์— ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. deploy.sh.

#!/bin/sh
set -e # ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ัะบั€ะธะฟั‚ ะฟั€ะธ ะฝะฐะปะธั‡ะธะธ ะพัˆะธะฑะพะบ

IMAGE="<username>/<repository>"                             # ะžะฑั€ะฐะท Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-ั…ััˆ ะธ ั‚ะตะณะธ

# ะกะฑะพั€ะบะฐ ะธ ั‚ะตะณะธั€ะพะฒะฐะฝะธะต ะพะฑั€ะฐะทะฐ
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

# ะ’ั…ะพะด ะฒ Docker Hub ะธ ะฒั‹ะณั€ัƒะทะบะฐ ะพะฑั€ะฐะทะฐ
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

์Šคํฌ๋ฆฝํŠธ์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์‚ฌ์šฉ ์ค‘์ธ ํ˜ธ์ŠคํŠธ์™€ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ „์ ์œผ๋กœ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” Digital Ocean์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ๋…. AWS์™€ ์ž‘์—…ํ•  ๋•Œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. aws๋“ฑ

์„œ๋ฒ„ ์„ค์ •์€ ํŠน๋ณ„ํžˆ ์–ด๋ ต์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Droplet์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์„ ํƒํ•œ ์‹œ์Šคํ…œ์—๋Š” Docker๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  Docker๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜๋™์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Ubuntu 18.04๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Docker๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฏ€๋กœ Ubuntu๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ๋”ฐ๋ฅด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ.

์—ฌ๊ธฐ์„œ๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํŠน์ • ๋ช…๋ น์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์ธก๋ฉด์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐฐํฌ๋  ์„œ๋ฒ„์— SSH๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•œ ํ›„ ์ˆ˜ํ–‰ํ•  ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ๊ณ„ํš์„ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฐพ์•„์„œ ์ค‘์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์˜ ๋กœ์ปฌ ํฌํŠธ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 80 - ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์†Œ๋กœ ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. example.com, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  example.com:5000.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ์™€ ์ด๋ฏธ์ง€๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ์—ฐ์†์ž…๋‹ˆ๋‹ค.

# ะะฐะนั‚ะธ ID ั€ะฐะฑะพั‚ะฐัŽั‰ะตะณะพ ะบะพะฝั‚ะตะนะฝะตั€ะฐ
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

# ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ัั‚ะฐั€ั‹ะน ะบะพะฝั‚ะตะนะฝะตั€, ะทะฐะฟัƒัั‚ะธั‚ัŒ ะฝะพะฒั‹ะน, ะพั‡ะธัั‚ะธั‚ัŒ ัะธัั‚ะตะผัƒ
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

์ฃผ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ

Travis CI์—์„œ SSH๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์„ค์น˜๋ฅผ ๊ณ„์†ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

๋ฌธ์ž์—ด ํ‚ค๋ฅผ ํŽธ๋ฆฌํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด base64๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ๋‹จ๊ณ„์—์„œ ๊ณต๊ฐœ ํ‚ค๋ฅผ ๋””์ฝ”๋”ฉํ•˜์—ฌ ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. known_hosts ์œ„์˜ ์˜ค๋ฅ˜๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด.

echo <public key> | base64 # ะฒั‹ะฒะพะดะธั‚ <ะฟัƒะฑะปะธั‡ะฝั‹ะน ะบะปัŽั‡, ะทะฐะบะพะดะธั€ะพะฒะฐะฝะฝั‹ะน ะฒ base64>

์‹ค์ œ๋กœ ์ด ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ƒ์„ฑํ•˜๋Š” ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

install:
  - echo < ะฟัƒะฑะปะธั‡ะฝั‹ะน ะบะปัŽั‡, ะทะฐะบะพะดะธั€ะพะฒะฐะฝะฝั‹ะน ะฒ base64> | base64 -d >> $HOME/.ssh/known_hosts

์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๊ฐœ์ธ ํ‚ค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ๋•Œ ๊ฐœ์ธ ํ‚ค์™€ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋กœ ์ž‘์—…ํ•  ๋•Œ Travis CI ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๊ณ  ์–ด๋””์—๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์ ์€ ์ „์ฒด ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•œ ์ค„๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. doctl. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

doctl compute ssh <droplet> --ssh-command "ะฒัะต ะบะพะผะฐะฝะดั‹ ะฑัƒะดัƒั‚ ะทะดะตััŒ && ะทะดะตััŒ"

TLS/SSL ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋Š” ์„œ๋ฒ„์— SSL์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” Node.js ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•์ œ๋กœ ์ผ ์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ Nginx์™€ Let's Encrypt๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋งŽ์€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ชจ๋“  SSL ๊ตฌ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ์„ธ๋ถ€ ์ •๋ณด๋ฅผ DNS์— ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DigitalOcean์˜ ๊ฒฝ์šฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ ์ž๋™ ๊ฐฑ์‹  ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฌด๋ฃŒ์ด๋ฉฐ ๋น ๋ฅธ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— SSL์„ ๋งค์šฐ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์ž์ฒด๋Š” SSL์— ๋Œ€ํ•ด ์ „ํ˜€ "์ƒ๊ฐ"ํ•˜์ง€ ์•Š๊ณ  ๋™์‹œ์— ํ‰์†Œ์™€ ๊ฐ™์ด ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 80. ๋”ฐ๋ผ์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ SSL์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ SSL์„ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜๋Š” ์„œ๋ฒ„์˜ ๋ชจ๋“  ํฌํŠธ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 80, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋ฐ ํฌํŠธ์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 22 SSH์šฉ. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ๋‘ ํฌํŠธ ์ด์™ธ์˜ ํฌํŠธ์—์„œ ์„œ๋ฒ„์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

์ด ์ž๋ฃŒ์—์„œ ์ด์•ผ๊ธฐํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋Š” Docker ํ”Œ๋žซํผ์ด๋‚˜ ์ž๋™ํ™”๋œ CI/CD ์ฒด์ธ ๊ฐœ๋…์ด ๋” ์ด์ƒ ์ €๋ฅผ ๋‘๋ ต๊ฒŒ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๋˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ์ง€์†์ ์ธ ํ†ตํ•ฉ ์ฒด์ธ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์—ฌ์ „ํžˆ ๋น„๊ต์  ์ƒˆ๋กœ์šด ์ผ์ด๋ฉฐ, ์ž๋™ํ™”๋œ ์ž‘์—… ํ๋ฆ„์„ ๊ฐœ์„ ํ•˜๊ณ  ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์•Œ๋‹ค. ์ด ๊ธฐ์‚ฌ๊ฐ€ ๊ท€ํ•˜์˜ ๋…ธ๋ ฅ์— ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ์ฑ…์„ ์ฝ๊ณ  ๋‚˜๋ฉด ๋‚ด๊ฐ€ ๋ฐฐ์šด ๊ฒƒ๋งŒํผ ๋‹น์‹ ๋„ ๋‚ด๊ฐ€ ์ด์•ผ๊ธฐํ•œ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ดํ•ดํ•˜๋ฉด์„œ ๋ฐฐ์› ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

PS ์šฐ๋ฆฌ์˜ ์‹œ์žฅ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๋„์ปค, ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์ž‘๋™์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VPS. ๋ชจ๋“  ์‹ ๊ทœ ๊ณ ๊ฐ์—๊ฒŒ๋Š” 3์ผ ๋™์•ˆ ๋ฌด๋ฃŒ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋…์ž ์—ฌ๋Ÿฌ๋ถ„! ํ”„๋กœ์ ํŠธ์— CI/CD ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?

CI/CD ์ฒด์ธ ์ƒ์„ฑ ๋ฐ Docker๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—… ์ž๋™ํ™”

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€