๐ŸŽฏ CI/CD์™€ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฐฐ์šฐ๊ณ  ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™” ๋„๊ตฌ์ธ Docker์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“— Today I Learned

CI/CD์™€ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์—์„œ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๊ฐ€ ๊ฒฝ์Ÿ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜: ๋งํฌ๋“œ์ธ




์ „ํ†ต์  ๋ฐฐํฌ ๋ฐฉ์‹

์ „ํ†ต์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋Š” ๋ณดํ†ต ๊ฐœ๋ฐœ โ†’ QA โ†’ ์šด์˜์˜ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ : ๋ถ„์„ , ๊ณ„ํš, ๊ตฌํ˜„, ์œ ๋‹› ํ…Œ์ŠคํŠธ, ๋ฐ๋ชจ

    • ๋กœ์ปฌ์—์„œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ›„, ZIP์œผ๋กœ ๋ฌถ๊ฑฐ๋‚˜ FTP๋กœ ์ˆ˜๋™์œผ๋กœ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • QA : ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, ์‚ฌ์šฉ์ž ์ˆ˜์šฉ ํ…Œ์ŠคํŠธ, ๋น„๊ธฐ๋Šฅ์  ๋ถ„์„

    • ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—์„œ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์šด์˜ : ๊ณต๊ฐœ, ๋ชจ๋‹ˆํ„ฐ๋ง

    • ์šด์˜ ์„œ๋ฒ„์— ์˜ฌ๋ ค ์ง์ ‘ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” FTP (File Transfer Protocol)๋ž€?

์›๊ฒฉ ์„œ๋ฒ„์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜, ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

FTP๊ฐ€ ์ง€๊ธˆ ์“ฐ์ด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๐Ÿšจ ์ „ํ†ต์  ๋ฐฐํฌ ๋ฐฉ์‹์˜ ํ•œ๊ณ„

  • ๋А๋ฆฐ ๋ฐฐํฌ ์ฃผ๊ธฐ : ๊ฐœ๋ฐœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ •์˜๋œ ๋•Œ๋กœ๋ถ€ํ„ฐ ์ œํ’ˆ ์ „๋‹ฌ์ด ์™„๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ๊ธด ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

  • ๋А๋ฆฐ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ : ๊ฐœ๋ฐœํŒ€์˜ ํšจ์œจ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

  • ์ž๋™ํ™” ๋ฏธ๋น„ : ๋ฆด๋ฆฌ์Šค ํšŒ์ˆ˜๊ฐ€ ์ ์œผ๋ฏ€๋กœ ์ž๋™ํ™” ํ•„์š” ๊ฐ์†Œ โ†’ ๋ฆด๋ฆฌ์Šค ๊ธฐ๊ฐ„ ์˜ˆ์ธก ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

  • ํ•ซํ”ฝ์Šค ์œ„ํ—˜์„ฑ : ๊ธด๊ธ‰ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•˜์—ฌ ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์—†๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋น„ํšจ์œจ์  ๊ฐœ๋ฐœ ๋ฌธํ™” : ํŒ€ ์ŠคํŠธ๋ ˆ์Šค, ์˜์‚ฌ์†Œํ†ต ๋ถ€์กฑ, ์ฑ…์ž„์˜ ๋ถ„์‚ฐ, ๋‚ฎ์€ ์—…๋ฌด ๋งŒ์กฑ๋„ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก ํ•ด๊ฒฐ์ฑ… : ์ง€์†์  ํ†ตํ•ฉ๊ณผ ๋ฐฐํฌ(CI/CD)

  • CI/CD๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ด์„œ, ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

    • ๋น ๋ฅธ ์ œํ’ˆ ๋ฐฐํฌ : ๋น ๋ฅด๊ฒŒ ์ œํ’ˆ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์งง์€ ํ”ผ๋“œ๋ฐฑ ์ฃผ๊ธฐ : ์‚ฌ์šฉ์ž๋‚˜ QA์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์œ„ํ—˜๋„๊ฐ€ ๋‚ฎ์€ ๋ฆด๋ฆฌ์Šค : ๋ฐ˜๋ณต์ ์ธ ๋ฐฐํฌ์™€ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•ด ์•ˆ์ •์ ์ธ ์šด์˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ์œ ์—ฐํ•œ ๋ฆด๋ฆฌ์Šค ์ •์ฑ… ๊ฒฐ์ • ๊ฐ€๋Šฅ : ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ์ ์ง„์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ์ „๋žต๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” CI/CD๋ž€?

CI๋Š” ์ง€์†์  ํ†ตํ•ฉ(Continuous Integration)์œผ๋กœ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์—…ํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต์šฉ ์ €์žฅ์†Œ(Git ๋“ฑ)์— ์ž์ฃผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

CD๋Š” ์ง€์†์  ๋ฐฐํฌ ๋˜๋Š” ์ง€์†์  ์ „๋‹ฌ(Continuous Deployment / Continuous Delivery)์˜ ์ค„์ž„๋ง๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์Šน์ธ๋˜๋ฉด ์šด์˜ ์„œ๋ฒ„์—๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.




