Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ ๋„์ปค & ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค

[๋„์ปค & ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค] ๋„์ปค ์ด๋ฏธ์ง€

๋ฐ˜์‘ํ˜•

 

 

 

 

๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€

1๏ธโƒฃ ์ด๋ฏธ์ง€์˜ ๋ณธ์งˆ

์ด๋ฏธ์ง€๋Š” ์ž‘์€ ๋ฆฌ๋ˆ…์Šค๋‚˜ ๊ฐ€๋ฒผ์šด VM์ด ์•„๋‹ˆ๋ผ,

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ์œ„ํ•œ ์„ค๊ณ„๋„์™€ ์žฌ๋ฃŒ ๊พธ๋Ÿฌ๋ฏธ์— ๊ฐ€๊น๋‹ค.

 

์ฆ‰, ์•ˆ์—๋Š” ์šด์˜์ฒด์ œ ์ „์ฒด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

ํ•„์š”ํ•œ ํŒŒ์ผ์‹œ์Šคํ…œ ์Šค๋ƒ…์ƒท(๋ ˆ์ด์–ด๋“ค์˜ ๋ชจ์Œ)๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ •์˜ํ•˜๋Š” ์„ค์ •(config)์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€๋Š” ๋ถˆ๋ณ€(Immutable)ํ•œ ์ƒํƒœ๋กœ ์ €์žฅ๋˜๋ฉฐ,

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

 


2๏ธโƒฃ ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ด€๊ณ„

์ด๋ฏธ์ง€๋Š” ์ •์ (Static)์ธ ์กด์žฌ์ด๋‹ค.

์ฆ‰, ์‹คํ–‰ ์ „์— ์ค€๋น„๋œ ์ƒํƒœ์ด๊ณ , ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๊ณ ์œ ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์ (Dynamic)์ธ ์กด์žฌ์ด๋‹ค.

์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ํ”„๋กœ์„ธ์Šค(PID 1)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์‚ด์•„ ์›€์ง์ด๋Š” ์ƒํƒœ๋ฅผ ๋œปํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์‹คํ–‰ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€๋งŒ,

์ด๋ฏธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๊ธฐ์— ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 


๐Ÿ’ก ๋น„์œ ํ•˜์ž๋ฉด

  • ์ด๋ฏธ์ง€ = ๋ ˆ์‹œํ”ผ+ ์žฌ๋ฃŒ ์ƒ์ž
    (์–ด๋–ค ์Œ์‹์„ ๋งŒ๋“ค์ง€, ์–ด๋–ค ์žฌ๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ •๋ฆฌ๋œ ๋ฌธ์„œ์™€ ๋ฌถ์Œ)
  • ์ปจํ…Œ์ด๋„ˆ = ์‹ค์ œ๋กœ ์กฐ๋ฆฌ ์ค‘์ธ ์Œ์‹
    (๋ ˆ์‹œํ”ผ์™€ ์žฌ๋ฃŒ๋ฅผ ๊บผ๋‚ด์™€์„œ ์ฃผ๋ฐฉ์—์„œ ์กฐ๋ฆฌํ•˜๋Š” ์ƒํƒœ)

 

์ด์ฒ˜๋Ÿผ ๋ ˆ์‹œํ”ผ(์ด๋ฏธ์ง€)๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์–ด์„œ ๊ฐ™์€ ์Œ์‹์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ,

์กฐ๋ฆฌ ์ค‘์ธ ์Œ์‹(์ปจํ…Œ์ด๋„ˆ)์€ ๋จน๊ณ  ์น˜์šฐ๋ฉด ์‚ฌ๋ผ์ ธ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

 


๐Ÿ“ฆ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” ๋‹จ์ˆœํžˆ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์„ ๋ฌถ์–ด๋†“์€ ์••์ถ• ํŒŒ์ผ์ด ์•„๋‹ˆ๋‹ค.

๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๋ฉด OCI(Open Container Initiative) Image ์ŠคํŽ™์ด๋ผ๋Š” ํ‘œ์ค€์— ๋”ฐ๋ผ ์ •ํ•ด์ง„ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

 

์ •ํ™•ํžˆ๋Š” ์•„๋ž˜์˜ 4๊ฐ€์ง€ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š”๋ฐ, ๊ฐ๊ฐ์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 


๐Ÿงฑ ๋ ˆ์ด์–ด(Layer)

๋ ˆ์ด์–ด๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ์ (diff)์„ ๋‹ด์€ ๋ฌถ์Œ์ด๋‹ค.

๋ณดํ†ต tar ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ , ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ์„œ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

 


๊ทธ๋ ‡๋‹ค๋ฉด ์™œ '๋ณ€๊ฒฝ์ '์ด๋ผ๊ณ  ๋ถ€๋ฅผ๊นŒ?

์ด๋ฏธ์ง€๊ฐ€ ๋ˆ„์ ๋˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์ƒˆ๋กœ์šด ์ „์ฒด ๋ณต์‚ฌ๋ณธ์ด ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
๊ทธ ์ˆœ๊ฐ„์˜ ์ฐจ์ด๋งŒ ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์ ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ž‘์—…์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ,

์˜ˆ๋ฅผ ๋“ค์–ด์„œ Dockerfile์ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค๊ณ  ํ•ด๋ณด์ž.

FROM ubuntu:20.04                              # (A) ์šฐ๋ถ„ํˆฌ ๊ธฐ๋ณธ ํŒŒ์ผ ์‹œ์Šคํ…œ
RUN apt-get update && apt-get install -y curl  # (B) ํŒจํ‚ค์ง€ ์ถ”๊ฐ€
COPY app/ /app                                 # (C) ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณต์‚ฌ

 

  • (A) ๋‹จ๊ณ„ ๐Ÿ‘‰๐Ÿป ๊ธฐ๋ณธ ์šฐ๋ถ„ํˆฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํ•˜๋‚˜์˜ ํฐ ๋ ˆ์ด์–ด๊ฐ€ ๋œ๋‹ค.
  • (B) ๋‹จ๊ณ„ ๐Ÿ‘‰๐Ÿป curl ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๊ฐ€ ์œ„์— ์Œ“์ธ๋‹ค.
  • (C) ๋‹จ๊ณ„ ๐Ÿ‘‰๐Ÿป /app ์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•œ ๋‚ด์šฉ์ด ๋˜ ์ƒˆ ๋ ˆ์ด์–ด๊ฐ€ ๋œ๋‹ค.

์ฆ‰, ๊ฐ ๋ช…๋ น์ด '์ด์ „๊นŒ์ง€์˜ ์ƒํƒœ + ์ด๋ฒˆ ๋ณ€๊ฒฝ'์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์œ„์— ์–น๋Š”๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 


๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋˜๋Š” ๊ฑธ๊นŒ?

Union File System ๋•๋ถ„์— ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ ์ฝ๊ธฐ ์ „์šฉ ๋ ˆ์ด์–ด๋ฅผ ๊ฒน์ณ์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค๊ณ ,
๊ทธ ์œ„์— ์–‡์€ ์“ฐ๊ธฐ ์ „์šฉ ๋ ˆ์ด์–ด๋ฅผ ์–น๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, ๋Ÿฐํƒ€์ž„์€ ์—ฌ๋Ÿฌ ์ฝ๊ธฐ ์ „์šฉ ๋ ˆ์ด์–ด๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ๊ฒน์ณ์„œ ํ•˜๋‚˜์˜ ๋ฃจํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งจ ์œ„์— ์ปจํ…Œ์ด๋„ˆ ์ „์šฉ์˜ ์–‡์€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์–ด๋ฅผ ์ž„์‹œ๋กœ ์˜ฌ๋ฆฐ๋‹ค. 