์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ

์ถœ์ฒ˜: servicenow

์ฝ”๋“œ ๋ณ€๊ฒฝ โ†’ ์ง€์†์  ํ†ตํ•ฉ โ†’ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ โ†’ ๋นŒ๋“œ โ†’ ๊ตฌ์„ฑ ๊ด€๋ฆฌ โ†’ ๋ฐฐํฌ

  • ๊ฐ ๋‹จ๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋™์‹œ์— ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๊ณ , ๋˜ํ•œ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๋„ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ” ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ž€?

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค, ๋ฐฐํฌ(์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ)๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์ž…๋‹ˆ๋‹ค.




์ง€์†์  ํ†ตํ•ฉ (CI; Continuous Integration)

์ง€์†์  ํ†ตํ•ฉ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ : ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ : ์ปดํŒŒ์ผ, ๋งํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ : ์†Œ์Šค์ฝ”๋“œ์˜ ์–ด๋А ๋ถ€๋ถ„๊นŒ์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์  ๋ถ„์„ ์ˆ˜ํ–‰ : ์ฝ”๋”ฉ ๊ทœ์น™ ์œ„๋ฐ˜, ์ฝ”๋“œ ์Šคํƒ€์ผ ๋“ฑ์„ ์ž๋™ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต : ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ”๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.




์ž๋™ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ

์ธ์ˆ˜ ํ…Œ์ŠคํŠธ(UAT; User Acceptance Test)๋Š” ๊ณ ๊ฐ์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • ์ „ํ†ต์ ์œผ๋กœ QA ํŒ€์ด ๋งก๋˜ ์—ญํ• ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, ๋น„๊ธฐ๋Šฅ์  ํ…Œ์ŠคํŠธ(์„ฑ๋Šฅ/๋ณด์•ˆ ๋“ฑ)๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ๋˜์–ด, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„์„ ๋งˆ์น˜์ž๋งˆ์ž ๋ฐ”๋กœ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

  • ๋ฆด๋ฆฌ์Šค ๊ฒฐ์ •์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.




๊ตฌ์„ฑ ๊ด€๋ฆฌ

๊ตฌ์„ฑ ๊ด€๋ฆฌ (Configuration Management)๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์šด์˜ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ์ค€๋น„ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ๋“ฑ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐํฌ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ํŒŒ์ผ์„ Git ๋“ฑ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ „ํ†ต ๋ฐฉ์‹์—์„œ ์šด์˜ํŒ€์ด ๋งก๋˜ ๋ฐฉ์‹์„ ์ž๋™ํ™”ํ•ด์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์˜ ์ฐจ์ด๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.




CD๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ ์  ์ „์ œ ์กฐ๊ฑด

์ง€์†์  ๋ฐฐํฌ(Continuous Deployment)๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ ์ธ ์กฐ๊ฑด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž๋™ํ™” : ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ํŒจํ‚ค์ง•, ๋ฐฐํฌ๊นŒ์ง€ ์ „๋ถ€ ์ž๋™์œผ๋กœ ์ง„ํ–‰๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์†๋„ : ์ปค๋ฐ‹ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์•  ๋ณต๊ตฌ : ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ฆ‰์‹œ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์žฆ์€ ๋ฐฐํฌ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ : ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋ฐฐํฌ ์ค‘์—๋„ ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ : ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ํ†ตํ•ฉ ์ฃผ๊ธฐ๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํŠธ๋ ํฌ(trunk)๋Š” ๋ฌด์Šจ ๋œป์ผ๊นŒ?

๋‚˜๋ฌด์˜ ์ค‘์•™ ์ค„๊ธฐ๋ฅผ ๋œปํ•œ ๋ง๋กœ ์ค‘์•™(main) ๋ธŒ๋žœ์น˜, ์ฆ‰ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋ชจ์ด๋Š” โ€˜๊ธฐ๋ณธ ์ค„๊ธฐโ€™๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์ด๋ž€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ์ž์ฃผ ํŠธ๋ ํฌ์— ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.




ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™” ๋„๊ตฌ๋“ค

  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ƒํ™” ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์šด์šฉ

    • Docker + Kubernetes
  • CI ์„œ๋ฒ„

    • Jenkins
  • ๊ตฌ์„ฑ ๊ด€๋ฆฌ ์ž๋™ํ™”

    • Ansible
  • ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ ๊ด€๋ฆฌ (SCM; Software Code Management)

    • Github
  • ๊ทธ ์™ธ

    • ๋นŒ๋“œ ๋„๊ตฌ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ, ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ, ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ



์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ƒํ™”

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

์ปจํ…Œ์ด๋„ˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ์‹คํ–‰.ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ผ๊ด€์„ฑ ์œ ์ง€ : ์–ด๋””์„œ ์‹คํ–‰ํ•˜๋“  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋Œ€์ฒด ํ˜น์€ ๋ณด์™„ : ๋ฌด๊ฑฐ์šด ํ•˜์ดํผ๋ฐ”์ด์ € ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ๋จธ์‹ (VM) ๋ฐฉ์‹ ๋Œ€์‹ , ์ปจํ…Œ์ด๋„ˆ๋Š” ๋” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค.

  • ๋†’์€ ์ด์‹์„ฑ : ์šด์˜์ฒด์ œ๋‚˜ ํ•˜๋“œ์›จ์–ด์— ๋œ ์˜์กด์ ์ด๊ฒŒ ๋˜์–ด ์‹œ์Šคํ…œ์˜ ์ด์‹์ด ์šฉ์ดํ•ด์ง„ ๋•๋ถ„์— ํด๋ผ์šฐ๋“œ, ๋กœ์ปฌ, ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ ์–ด๋””์„œ๋“  ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ?

์ถœ์ฒ˜: netadmin

1๋ฒˆ: ์ „ํ†ต์ ์ธ ๊ฐ€์ƒ ๋จธ์‹  ๊ตฌ์กฐ (VM ๊ธฐ๋ฐ˜)

์ธํ”„๋ผ โ†’ Host OS โ†’ Hypervisor โ†’ Guest OS โ†’ ์•ฑ ์‹คํ–‰

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ๊ฐ ์ž๊ธฐ๋งŒ์˜ ์šด์˜์ฒด์ œ(Guest OS) ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ ์•ฑ๋งˆ๋‹ค OS๋ฅผ ๋”ฐ๋กœ ์˜ฌ๋ ค์•ผ ํ•˜๋ฏ€๋กœ ๋ฌด๊ฒ๊ณ , ๋А๋ฆฝ๋‹ˆ๋‹ค.

ํ•˜์ดํผ๋ฐ”์ด์ €(hypervisor)๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM)์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ•œ ์ปดํ“จํ„ฐ ์•ˆ์—์„œ ๊ฐ€์งœ ์ปดํ“จํ„ฐ(๊ฐ€์ƒ ๋จธ์‹ )๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋จธ์‹ (VM)์€


2๋ฒˆ: ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (Docker ๊ธฐ๋ฐ˜)

์ธํ”„๋ผ โ†’ OS โ†’ Docker Engine โ†’ ์•ฑ ์‹คํ–‰

๋ชจ๋“  ์•ฑ์ด ํ•˜๋‚˜์˜ OS๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์‹คํ–‰๋˜๋ฉฐ Docker Engine์ด ๊ฐ๊ฐ์˜ ์•ฑ์„ ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์ฒ˜๋Ÿผ ๋ถ„๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.


3๋ฒˆ: ์ปจํ…Œ์ด๋„ˆ + ๊ฐ€์ƒ ๋จธ์‹  ํ˜ผํ•ฉ ๊ตฌ์กฐ (ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ)

์ธํ”„๋ผ โ†’ Host OS โ†’ Hypervisor โ†’ Guest OS โ†’ Docker Engine โ†’ ์•ฑ ์‹คํ–‰

VM ์œ„์—์„œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ํด๋ผ์šฐ๋“œ์—์„œ๋Š” ์ด ๊ตฌ์กฐ๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. (ex. AWS EC2 ์œ„์—์„œ Docker ๋Œ๋ฆฌ๋Š” ๋ฐฉ์‹)

๐Ÿ’ก ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž(AWS, GCP ๋“ฑ)์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ณ ๊ฐ์ด ๋™์‹œ์— ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๊ณ ๊ฐ์—๊ฒŒ ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ(=๊ฐ€์ƒ ๋จธ์‹ )์„ ์ œ๊ณตํ•ด์•ผ ๋ณด์•ˆ๊ณผ ์ž์› ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.




๊ฐ€์ƒํ™” (Virtualization)

๊ฐ€์ƒํ™”(Virtualization)๋Š” ์ปดํ“จํŒ… ์ž์›์„ ๋” ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋“œ์›จ์–ด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ•œ ๋Œ€์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ปดํ“จํ„ฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ โ€˜๊ฐ€์งœ ์ปดํ“จํ„ฐโ€™๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ƒํ™” ์ปดํ“จํŒ…์˜ ์ด์ 

[์‹œ์Šคํ…œ ์ธก๋ฉด]

  • ์ž์› ํ™œ์šฉ๋ฅ  ํ–ฅ์ƒ : ์„œ๋ฒ„ ํ•˜๋‚˜๋กœ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณต์›๊ณผ ๋ฐฑ์—…์ด ์‰ฌ์›€ : ์„ค์ •๋œ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์ฒ˜๋Ÿผ ์ €์žฅํ•˜๊ณ  ์‰ฝ๊ฒŒ ๋ณต์›ํ•ฉ๋‹ˆใ…ใ„ท.