[์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ๋ณด์ด๋Š” FS]
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” ← (์“ฐ๊ธฐ ๊ฐ€๋Šฅ) ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด (์ž„์‹œ, ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์‹œ ์‚ฌ๋ผ์ง)
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค ← ๋ ˆ์ด์–ด C (ex. app ๋ณต์‚ฌ)
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค ← ๋ ˆ์ด์–ด B (ex. curl ์„ค์น˜)
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค ← ๋ ˆ์ด์–ด A (ex. ubuntu:20.04 ๊ธฐ๋ณธ)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

 

์ด์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ ๋ ˆ์ด์–ด๋“ค์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ ,

์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋ฉด ๊ทธ ๋ณ€ํ™”๋Š” ๋งจ ์œ„์˜ ์“ฐ๊ธฐ ๋ ˆ์ด์–ด์—๋งŒ ๊ธฐ๋ก๋œ๋‹ค.

 

๋˜ํ•œ, ํŒŒ์ผ ์‚ญ์ œ ๊ฐ™์€ ๋™์ž‘์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ™”์ดํŠธ์•„์›ƒ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘œ์‹œ๋˜์–ด,

์•„๋ž˜ ๋ ˆ์ด์–ด์— ์žˆ๋˜ ํŒŒ์ผ์ด ๊ฐ€๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 


โš™๏ธ Config JSON

์ด๋ฏธ์ง€ ์•ˆ์—๋Š” ํŒŒ์ผ๋งŒ ๋“ค์–ด์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ '์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ• ์ง€'์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค๊ณ„๋„๊ฐ€ ํ•จ๊ป˜ ๋“ค์–ด์žˆ๋Š”๋ฐ,

์ด ์„ค๊ณ„๋„๊ฐ€ ๋ฐ”๋กœ Config Json์ด๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šธ ๋•Œ ๋Ÿฐํƒ€์ž„์ด ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ,

docker run ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ(override) ์‹คํ–‰ํ•œ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด, Config JSON์€ ์‹คํ–‰ ๊ธฐ๋ณธ๊ฐ’์˜ ๋ฌถ์Œ์ด๋‹ค.
                   (ex. ENTRYPOINT, CMD, ENV, USER, WORKDIR ๋“ฑ)

 

 


๐Ÿ“ ์ฐธ๊ณ ์‚ฌํ•ญ

  • ENTRYPOINT: ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์ •
  • CMD: ENTRYPOINT์— ๋„˜๊ธธ ๊ธฐ๋ณธ ์ธ์ˆ˜, ๋˜๋Š” ENTRYPOINT๊ฐ€ ์—†์„ ๋•Œ ๊ธฐ๋ณธ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ€๋ฆฌํ‚ด

๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด ENTRYPOINT์™€ CMD๊ฐ€ ๋‘˜ ๋‹ค ์žˆ์œผ๋ฉด, ๊ทธ๋ƒฅ ๋‘ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ ธ์„œ ์‹คํ–‰๋œ๋‹ค.

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

 ๐Ÿ‘‰๐Ÿป nginx -g "daemon off;"

 

  • ENV: ์‹คํ–‰ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
  • USER: ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ• ์ง€
  • WORKDIR: ๊ธฐ๋ณธ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ

 


์ด๋Ÿฌํ•œ Config JSON์€ ์–ด๋””์„œ ์ƒ๊ธธ๊นŒ?

๋Œ€๋ถ€๋ถ„์€ Dockerfile ์ง€์‹œ์–ด๋กœ๋ถ€ํ„ฐ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ Dockerfile์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

FROM ubuntu:22.04
ENV APP_ENV=prod
WORKDIR /app
COPY bin/server /app/server
EXPOSE 8080
USER 1001
ENTRYPOINT ["/app/server"]
CMD ["--port","8080"]

 