[๋น„์ง€๋‹ˆ์Šค ์ธก๋ฉด]

  • ๋น„์šฉ ์ ˆ๊ฐ : ๋ฌผ๋ฆฌ ์„œ๋ฒ„ ์ˆ˜๊ฐ€ ์ค„์–ด๋“œ๋‹ˆ ์œ ์ง€๋น„๋„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์šดํƒ€์ž„ ์ตœ์†Œํ™” : ์‹œ์Šคํ…œ์ด ์ค‘๋‹จ๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์„œ๋น„์Šค ์ด์šฉ์ด ์˜ค๋ž˜ ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๊ด€๋ฆฌ ๊ฐ„์†Œํ™” : ๊ณต๊ฐ„๊ณผ ์ „๋ ฅ ์†Œ๋ชจ๋„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฌํ•ด ๋ณต๊ตฌ์— ๊ฐ•ํ•จ : ๋ฐฑ์—… VM์„ ๋ฐ”๋กœ ๋„์›Œ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

[๊ฐœ๋ฐœ์ž ์ž…์žฅ]

  • ํ†ต์ผ๋œ ํ™˜๊ฒฝ ์ œ๊ณต : ๊ฐœ๋ฐœํ•œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฐฐํฌ, ํ…Œ์ŠคํŠธ, ๊ตฌ์„ฑ ๊ด€๋ฆฌ ๋“ฑ์— ํ†ต์ผ๋œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค ์ตœ์ ํ™” : ์†Œํ”„ํŠธ์›จ์–ด ํ†ตํ•ฉ/์ธ๋„ ํ”„๋กœ์„ธ์Šค์˜ ์ž๋™ํ™”์— ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.




์„œ๋ฒ„ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์˜ ์ง„ํ™”

1. ๊ฐ€์ƒ ๊ธฐ๊ณ„ (VM; Virtual Machine) ๊ธฐ๋ฐ˜

ํ•˜์ดํผ๋ฐ”์ด์ €(Hypervisor)๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฌผ๋ฆฌ์ ์ธ ์ปดํ“จํ„ฐ ์ž์›์„ ๋‚˜๋ˆ ์„œ ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • Type 1(๋„ค์ดํ‹ฐ๋ธŒ ๋˜๋Š” ๋ฒ ์–ด๋ฉ”ํƒˆํ˜•) : ๋ฌผ๋ฆฌ ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

    • ์ „๊ฐ€์ƒํ™” : ๊ฐ€์ƒ ๋จธ์‹ ์ด ์‹ค์ œ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ํ‰๋‚ด๋‚ด๋Š” ๋ฐฉ์‹

    • ๋ฐ˜๊ฐ€์ƒํ™” : ์šด์˜์ฒด์ œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์„œ ํ•˜์ดํผ๋ฐ”์ด์ €์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹

  • Type 2(ํ˜ธ์ŠคํŠธํ˜•) : ๊ธฐ์กด OS ์œ„์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: ์œ„ํ‚คํ”ผ๋””์•„


2. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜

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

  • ์šด์˜์ฒด์ œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„ ํ›จ์”ฌ ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.

  • ์•ฑ๋งˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐ์‹ธ์„œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

๐Ÿค” ํ˜ธ์ŠคํŠธ์™€ ๊ฒŒ์ŠคํŠธ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

ํ˜ธ์ŠคํŠธ : ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๊ฐ€์ƒํ™”ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ

๊ฒŒ์ŠคํŠธ: ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ ์œ„์— ๊ฐ€์ƒํ™”๋˜์–ด ์ œ๊ณต๋˜๋Š” ๊ฐ€์ƒ ์‹œ์Šคํ…œ




Docker ๐Ÿณ

Docker๋Š” ๋„๋ฆฌ ์ด์šฉ๋˜๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ์œผ๋กœ, ์šด์˜์ฒด์ œ์— ์ƒ๊ด€์—†์ด ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ๊ฒฉ๋ฆฌ๋œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

Docker์—์„œ๋Š” ๋ณดํ†ต Dockerfile์ด๋ผ๋Š” ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์—ฌ ์ด๋ฏธ์ง€(Image)๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ(Container)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: dataminded




๋„์ปค ๊ตฌ์„ฑ์š”์†Œ

  • Docker Desktop : ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(GUI)๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, Docker Engine์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ†ตํ•ฉ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์œˆ๋„์šฐ๋‚˜ macOS์™€ ๊ฐ™์€ ์šด์˜์ฒด์ œ์—์„œ๋Š” ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ƒ ๋จธ์‹ (VM) ์œ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Docker Engine : ๋„์ปค์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ ๋กœ, ์ปจํ…Œ์ด๋„ˆ์™€ ์ด๋ฏธ์ง€ ๋“ฑ ๋„์ปค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

    • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๋Š” Docker CLI(๋ช…๋ น์ค„ ๋„๊ตฌ)๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , Docker Daemon์ด ๊ทธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ฆฌ๋ˆ…์Šค์˜ ์ปค๋„ ๊ธฐ๋Šฅ, ํŠนํžˆ ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•œ Namespace(์„œ๋กœ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๊ฒฉ๋ฆฌ)์™€ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์œ„ํ•œ Control Group(CPUยท๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ)์„ ํ™œ์šฉํ•˜์—ฌ, ํ˜ธ์ŠคํŠธ ์ปค๋„์˜ ์ž์›์„ ๊ณต์œ ํ•˜๋ฉด์„œ๋„ ์„œ๋กœ ๊ฒฉ๋ฆฌ๋œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
      ์ถœ์ฒ˜: dev community


๋„์ปค ์—”์ง„ ์ ๊ฒ€

  • docker info
    ๋„์ปค ์—”์ง„์˜ ์ƒํƒœ, ๋ฒ„์ „, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ/์ด๋ฏธ์ง€ ์ˆ˜, ์‹คํ–‰ ๋“œ๋ผ์ด๋ฒ„ ์ •๋ณด ๋“ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • docker run hello-world
    ๋„์ปค๊ฐ€ ๊ณต์‹ ์ œ๊ณตํ•˜๋Š” hello-world ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    โ†’ ์‹คํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด โ€œ๋„์ปค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๊ณ , ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.



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

  • ๋„์ปค ์ด๋ฏธ์ง€ (Docker Image)

    • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ๋“ค๊ณผ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ์‹คํ–‰ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

    • ์ด๋ฏธ์ง€๋Š” ๋ถˆ๋ณ€(immutable)ํ•˜๋ฉฐ, ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. โ†’ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜, ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(Docker Hub ๋“ฑ)์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฆ„๊ณผ ๋ฒ„์ „(tag)์„ ์ง€์ •ํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด๋ฏธ์ง€ ๊ตฌ์กฐ๋Š” ๊ณ„์ธตํ™”(layered)๋˜์–ด ์žˆ์–ด, ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค” ์ด๋ฏธ์ง€๋ž€ ๋ฌด์—‡์ผ๊นŒ?

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

๋„์ปค ์ด๋ฏธ์ง€๋Š” ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ํŒŒ์ผ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ด์–ด(layer)๊ฐ€ ์ธต์ธต์ด ์Œ“์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
๊ฐ ๋ ˆ์ด์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด ์œ„์— ์ถ”๊ฐ€๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹ ๋•๋ถ„์— ์ค‘๋ณต์„ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์ €์žฅ๊ณผ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜: tistory

  1. ์šด์˜์ฒด์ œ
  • ๋„์ปค ์ž์ฒด๊ฐ€ ์›๋ž˜ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์€ Ubuntu, Alpine์ฒ˜๋Ÿผ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ์šด์˜์ฒด์ œ๊ฐ€ ๋ฒ ์ด์Šค๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋œ ์ด๋ฏธ์ง€๋Š” ์–ด๋–ค ์šด์˜์ฒด์ œ ์œ„์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ผ๊ด€๋œ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ด, ์œˆ๋„์šฐ๋“  ๋งฅ์ด๋“  ์–ด๋””์„œ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
  1. ํ•„์ˆ˜ ์†Œํ”„ํŠธ์›จ์–ด
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์›น ์„œ๋ฒ„(nginx, Apache)๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL, PostgreSQL) ๊ฐ™์€ ํ•„์ˆ˜ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํŒจํ‚ค์ง€
  • Python, Node.js ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋‚˜, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ข…์†์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ํ•จ๊ป˜ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ
  • ์ง์ ‘ ๋งŒ๋“  ์›น ์„œ๋น„์Šค๋‚˜ API ์„œ๋ฒ„ ์ฝ”๋“œ, HTML/CSS ํŒŒ์ผ ๋“ฑ์ด ๋“ค์–ด๊ฐ€ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  1. ์„ค์ • ํŒŒ์ผ ๋ฐ ๋ช…๋ น์–ด
  • ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์„ค์ • ํŒŒ์ผ(.env, config.json ๋“ฑ), ๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘ ๋ช…๋ น์–ด ๋“ฑ์ด ํ•จ๊ป˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ (Docker Container)

    • ๋„์ปค ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

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

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

      • ๋‹ค๋งŒ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๊ทธ ์•ˆ์— ์ €์žฅ๋œ ์ƒํƒœ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.



๋„์ปค ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€ ๊ด€๋ จ ๋ช…๋ น์–ด

  • docker run <์ด๋ฏธ์ง€ ์ด๋ฆ„> : ์ด๋ฆ„์ด ์ฃผ์–ด์ง„ ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ์—์„œ ๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ์›น์— ๋„์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด?

docker run -p [ํ˜ธ์ŠคํŠธํฌํŠธ]:[์ปจํ…Œ์ด๋„ˆํฌํŠธ] ์ด๋ฏธ์ง€์ด๋ฆ„

  • -p: ํฌํŠธํฌ์›Œ๋”ฉ (ํ˜ธ์ŠคํŠธ : ์ปจํ…Œ์ด๋„ˆ)