๋นŒ๋“œ ์‹œ Config JSON์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.

  • Env=['"APP_ENV=prod", ...]
  • WorkingDir="/app"
  • ExposedPorts={"8080/tcp":{ }}
  • User="1001"
  • Entrypoint=["/app/server"]
  • Cmd=["--port", "8080"]

 

๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์ด ๊ฐ’๋“ค์ด ๊ธฐ๋ณธ๊ฐ’์ด ๋˜๊ณ , ๋งŒ์•ฝ docker run ์˜ต์…˜์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํ•ญ๋ชฉ๋งŒ ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค.

 


๐Ÿ“œ Manifest

Manifest๋Š” '์ด ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ค Config์™€ ์–ด๋–ค Layer(Blob)๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€'๋ฅผ ์ •ํ™•ํžˆ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฒญ์‚ฌ์ง„์ด๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์€ pullํ•  ๋•Œ ๋จผ์ € Manifest๋ฅผ ๋ฐ›์•„๋ณด๊ณ ,

๊ฑฐ๊ธฐ์— ์ ํžŒ ๋‹ค์ด์ œ์ŠคํŠธ(sha256) ๋ชฉ๋ก์„ ๋”ฐ๋ผ ์‹ค์ œ ๋ธ”๋กญ๋“ค์„ ๋‚ด๋ ค๋ฐ›์•„ ๊ฒ€์ฆํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ Manifest์—๋Š” ์•„๋ž˜์˜ ํ•ญ๋ชฉ๋“ค์ด ๋‹ด๊ธด๋‹ค.

  • schemaVersion / medisType (์ŠคํŽ™ ๋ฒ„์ „ / ์œ ํ˜•)
  • Config Json์˜ ์œ„์น˜
  • ์ด๋ฏธ์ง€ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ด๋ฃจ๋Š” ๋ ˆ์ด์–ด๋“ค์˜ ์œ„์น˜(๋‹ค์ด์ œ์ŠคํŠธ) ๋ชฉ๋ก

 

๋Œ€์ถฉ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "digest": "sha256:...config...",
    "size": 1234
  },
  "layers": [
    {"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:...A...","size":111},
    {"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:...B...","size":222}
  ]
}

 

ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ Manifest๋Š” config + ์—ฌ๋Ÿฌ layer์˜ ๋‹ค์ด์ œ์ŠคํŠธ ๋ชฉ๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์ด์ œ์ŠคํŠธ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ, ์บ์‹œ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.

 


๊ทธ๋ ‡๋‹ค๋ฉด Manifest List(= Image Index)๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ์•„๋ž˜์— ์—ฌ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜(amd64, arm64, arm/v7 ๋“ฑ) ํ˜น์€ ์—ฌ๋Ÿฌ OS(๋ฆฌ๋ˆ…์Šค, ์œˆ๋„์šฐ) ๋ฒ„์ „์„ ๋ฌถ์–ด๋‘๋Š”

์ƒ์œ„ ์ธ๋ฑ์Šค๊ฐ€ Manifest LIST ์ด๋‹ค(OCI์—์„œ๋Š” Image Index).

 

์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ docker pull nginx:latest ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ,

ํด๋ผ์ด์–ธํŠธ์˜ ํ”Œ๋žซํผ ์ •๋ณด์— ๋งž๋Š” ๊ฐœ๋ณ„ Manifest๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ x86 ์„œ๋ฒ„์—๋Š” ์ž๋™์œผ๋กœ amd64์šฉ Manifest๋ฅผ ์„ ํƒํ•ด์ฃผ๊ณ ,

M1, M2 ๋งฅ์—๋Š” ์ž๋™์œผ๋กœ arm64์šฉ Manifest๋ฅผ ์„ ํƒํ•ด์ค€๋‹ค.

 

 

๋งค์šฐ ์ถ•์•ฝํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:...amd64...",
      "platform": {"os":"linux","architecture":"amd64"}
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:...arm64...",
      "platform": {"os":"linux","architecture":"arm64","variant":"v8"}
    }
  ]
}

 