์ด๋ฏธ์ง€์ปจํ…Œ์ด๋„ˆ ํฌํŠธ
nginx / httpd (Apache)80
mysql3306
redis6379
postgres5432
mongo27017

localhost:8080๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ


  • docker ps : ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • docker ps -a : ์ค‘๋‹จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

  • docker images : ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€๋“ค์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

  • docker stop <์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„/ID> : ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์–ด์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • docker rm <์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„/ID> : ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  • docker rmi <์ด๋ฏธ์ง€ ์ด๋ฆ„/ID> : ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  • docker run --name <์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„> <์ด๋ฏธ์ง€> : ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • docker container prune : ์ปจํ…Œ์ด๋„ˆ ์ „์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  • docker image prune -e : ์ด๋ฏธ์ง€ ์ „์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜

์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๋ ค ํ–ˆ๋Š”๋ฐ container is using its referenced image ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ์–ด์„œ ์‚ญ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก ํ•ด๊ฒฐ ๊ณผ์ •

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜์˜€์Šต๋‹ˆ๋‹ค.




Docker ์‹ค์Šต

์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋™ ์ˆ˜์ •์œผ๋กœ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

๊ธฐ์กด httpd ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ ๋’ค, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๊ธฐ๋ณธ ์›น ํŽ˜์ด์ง€(It works!)๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜์—ฌ, ์ดํ›„์—๋Š” ์ˆ˜์ •๋œ ํŽ˜์ด์ง€๊ฐ€ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋กœ ํ‘œ์‹œ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

1๋‹จ๊ณ„ : httpd ์ปจํ…Œ์ด๋„ˆ์—์„œ ์›น ํŽ˜์ด์ง€ ์ˆ˜์ •

docker run -it -p 8080:80 httpd /bin/bash
  • httpd ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , bash ์‰˜์— ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.

grep DocumentRoot /usr/local/apache2/conf/httpd.conf
  • Apache ์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๋ฌธ์„œ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ /usr/local/apache2/htdocs)

cd htdocs
ls -l
cat index.html
  • ๊ธฐ์กด ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

cat > index.html
<html><body><h1>New page!</h1></body></html>
  • ์ƒˆ HTML ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์—ฌ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ์„ ์™„๋ฃŒํ•œ ํ›„ Ctrl + D๋ฅผ ๋ˆŒ๋Ÿฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.


httpd-foreground
  • Apache HTTP ์„œ๋ฒ„(httpd)๋ฅผ ํฌ๊ทธ๋ผ์šด๋“œ(Foreground) ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

exit
  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค.



2๋‹จ๊ณ„ : ์ˆ˜์ •๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ


docker ps -a
  • ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด ์กฐํšŒ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•œ ์ปจํ…Œ์ด๋„ˆ ID๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

docker start <์ปจํ…Œ์ด๋„ˆ ID/์ด๋ฆ„>
docker exec -it <์ปจํ…Œ์ด๋„ˆ ID/์ด๋ฆ„> /bin/bash
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•œ ํ›„, ํ„ฐ๋ฏธ๋„๋กœ ์ง„์ž…ํ•˜์—ฌ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. /bin/bash๋Š” ์…ธ ํ™˜๊ฒฝ์œผ๋กœ ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ž…๋‹ˆ๋‹ค.


cat ./htdocs/index.html
  • ์ •์ƒ์ ์œผ๋กœ index.html ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

httpd-foreground
  • ์›น์„œ๋ฒ„(Apache)๋ฅผ ํฌ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ localhost:8080 ์ ‘์†์„ ํ•˜๋ฉด ๋ฐ”๊พผ ํŽ˜์ด์ง€๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.

exit
  • ์›น ์„œ๋ฒ„๊ฐ€ ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด Ctrl + C๋กœ ๋น ์ ธ๋‚˜์˜จ ํ›„ exit์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค.

docker commit <์ปจํ…Œ์ด๋„ˆ ID ๋˜๋Š” ์ด๋ฆ„> <์ €์žฅํ• _์ด๋ฏธ์ง€_์ด๋ฆ„>:<ํƒœ๊ทธ>
  • ์ด์ œ ๋ณ€๊ฒฝ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

docker images
  • ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

docker run -d -p 8080:80 my_httpd:0.1 httpd-foreground
  • ์ด์ œ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ž๋™์œผ๋กœ ์›น์„œ๋ฒ„๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰๋˜์–ด localhost:8080์—์„œ ๋ฐ”๋กœ ์ ‘์†์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.



์ƒ์„ฑ ์ž๋™ํ™” ์‹ค์Šต โ€“ Apache(httpd) ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

1๏ธโƒฃ Dockerfile ์ž‘์„ฑ ๋ฐ ํ™•์ธ

FROM [--platform=<platform>]<image>[AS <name>]

RUN <command>

ENTRYPOINT ["executable", "param1", "param2"]
  • Dockerfile : ๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ ˆ์ฐจ๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๊ณ„์ธต ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

    • FROM : ์–ด๋–ค ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์ง€ ์ •ํ•จ

    • RUN : ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘์— ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จ

    • ENTRYPOINT : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น ์ง€์ •


  • Dockerfile์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ cat ๋ช…๋ น์–ด๋กœ ๋‚ด์šฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t my_httpd:0.2 .
  • docker build : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • -t : ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ(tag)๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์˜ต์…˜ (t๋Š” tag์˜ ์•ฝ์ž)์ž…๋‹ˆ๋‹ค.

  • my_httpd:0.2 : ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด my_httpd, ํƒœ๊ทธ๋Š” 0.2๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

  • . : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ(build context)๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
    โ†’ ์ฆ‰, Dockerfile์ด ์žˆ๋Š” ์œ„์น˜


3๏ธโƒฃ ์ด๋ฏธ์ง€ ํ™•์ธ

docker images
  • ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d -p 8080:80 my_httpd:0.2
  • -d : ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰

  • -p 8080:80 : ํ˜ธ์ŠคํŠธ์˜ 8080 ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 80 ํฌํŠธ์— ์—ฐ๊ฒฐ

  • my_httpd:0.2 : ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ





๋„์ปค ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ด๋ฏธ์ง€ ์˜ฌ๋ฆฌ๊ธฐ

๐Ÿ”— ๋„์ปค ํ—ˆ๋ธŒ์— ๊ณ„์ •์ด ์žˆ์–ด์•ผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋„์ปค ๋กœ๊ทธ์ธ

docker login


2๏ธโƒฃ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์„ค์ •

docker tag <์ด๋ฏธ์ง€ ์ด๋ฆ„> <[๋‚ด ๋„์ปค ์•„์ด๋””]/[๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ด๋ฆ„]>


3๏ธโƒฃ ์ด๋ฏธ์ง€ ํ‘ธ์‹œ (์—…๋กœ๋“œ)

docker push <๋ฐฉ๊ธˆ ๋งŒ๋“  ์ด๋ฏธ์ง€>


Docker Hub ๋ ˆํฌ์ง€ํ† ๋ฆฌ

๋„์ปค ํ—ˆ๋ธŒ์— repository๊ฐ€ ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋‹ค๋ฃจ๊ธฐ

Ubuntu 22.04 ํ™˜๊ฒฝ์— Python3๋ฅผ ์„ค์น˜ํ•˜๊ณ , hello.py๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ์‹ค์Šต์ž…๋‹ˆ๋‹ค.


1๏ธโƒฃ hello.py ์ž‘์„ฑ

import os
print("Hello Wolrd from %s!" % os.environ["NAME"])
  • os.environ["NAME"] : ์‹œ์Šคํ…œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ NAME์„ ๋ถˆ๋Ÿฌ์™€์„œ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Dockerfile ์ž‘์„ฑ

FROM ubuntu:22.04

ENV NAME=Grepp

RUN apt-get update && apt-get install -y python3
COPY hello.py .

ENTRYPOINT ["python3", "hello.py"]
  • ENV NAME=Grepp : Docker ์ด๋ฏธ์ง€ ์•ˆ์—์„œ NAME์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. hello.py์—์„œ os.environ.get("NAME")์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • RUN : ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋กœ python3์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. (apt ์—…๋ฐ์ดํŠธ ํฌํ•จ)

  • COPY hello.py . : ํ˜ธ์ŠคํŠธ์˜ hello.py ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ENTRYPOINT : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ python3 hello.py๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


3๏ธโƒฃ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t hello:0.2 . 

4๏ธโƒฃ ๋นŒ๋“œ ์‹คํ–‰

4-1. ๊ธฐ๋ณธ ์‹คํ–‰ (Dockerfile์˜ ENV ๊ฐ’ ์‚ฌ์šฉ)

docker run hello:0.2
  • Hello World from Grepp! ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

4-2. ์‹คํ–‰ ์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฎ์–ด์“ฐ๊ธฐ

docker run -e NAME=Programmers hello:0.2
  • Hello World from Programmers! ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก --rm ์˜ต์…˜์„ ๋ถ™์ด๋ฉด ์‹คํ–‰ ์™„๋ฃŒ์™€ ํ•จ๊ป˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

docker run --rm -e NAME=ChatGPT hello:0.2




์ปจํ…Œ์ด๋„ˆ ์•ˆ์˜ ํŒŒ์ผ๋“ค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run --rm -d -p 8080:80 --name my_nginx nginx:latest


2๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ ‘์†