์—ฌ๊ธฐ์—์„œ ํ•ต์‹ฌ์€ Index๋ž€ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์šฉ Manifest๋“ค์˜ ๋ชฉ๋ก์ด๊ณ ,

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์˜ ํ”Œ๋žซํผ์— ๋งž๋Š” ์—”ํŠธ๋ฆฌ๋ฅผ ์ž๋™ ์„ ํƒํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 


๐Ÿ“š ๊ฒฐ๋ก 

  • ์ด๋ฏธ์ง€๋Š” ์ž‘์€ ์šด์˜์ฒด์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค.
    • ์ฒ˜์Œ์—๋Š” ์ด๋ฏธ์ง€ ์•ˆ์— OS ์ „์ฒด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ค„ ์•Œ์•˜์ง€๋งŒ, ์‚ฌ์‹ค์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ์ (Layer)๊ณผ Config JSON, Manifest, Index ๊ฐ™์€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ฉ์ณ์ง„ ๋ถˆํŽธ ํ…œํ”Œ๋ฆฟ์ด์—ˆ๋‹ค.
  • ๋ ˆ์ด์–ด๋Š” ๋ณ€๊ฒฝ์ ์˜ ๊ธฐ๋ก์ด๋‹ค.
    • ๊ฐ Dockerfile ๋ช…๋ น์ด ์ƒˆ๋กœ์šด ์ „์ฒด ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ '์ด์ „ ์ƒํƒœ + ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ'๋งŒ ๊ธฐ๋ก๋œ๋‹ค๋Š” ์ ์ด ํšจ์œจ์„ฑ๊ณผ ์บ์‹ฑ์˜ ํ•ต์‹ฌ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ์•„๋งˆ ์ด๊ฒŒ ๋ฐ”๋กœ ๋„์ปค๊ฐ€ ๋น ๋ฅด๊ณ  ์ €์žฅ๊ณต๊ฐ„๋„ ์ ˆ์•ฝํ•˜๋Š” ์ด์œ ์ผ ๊ฒƒ์ด๋‹ค.
  • Config JSON์˜ ์—ญํ• 
    • ๋‹จ์ˆœํžˆ ํŒŒ์ผ๋งŒ ๋‹ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ๋„์šฐ๊ณ  ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ• ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ๋•๋ถ„์— docker run ๋งŒ์œผ๋กœ๋„ ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.
  • Manifest์™€ Index์˜ ์ค‘์š”์„ฑ
    • Manifest๋Š” ์ด๋ฏธ์ง€์˜ ์ฒญ์‚ฌ์ง„ ์—ญํ• ์„ ํ•˜๊ณ , Index๋Š” ๋ฉ€ํ‹ฐ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ๋งž๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • ์ด ๋•๋ถ„์— ๋™์ผํ•œ nginx:latest ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ๋„ x86 ์„œ๋ฒ„์™€ ARM ์„œ๋ฒ„์—์„œ ๊ฐ๊ฐ์— ๋งž๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ค๋Š˜ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ํ†ตํ•ด์„œ ์•ž์œผ๋กœ๋Š” ๋‹จ์ˆœํžˆ docker pull ๋งŒ ํ•˜๊ณ  ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ

"์ด ์ด๋ฏธ์ง€์˜ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๊นŒ?", "Config JSON์— ์–ด๋–ค ๊ธฐ๋ณธ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์„๊นŒ?" ๊ฐ™์€ ์‹œ์„ ์œผ๋กœ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์•„์ง์€ ๋„ˆ๋ฌด ์–ด๋ ต๊ธด ํ•ด์„œ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•œ ๋‚ด์šฉ์€ ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค .. (ลฬฅฬฅฬฅฬฅ ษžลฬฅฬฅฬฅฬฅ)

๋ฐ˜์‘ํ˜•