docker exec -it my_nginx /bin/bash
  • docker exec : ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

  • -it : ํ„ฐ๋ฏธ๋„์—์„œ ์ƒํ˜ธ์ž‘์šฉ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    • -i : ํ‘œ์ค€ ์ž…๋ ฅ(stdin)์„ ์—ด์–ด๋‘ฌ์„œ, ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. (--interactive)

    • -t : ๊ฐ€์งœ ํ„ฐ๋ฏธ๋„(TTY)์„ ๋งŒ๋“ค์–ด์„œ, ์‚ฌ๋žŒ์ด ๋ณด๋Š” ํ„ฐ๋ฏธ๋„์ฒ˜๋Ÿผ ์ถœ๋ ฅ์ด ๋ณด์ด๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. (--tty)


3๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ์™€ ํ˜ธ์ŠคํŠธ ๊ฐ„ ํŒŒ์ผ ๋ณต์‚ฌ

docker cp <ํ˜ธ์ŠคํŠธํŒŒ์ผ> <์ปจํ…Œ์ด๋„ˆ์ด๋ฆ„>:<๊ฒฝ๋กœ>
docker cp <์ปจํ…Œ์ด๋„ˆ์ด๋ฆ„>:<๊ฒฝ๋กœ> <ํ˜ธ์ŠคํŠธ๊ฒฝ๋กœ>
  • cp : docker cp ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์‹œ

docker cp index.html my_nginx:/usr/share/nginx/html
docker cp my_nginx:/usr/share/nginx/html/50x.html .


4๏ธโƒฃ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ ํŒŒ์ผ ์ถ”๊ฐ€

FROM nginx:latest

ADD ./index.html /usr/share/nginx/html/new.html

CMD ["nginx", "-g", "daemon off;"]

Dockerfile์—์„œ ์ด๋ฏธ์ง€ ๋งŒ๋“ค ๋•Œ ํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ADD ๋˜๋Š” COPY : Dockerfile์—์„œ ์“ฐ๋Š” ๋ช…๋ น์–ด๋กœ ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์œผ๋กœ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.
docker build -t your_nginx .

5๏ธโƒฃ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ

docker run -it -v <ํ˜ธ์ŠคํŠธ๊ฒฝ๋กœ>:<์ปจํ…Œ์ด๋„ˆ๊ฒฝ๋กœ> <์ด๋ฏธ์ง€> /bin/bash

ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์™€ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด โ†’ ํ˜ธ์ŠคํŠธ์—๋„ ๋ฐ”๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

  • -v <ํ˜ธ์ŠคํŠธ๊ฒฝ๋กœ>:<์ปจํ…Œ์ด๋„ˆ๊ฒฝ๋กœ> : ํ˜ธ์ŠคํŠธ์˜ <ํ˜ธ์ŠคํŠธ๊ฒฝ๋กœ> ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜<์ปจํ…Œ์ด๋„ˆ๊ฒฝ๋กœ>์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์ œ

docker run -it -v ~/work/vol:/host_directory ubuntu:22.04 /bin/bash

cat > /host_directory/B.txt
This is a test file called B.txt
exit
  • B.txt ํŒŒ์ผ์ด ํ˜ธ์ŠคํŠธ์—๋„ ๋ฐ˜์˜๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6๏ธโƒฃ ๋„์ปค ๋ณผ๋ฅจ

docker volume create <๋ณผ๋ฅจ์ด๋ฆ„>
docker run -v <๋ณผ๋ฅจ์ด๋ฆ„>:<์ปจํ…Œ์ด๋„ˆ๊ฒฝ๋กœ> <์ด๋ฏธ์ง€>

๋„์ปค ๋ณผ๋ฅจ์€ Docker๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๊ณต๊ฐ„์œผ๋กœ ํ˜ธ์ŠคํŠธ์˜ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋Š” ์ˆจ๊ฒจ์ ธ ์žˆ๊ณ , Docker๊ฐ€ ์•Œ์•„์„œ ์ €์žฅ ์œ„์น˜๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

docker run --rm -d -p 8888:80 -v my-volume:/usr/share/nginx/html --name my_nginx nginx:latest
sudo ls -l /var/lib/docker/volumes/my-volume/_data
docker exec -it my_nginx /bin/bash
cd /usr/share/nginx/html
cat > new.html
This file is created inside the container.
exit

sudo ls -l /var/lib/docker/volumes/my-volume/_data

๋„์ปค ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ด์„œ Nginx ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ํŒŒ์ผ์ด ํ˜ธ์ŠคํŠธ(๋กœ์ปฌ)์˜ Docker ๋ณผ๋ฅจ ์œ„์น˜์— ์‹ค์ œ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋„์ปค ๋ณผ๋ฅจ์€ ํ˜ธ์ŠคํŠธ์˜ ๋‚ด๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ /var/lib/docker/volumes/<๋ณผ๋ฅจ์ด๋ฆ„>/_data ์— ์‹ค์ œ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.



โœ๏ธ ํšŒ๊ณ 

ํŒŒ์ดํ”„๋ผ์ธ๊ณผ docker์— ๋Œ€ํ•œ ๋งŽ์€ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ๋„์ปค์— ๋Œ€ํ•ด ๋งŽ์ด ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€