๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Docker

[Docker] ๋„์ปค ์ด๋ฏธ์ง€ ๋‹ค๋ฃจ์–ด๋ณด๊ธฐ, ๊ทธ๋ฆฌ๊ณ  Dockerfile

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

Docker


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

1. ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์ž, docker commit

๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ ์ค‘ Ubuntu๋Š” ํŒจํ‚ค์ง€๋ฅผ apt ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ, CentOS๋Š” ํŒจํ‚ค์ง€๋ฅผ yum ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋˜ Python์˜ ํŒจํ‚ค์ง€๋Š” pypi ๋ผ๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋˜๋Š” anaconda ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋„์ปค๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์„ค์น˜๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ Docker Hub์ด๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์ž ์‹œ ๋‹ค๋ฃจ๊ธด ํ–ˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋„ ๋ณต์Šต์ฐจ ๋‹ค์‹œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

 

๋„์ปค ํ—ˆ๋ธŒ๋Š” ๋ˆ„๊ตฌ๋“ ์ง€ ์ž์‹ ๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚จ์ด ์˜ฌ๋ฆฐ ์ด๋ฏธ์ง€๋ฅผ ์†์‰ฝ๊ฒŒ ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต์‹(Official) ๋ผ๋ฒจ์ด ์—†๋Š” ์ด๋ฏธ์ง€๋Š” ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋„์ปค ํ—ˆ๋ธŒ์— ์–ด๋–ค ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Docker Hub ์‚ฌ์ดํŠธ์— ๊ฐ€์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋„์ปค ์—”์ง„์—์„œ๋„ docker search ๊ด€๋ จ ๋ช…๋ น๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ search ๊ด€๋ จ ๋ช…๋ น์–ด๋Š” ์ด์ „์— ๋ฆฌ๋ˆ…์Šค์—์„œ yum, apt์—์„œ๋„ search ๋ช…๋ น์–ด๊ฐ€ ์กด์žฌํ•œ๋‹ค. 

 

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

 

$ docker run -it --name create_container ubuntu:20.04
# echo "Hello zedd" >> /zedd.txt
# exit

 

์ด์ œ ํ˜ธ์ŠคํŠธ๋กœ ๋‚˜์™”๋‹ค๋ฉด ์œ„์—์„œ ๋งŒ๋“  create_container ๋ผ๋Š” ์ด๋ฆ„์˜ ๋‚˜๋งŒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด๋ณด์ž. ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋Š” docker commit ๋ช…๋ น์–ด์ด๋‹ค. commit ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด ํ˜•์‹์„ ๊ฐ–๋Š”๋‹ค.

 

$ docker commit [OPIONS] CONTAINER [REPOSITORY[:TAG]]

 

์œ„์—์„œ [REPOSITORY:[TAG]] ๋ผ๋Š” ๊ฒƒ์€ ์ด์ „ ํฌ์ŠคํŒ… [2-1.๋ชฉ์ฐจ] ์—์„œ ๋ฐฐ์šด์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค. commit์˜ OPTIONS ์ข…๋ฅ˜์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” -a์™€ -m ์˜ต์…˜๋งŒ ์•Œ์•„๋ณด์ž. -a๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“  ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฌ์ธ์ง€ ์ฆ‰, ์ €์ž(author)๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  -m ์€ git์„ ์‚ฌ์šฉํ•  ๋•Œ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ฒจ์–ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋„์ปค commit ์—์„œ๋„ ๋ฉ”์„ธ์ง€๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ˜ธ์ŠคํŠธ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด zedd_image๋ผ๋Š” ์ด๋ฆ„์˜ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

$ docker commit \
-a "zedd" \
-m "create zedd's own image" \
create_container \
zedd_image:v1

 

๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

zedd_image:v1 ์ด๋ผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค!

2. ๋„์ปค ์ด๋ฏธ์ง€ ๊ตฌ์กฐ ํŒŒํ—ค์น˜๊ธฐ

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์šฐ์„  ์ผ์ข…์˜ ํ™˜๊ฒฝ ์„ธํŒ…์ด ํ•„์š”ํ•˜๋‹ค. ์œ„์—์„œ ๋งŒ๋“  zedd_image:v1 ์ด๋ผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์ปจํ…Œ์ด๋„ˆ์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ํ›„ ๋‚˜๋งŒ์˜ ๋˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด๋ฏธ์ง€ ์ด๋ฆ„์€ zedd_image:v2๋กœ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค. 1๋ฒˆ ๋ชฉ์ฐจ์˜ ๋ช…๋ น์–ด์— ์ด์–ด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์ž.

 

$ docker run -it --name create_container_v2 zedd_image:v1
# echo "Hello zedd 2" >> /zedd_v2.txt
# exit
$ docker commit \
-a "zedd" \
-m "create zedd's own second image" \
create_container_v2 \
zedd_image:v2

 

๊ทธ๋ฆฌ๊ณ  ๋„์ปค ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ 3๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋ฉด ์œ„ 3๊ฐœ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋ฉ”ํƒ€์ •๋ณด ๋ฐ์ดํ„ฐ๋ฅผ docker inspect ๋ช…๋ น์–ด๋กœ ํ™•์ธํ—ค๋ณด์ž. ๋ฉ”ํƒ€์ •๋ณด๋Š” ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ์ค‘์—์„œ Layers์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณด๊ณ  ์‹ถ๋‹ค.(์ฐธ๊ณ ๋กœ ์ด๋ฏธ์ง€๋Š” Layer๋“ค๋กœ ๊ตฌ์„ฑ๋จ) ์•„๋ž˜์˜ Layer๋“ค์˜ ๊ตฌ์ฒด์ ์ธ ํ•ด์‰ฌ๊ฐ’์€ ์‹ค์Šต์— ๋”ฐ๋ผ ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•„๋‘์ž.

 

3๊ฐœ์˜ ์ด๋ฏธ์ง€ ๊ฐ๊ฐ์˜ Layers ๊ตฌ์กฐ๋ฅผ ๋ณด์ž

 

์œ„ Layers ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋น„๊ตํ•ด๋ณด์ž. ์ด์ „์— ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ฐ”๋€Œ๋ฉฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ๋งŒ ๋ณ„๋„๋กœ ์ €์žฅํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋ฅผ ์—ฌ๊ธฐ์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ubuntu:14.04์—์„œ ๊ฐ–๊ณ  ์žˆ๋Š” 3๊ฐœ์˜ Layer ์ •๋ณด๋Š” zedd_image:v1 ์˜ Layer ์ค‘ 3๊ฐœ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ 1๊ฐœ Layer(๋…ธ๋ž€์ƒ‰ ์„ )๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ zedd_image:v1 ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ™œ์šฉํ–ˆ๋˜ ์ปจํ…Œ์ด๋„ˆ์—๋‹ค๊ฐ€ zedd.txt ๋ผ๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ–ˆ๋˜ ๊ฒƒ(๋ณ€๊ฒฝ ์‚ฌํ•ญ)์— ๋Œ€ํ•œ Layer์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ zedd_image:v2 ์ด๋ฏธ์ง€๋Š” zedd_image:v1 ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฒˆ์—” ๊ณตํ†ต์ ์œผ๋กœ 4๊ฐœ์˜ Layer ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  zedd_2.txt ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ž€์ƒ‰ ์„ ์˜ Layer๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์œ„์™€ ๊ฐ™์ด inspect ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ history ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ๋„์ปค ์ด๋ฏธ์ง€์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋„์ปค ์ด๋ฏธ์ง€ ๊ตฌ์กฐ์—์„œ ํ•œ ๊ฐ€์ง€ ๋” ์•Œ์•„๋ณผ ์›๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ์ด๋Š” ์ƒ์„ฑํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๋ฉด์„œ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์šฉ๋˜๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๋ชจ๋‘ ๋ฉˆ์ถ”๊ณ  ์‚ญ์ œ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  docker rm -f ์˜ต์…˜์„ ์ฃผ์–ด ์ด๋ฏธ์ง€๋ฅผ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ด์–ด ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ์‚ญ์ œ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹จ์ˆœํžˆ '์ด๋ฏธ์ง€ ์ด๋ฆ„๋งŒ' ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์งˆ์ ์ธ ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ฐธ๊ณ ๋กœ docker rm -f ์˜ต์…˜์„ ๋„ฃ์–ด ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ์‚ญ์ œ๋˜์–ด ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด <none> ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋“ค์„ ๋Œ•๊ธ€๋ง(dangling) ์ด๋ฏธ์ง€๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋งŒ์•ฝ ๋Œ•๊ธ€๋ง ์ด๋ฏธ์ง€๋งŒ์„ ์ถœ๋ ฅํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด docker images -f dangling=true ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„ 3๊ฐ€์ง€ ์ด๋ฏธ์ง€ ์ค‘ zedd_image:v1 ์ด๋ผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œ์‹œ์ผœ๋ณด์ž. zedd_image:v1 ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” create_container_v2 ๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋จผ์ € ์‚ญ์ œ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

$ docker rm create_contaeinr_v2
$ docker rmi zedd_image:v1

 

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด "Untagged: ... " ๋ผ๋Š” ๋ฉ”์„ธ์ง€๋งŒ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด ๋ฉ”์„ธ์ง€๋งŒ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ์ง€์˜ ์‹ค์ œ ๋ ˆ์ด์–ด ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์ง€๋Š” ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๊ฐ€ ํ˜„์žฌ ์กด์žฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ํ˜„์žฌ zedd_image:v2๊ฐ€ zedd_image:v1 ์ด๋ฏธ์ง€๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ด๋ฏธ์ง€์— ๋ถ€์—ฌ๋œ ์ด๋ฆ„๋งŒ ์‚ญ์ œํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ์œผ๋กœ zedd_image:v2 ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•ด๋ณด์ž. ํ˜„์žฌ zedd_image:v2 ๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๋Š” ๋ณ„๋„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ ์ ์ด ์—†๊ธฐ ๋–„๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด zedd_image:v1 ๋•Œ์™€๋Š” ๋‹ค๋ฅธ ์ถœ๋ ฅ ๋ฉ”์„ธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฒˆ์—” "Deleted" ๋ผ๋Š” ๋ฉ”์„ธ์ง€๋„ ์ถœ๋ ฅ๋จ

 

์œ„์ฒ˜๋Ÿผ "Deleted ..." ๋ผ๋Š” ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ๋ ˆ์ด์–ด ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ์‚ญ์ œ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์œ„ ๊ฒฐ๊ณผ์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์จฐ "Deleted.." ์— ์žˆ๋Š” ํ•ด์‰ฌ๊ฐ’ ID๋Š” zedd_image:v2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ID๊ฐ’์ด๋ฉฐ, ๊ทธ ๋ฐ‘์— 3๊ฐœ์˜ ํ•ด์‰ฌ๊ฐ’๋“ค์€ ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ์‹ค์ œ ๋ ˆ์ด์–ด ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ID๋“ค์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค. ์ด๋ฒˆ์— ์‚ญ์ œํ•œ zedd_image:v2 ๋ผ๋Š” ์ด๋ฏธ์ง€๋Š” ์–ด์จŒ๊ฑด ๊ฐ€์žฅ ์ƒ์œ„ ๋ถ€๋ชจ๋Š” ubuntu:14.04 ๋ผ๋Š” ์ด๋ฏธ์ง€์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ zedd_image:v2 ๋ผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ–ˆ์Œ์—๋„ ubuntu:14.04 ์ด๋ฏธ์ง€๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์‚ญ์ œํ•˜๋Š” zedd_image:v2 ๋ผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•  ๋•Œ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋Š” ๋ฒ”์œ„์— ubuntu:14.04 ์ด๋ฏธ์ง€๋Š” ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์ข€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ํŠน์ • ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด 2๊ฐ€์ง€๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค! (https://github.com/alicek106/start-docker-kubernetes/issues/15)

 

3. ๋„์ปค ์ด๋ฏธ์ง€๋„ ํŒŒ์ผ์ฒ˜๋Ÿผ ์ถ”์ถœํ•˜๊ณ  ๋กœ๋“œํ•˜์ž

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ด์–ด๋“ค๋„ ์‹ค์งˆ์ ์œผ๋กœ๋Š” ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. docker save ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ ์ปค๋งจ๋“œ, ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ ๋“ฑ ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. -o ์˜ต์…˜์—๋Š” ์ถ”์ถœํ•˜์—ฌ ๋งŒ๋“ค ํŒŒ์ผ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker save -o [์ด๋ฏธ์ง€ ์ถ”์ถœ ํŒŒ์ผ ์ด๋ฆ„] [IMAGE]

 

์ด๋ ‡๊ฒŒ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•œ ๋’ค, load ๋ช…๋ น์–ด๋กœ ๋„์ปค์— ๋‹ค์‹œ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. -i ์˜ต์…˜ ๋’ค์— ์ถ”์ถœํ•œ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker load -i saved_image.tar

 

save, load ๋ช…๋ น์–ด์™€ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ, export, import ๋ช…๋ น์–ด๋„ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค. ์šฐ์„  export ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด export๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์„ tar ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ์—์„œ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— export ๋ช…๋ น์–ด๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ ๊ฒƒ์ด๋‹ค. ์ด์ œ ๋ฐ˜๋Œ€๋กœ import ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด export๋กœ ์ถ”์ถœํ•œ tar ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, import๋กœ ๋กœ๋“œํ•˜๊ณ  ๋‚œ ๋’ค์—๋Š” ํ•ด๋‹น tar ํŒŒ์ผ์ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ์ง€ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง์„ ์•Œ์•„๋‘์ž.(์‚ฌ์‹ค ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜๊ฐ€ ์—†์Œ)

 

$ docker export -o container.tar [CONTAINER]
$ docker import container.tar [์ƒ์„ฑํ•  IMAGE ์ด๋ฆ„]

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ด๋ฏธ์ง€ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹จ์ผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ถ”์ถœ๋œ ์ด๋ฏธ์ง€๋Š” ๋ ˆ์ด์–ด ๋‹จ์œ„๋กœ ํŒŒ์ผ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹จ์ผ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ๊ฐ๊ธฐ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•˜๊ณ , ๊ฐ๊ฐ์„ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ถ”์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

 

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

 

4. ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ๋ฐฐํฌํ•ด๋ณด๊ธฐ

์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๊ฐ–๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด์ž. ๋ฐ”๋กœ ์ง์ „ ๋ชฉ์ฐจ์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐœ์ธ์ด ๋งŒ๋“  ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋‚ด๊ฐ€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ „์†กํ•˜๊ฑฐ๋‚˜ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ „์†กํ•ด์•ผ ํ•  ์ƒ๋Œ€๋ฐฉ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฌด๋ฃŒ๋กœ Github, Gitlab ํ”Œ๋žซํผ์— ์˜ฌ๋ ค๋†“๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋„์ปค๋„ ๊ทธ๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋„์ปค์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์ธ Docker Hub๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „์— ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณธ ์ ์ด ์žˆ๋‹ค. ๋„์ปค ํ—ˆ๋ธŒ๋Š” ๊ณ„์ • ๊ฐ€์ž…์ด ๋ฌด๋ฃŒ์ด๋ฉฐ Publicํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ๋ฌด๋ฃŒ๋กœ ๋ฌด์ œํ•œ์œผ๋กœ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, Privateํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ๊ณ„์ • ๋‹น 1๊ฐœ๊นŒ์ง€ ๋ฌด๋ฃŒ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ด์ƒ์˜ Private ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์›” ๋‹น ์†Œ์ •์˜ ๊ตฌ๋…๋ฃŒ๋ฅผ ๋‚ด์•ผ ํ•œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋„์ปค ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(Docker Private Registry)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๊ฐœ์ธ์ด Docker Hub์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋ฅผ ์„œ๋ฒ„๋ฅผ ์šด์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์ด๋Ÿด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋กœ ์šด์˜ํ•  ์„œ๋ฒ„, ์ €์žฅ ๊ณต๊ฐ„, API ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ชจ๋‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

๋งŒ์•ฝ ๊ฐœ์ธ์ด๋‚˜ ์กฐ๊ทธ๋งˆํ•œ ํŒ€ ๋‹จ์œ„(์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋‹จ์œ„)๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด Docker Hub๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ํšŒ์‚ฌ์˜ ๋‚ด๋ถ€๋ง๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ ๋„์ปค ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ž์ฒด ๊ตฌ์ถ•ํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ, ๊ตฌ๊ธ€์ด ์šด์˜ํ•˜๋Š” GCP์—์„œ๋Š” gcr.io ๋ผ๋Š” ์ ‘๋‘์–ด๋กœ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” Container Registry ํ”„๋กœ๋•ํŠธ๊ฐ€ ์žˆ๊ณ , Github์—์„œ๋Š” ghcr.io ๋ผ๋Š” ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ์ข…์˜ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๊ตญ์˜ ์นด์นด์˜ค์—์„œ๋Š” D2hub ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์‹ค์ œ๋กœ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ Docker Hub์— ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ•˜๊ณ  ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜์ž. ์šฐ์„  Docker Hub ๊ณ„์ •์ด ์—†๋‹ค๋ฉด ๊ฐ€์ž…ํ•ด์„œ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๋•Œ, ๊ฐ€์ž…ํ•  ๋•Œ ๋ช…์‹œํ•˜๋Š” username์€ ์ถ”ํ›„์— ๋‚ด๊ฐ€ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ•  ๋•Œ ๋ช…์‹œํ•˜๋Š” Repository ์ด๋ฆ„์— ๊ฐ™์ด ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ธฐ์–ตํ•ด๋‘์ž. ๊ทธ๋ฆฌ๊ณ  Publicํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ์„ฑํ•ด๋ณด์ž. ์ด ๋•Œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์€ ๋‚ด๊ฐ€ ๋งŒ๋“ค ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์ด ๋˜์•ผ ํ•œ๋‹ค. ํ•„์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. username์€ jo181 ์ด๊ณ , ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์€ zedd์ด๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ VM์˜ ์šฐ๋ถ„ํˆฌ์—์„œ ubuntu:14.04๋ฅผ ์ด๋ฏธ์ง€๋กœ ํ•˜๋Š” ๋‚˜๋งŒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ๋”๋ฏธ ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋กœ์„œ ๋งŒ๋“ค์–ด๋ณด์ž. ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ์ด๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.(๊ทœ์น™์— ์‚ฌ์šฉ๋œ Repository, Image ์ด๋ฆ„์€ ํ•„์ž ๋„์ปค ๊ณ„์ •์— ๋งž์ถฐ์„œ ์ž‘์„ฑํ•จ)

 

$ docker run -it --name zedd_container ubuntu:14.04
# echo "Hello Zedd!" >> zedd.txt
# exit
$ docker commit \
-a "zedd" \
-m "my own image for pushing to Docker Hub" \
zedd_container \
docker.io/jo181/zedd:v1

 

ํ˜น์‹œ๋ผ๋„ ์œ„์—์„œ commit์„ ํ•  ๋•Œ, ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๊ทœ์น™์„ ์ง€์ผฐ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ž˜๋ชปํ•ด์„œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด docker tag ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.(์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ)

 

$ docker tag [๊ธฐ์กด ์ด๋ฏธ์ง€ ์ด๋ฆ„] [์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

์ด์ œ ๋‹ค์Œ ์ˆœ์„œ๋Š” ๋„์ปค ํ—ˆ๋ธŒ์— ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๋œ๋‹ค. docker login [DNS ๋˜๋Š” IP ์ฃผ์†Œ] ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋˜๋Š”๋ฐ, DNS ๋˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋””ํดํŠธ๋กœ ๋„์ปค ํ—ˆ๋ธŒ์— ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ๋„์ปค ์—”์ง„์—์„œ ๋กœ๊ทธ์ธํ•œ ์ •๋ณด๋Š” ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์•„๋ž˜ ๊ฒฝ๋กœ์— ์žˆ๋Š” json ํŒŒ์ผ์— ์ €์žฅ์ด ๋œ๋‹ค.

 

/ํ˜ธ์ŠคํŠธ ๊ณ„์ •๋ช…/.docker/config.json

 

ํ•„์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณต๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜ธ์ŠคํŠธ์˜ root ๊ณ„์ •์œผ๋กœ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜ ๋…ธ๋ž€์ƒ‰ ๋„ค๋ชจ์นธ ๊ฒฝ๋กœ์— ๋„์ปค ํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ push ๋ช…๋ น์–ด๋กœ ๋„์ปค ํ—ˆ๋ธŒ์— ๋‚ด ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ์‹œ์ผœ๋ณด๋„๋ก ํ•˜์ž. push ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋„์ปค ํ—ˆ๋ธŒ์—์„œ์˜ username๊ณผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ณณ์— ์ด๋ฏธ์ง€๋ฅผ ์ž˜ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

$ docker push [REPOSITORY[:TAG]]

 

 

๊ทธ๋Ÿฐ๋ฐ ํŠน์ดํ•œ ์ ์ด ์žˆ๋‹ค. ์œ„ ์ถœ๋ ฅํ™”๋ฉด์„ ๋ณด์•„ํ•˜๋‹ˆ ํ•ด์‰ฌ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋œ ๋ ˆ์ด์–ด๋“ค 4๊ฐœ์ค‘ ๋งจ ์ƒ๋‹จ์˜ 1๊ฐœ ๋ ˆ์ด์–ด๋งŒ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” Ubuntu ๋กœ๋ถ€ํ„ฐ ๋งˆ์šดํŠธ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋Š” ์ด๋ฏธ ๋„์ปค ํ—ˆ๋ธŒ์— Ubuntu:14.04 ๋ผ๋Š” ์ด๋ฏธ์ง€์˜ ๋ ˆ์ด์–ด๋“ค์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ Ubuntu:14.04๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“  ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ push ํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ ˆ์ด์–ด๋“ค์€ ๋„์ปค ํ—ˆ๋ธŒ์— ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค! ์œ„์—์„œ zedd.txt ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งจ ์ƒ๋‹จ์˜ 1๊ฐœ ๋ ˆ์ด์–ด๋งŒ Push ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์ž˜ ์—…๋กœ๋“œ ๋˜์—ˆ๋Š”์ง€ ๋„์ปค ํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€๋ณด์ž.

 

 

v1 ์ด๋ผ๋Š” ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค! ๊ทธ๋Ÿฐ๋‹ค์Œ ์ด์ œ ๋„์ปค ํ—ˆ๋ธŒ์— ์˜ฌ๋ผ๊ฐ„ ์ € ์ด๋ฏธ์ง€๋ฅผ ๋ˆ„๊ตฐ๊ฐ€์˜ ํ˜ธ์ŠคํŠธ ๋„์ปค ์—”์ง„์—์„œ ๋‹ค์šด๋ฐ›๊ณ (pull) ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์˜ pull ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

$ docker pull docker.io/jo181/zedd:v1

 

๊ทธ ์ด์™ธ ๊ธฐํƒ€์ ์œผ๋กœ ๋„์ปค ํ—ˆ๋ธŒ์—์„œ๋Š” Github์ฒ˜๋Ÿผ ์กฐ์ง ๋‹จ์œ„๋กœ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์กฐ์ง ๋‚ด์—์„œ๋„ ํŒ€ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ์–ด๋–ค ํŒ€์—๊ฒ ํŠน์ • ๊ถŒํ•œ์„ ์ฃผ๊ณ  ์•ˆ์ฃผ๊ณ  ํ•˜๋Š” ๊ถŒํ•œ ๋ถ„๋ฆฌ ๋ฐ ํ• ๋‹น๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ํŠน์ • ์ด๋ฏธ์ง€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ(์ €์žฅ์†Œ)์— ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋˜๋ฉด ํŠน์ • URL๋กœ http ์š”์ฒญ์„ ์ „์†กํ•˜๋„๋ก ํ•˜๋Š” ์›นํ›…(WebHook)๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

 

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

5. ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•, Dockerfile

4๋ฒˆ ๋ชฉ์ฐจ๊นŒ์ง€ ๋‚ด์šฉ์œผ๋กœ ํ•ด์„œ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

  1. ๋„์ปค ํ—ˆ๋ธŒ์™€ ๊ฐ™์€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ๋ถ€ํ„ฐ Ubuntu, CentOS์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ
  2. ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์†Œ์Šค์ฝ”๋“œ ๋“ฑ..)์„ ์„ค์น˜
  3. ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ปค๋ฐ‹(commit) ํ•˜๋ฉฐ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋กœ ์ƒ์„ฑ

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

 

๊ทธ๋ž˜์„œ ๋„์ปค๋Š” ์ด๋Ÿฌํ•œ ํ”ผ๊ณคํ•œ(?) ์ผ๋ จ์˜ ๊ณผ์ •์„ ์†์‰ฝ๊ฒŒ ๊ธฐ๋กํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” build ๋ช…๋ น์–ด๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด build ๋ช…๋ น์–ด๋กœ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ์— ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ํŒจํ‚ค์ง€, ์†Œ์Šค์ฝ”๋“œ ๋“ฑ์„ ๊ธฐ๋กํ•œ ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์—ฌ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด 'ํ•˜๋‚˜์˜ ํŒŒ์ผ'์ด ๋ฐ”๋กœ Dockerfile์ด๋‹ค. ์ด๋ ‡๊ฒŒ Dockerfile๊ณผ build ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ท€์ฐฎ์€ ๊ณผ์ •์„ ๋œ์–ด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ Git๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

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

5-1. Dockerfile ๋ช…๋ น์–ด ์ตํ˜€๋ณด๊ธฐ

Dockerfile์„ ๊ทธ๋Ÿฌ๋ฉด ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๋ฉด์„œ Dockerfile์— ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋„ ํ•˜๋‚˜์”ฉ ๋ฐฐ์›Œ๋ณด์ž. Dockerfile์—๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ํ•œ ์ค„์”ฉ ๋ช…๋ น์–ด๋กœ ๋ช…์‹œํ•œ๋‹ค. Dockerfile์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹จ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ CLI์—์„œ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

 

์šฐ์„  ๋„์ปค ์—”์ง„์ด ์„ค์น˜๋œ ํ˜ธ์ŠคํŠธ์—์„œ zedd.html ์ด๋ผ๋Š” ํŒŒ์ผ์„ ์ž„์˜๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋œ Dockerfile์„ ๋งŒ๋“ค์–ด๋ณด์ž.

 

$ mkdir dockerfile && cd dockerfile
$ echo zedd >> zedd.html

 

FROM ubuntu:14.04
MAINTAINER zedd
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y
ADD zedd.html /var/www/html
WORKDIR /var/www/html
RUN ["/bin/bash", "-c", "echo zedd2 >> zedd2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND

Dockerfile ์˜ˆ์‹œ๋ฅผ ์ง์ ‘ ์ž…๋ ฅ

 

์ฐธ๊ณ ๋กœ ์œ„ Dockerfile์— ์ž‘์„ฑ๋œ ๋ช…๋ น์–ด๋Š” ์†Œ๋ฌธ์ž์—ฌ๋„ ์ƒ๊ด€์—†์ง€๋งŒ ๊ด€์Šต์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„์ปค ์—”์ง„์€ Dockerfile ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ผ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” 'Dockerfile' ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ธ๋‹ค. ๋‹ค๋งŒ, -f(--file) ์˜ต์…˜์„ ์ฃผ์–ด์„œ ๊ผญ 'Dockerfile'์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๋„ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

 

๋ช…๋ น์–ด ์˜๋ฏธ ํŠน์ง•
FROM ๋ฒ ์ด์Šค๊ฐ€ ๋  ์ด๋ฏธ์ง€๋ฅผ ์˜๋ฏธ Dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ ์ด์ƒ ์ž…๋ ฅํ•ด์•ผ ํ•จ. ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ์—†๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ(pull)ํ•จ
MAINTAINER ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ๊ฐœ๋ฐœ์ž ์ •๋ณด๋ฅผ ์˜๋ฏธ ๋ณดํ†ต ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•จ. ๋‹จ, ๋„์ปค 1.13.0 ๋ฒ„์ „ ์ดํ›„๋กœ๋Š” deprecated ๋˜์—ˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ช…๋ น์–ด์ธ LABEL๋กœ MAINTAINER ๊ธฐ๋Šฅ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ
LABEL ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” "key":"value" ํ˜•ํƒœ๋กœ ๋งˆ์น˜ json์ฒ˜๋Ÿผ ์ €์žฅ์ด ๋˜๋ฉฐ ํ•ด๋‹น ์ด๋ฏธ์ง€์— ์ €์žฅ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด์„œ docker inspect ๋ช…๋ น์–ด๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ
ex)์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์—์„œ๋Š” "purpose"="practice" ๋ผ๊ณ  ์ •์˜ํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ •์˜ํ•˜๋ฉด ์‹ค์ œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—๋Š” {"purpose": "practice"} ํ˜•ํƒœ๋กœ ์ €์žฅ์ด ๋จ
RUN ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์˜๋ฏธ - ๋‹จ, ํŠน์ • ํŒจํ‚ค์ง€ install ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ณ„๋„์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„์•ผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— -y ์˜ต์…˜์„ ์ฃผ์–ด์•ผ ํ•จ. ๋งŒ์•ฝ ๋ณ„๋„์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค๋ฉด build ๋ช…๋ น์–ด๊ฐ€ ์ด๋ฅผ ์˜ค๋ฅ˜๋ผ๊ณ  ์ธ์‹ํ•จ
- ๋‹จ, RUN ๋ช…๋ น์–ด ์‹œ, JSON ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, Dockerfile์˜ ๋ช…๋ น์–ด๋ฅผ JSON ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์…ธ์„ ๋™์ž‘์‹œํ‚ค๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ฐ˜๋“œ์‹œ ์•ž์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ
ex) ์˜ˆ๋ฅผ ๋“ค์–ด, RUN ["echo", "$MY_ENV"] ๋ผ๊ณ  ํ•˜๋ฉด ๋™์ž‘ ํ•˜์ง€ ์•Š์ง€๋งŒ, ["sh", "-c", "echo $MY_ENV"] ๋ผ๊ณ  ๋ช…์‹œํ•˜๋ฉด ๋™์ž‘ํ•จ. ์œ„ ์˜ˆ์‹œ Dockerfile์—์„œ๋„ "/bin/bash" ๋กœ bash ์…ธ์„ ๋™์ž‘์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
ADD ํŠน์ • ํŒŒ์ผ์„ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ - ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€ํ•˜๋Š” ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Dockerfile์ด ์œ„์น˜ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ '์ปจํ…์ŠคํŠธ(Context)'์—์„œ ๊ฐ€์ ธ์˜ด
- ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ JSON ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด ADDํ•  ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ. ๋‹จ, ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ปจํ…Œ์ด๋„ˆ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ๋จ
ex) ์˜ˆ๋ฅผ ๋“ค์–ด, ADD["zedd1.txt", "zedd2.txt", "index.html", "/zedd/test/"] ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, 2๊ฐœ์˜ txt ํŒŒ์ผ๊ณผ 1๊ฐœ์˜ html ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ "/zedd/test" ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•จ
WORKDIR ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ช…์‹œํ•˜๊ณ  ๊ทธ๊ณณ์œผ๋กœ ์ด๋™์„ ์˜๋ฏธ ์…ธ ํ”„๋กฌํ”„ํŠธ์—์„œ cd(change directory) ๋ช…๋ น์–ด์™€ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์ง€๋‹˜. ๊ทธ๋ž˜์„œ WORKDIR ๋ช…๋ น์–ด๋ฅผ 10๋ฒˆ ์“ฐ๋ฉด cd ๋ช…๋ น์–ด๋ฅผ 10๋ฒˆ ์“ฐ๋Š” ์…ˆ์ž„
EXPOSE Dockerfile ๋นŒ๋“œ๋กœ ์ƒ์„ฑํ•œ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€์—์„œ ๋…ธ์ถœํ•  ํฌํŠธ๋ฅผ ์˜๋ฏธ - ํ˜ธ์ŠคํŠธ ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋ฒˆํ˜ธ์ž„์— ์ฃผ์˜. ๊ทธ๋ž˜์„œ ํ˜ธ์ŠคํŠธ์˜ ์–ด๋–ค ํฌํŠธ๋ฒˆํ˜ธ์™€ ๋ฐ”์ธ๋”ฉ๋˜๋Š”์ง€๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด๋งŒ ๋ณด๊ณ ๋Š” ์•Œ ์ˆ˜ ์—†์Œ.
- docker run ๋ช…๋ น์–ด์—์„œ ๋ชจ๋“  ๋…ธ์ถœ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ์ฆ‰, EXPOSE ์— ๋ช…์‹œํ•œ ๋ชจ๋“  ํฌํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ์— ๊ฐ๊ฐ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ฆ‰, ํผ๋ธ”๋ฆฌ์‹œํ•˜๋Š” -P ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
CMD ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋  ๋ช…๋ น์–ด๋ฅผ ์„ค์ •
(docker ps ๋ช…๋ น์–ด๋กœ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ์ถœ๋ ฅ์—์„œ COMMAND์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ž„)
- Dockerfile์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- CMD ๋ช…๋ น์–ด๋„ JSON ๋ฐฐ์—ด ํ˜•ํƒœ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
- CMD๋Š” ENTRYPOINT์˜ ๋ช…๋ น์ค„ ์ธ์ž๋กœ๋„ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ถ”ํ›„์—์„œ ์•Œ์•„๋ณด๋„๋ก ํ•จ

 

์œ„ ํ‘œ ์ค‘ ๋งˆ์ง€๋ง‰ CMD ๋ช…๋ น์–ด์—์„œ ์•Œ์•„๋ณผ ์‚ฌํ•ญ์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ ์ฒซ ๋ฒˆ์งธ๋กœ, ์œ„ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•œ CMD apachectl -DFOREGROUND ๋ผ๋Š” ๋ช…๋ น์–ด์˜ ์˜๋ฏธ์ด๋‹ค. ํ•ด๋‹น ๋ช…๋ น์–ด์—์„œ 'D'๋Š” Detached๋กœ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , FOREGROUND๋Š” ํฌ๊ทธ๋ผ์šด๋“œ ์žก์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ 2๊ฐœ๊ฐ€ ๋‹ค ๊ฐ™์ด ์“ฐ์ธ ์ด์œ ๋Š” '๋ˆ„๊ตฌ ์ž…์žฅ'์—์„œ ํ•ด๋‹น ์žก์„ ์‹คํ–‰ํ•˜๋Š๋ƒ์˜ ์ฐจ์ด๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ์ž…์žฅ์—์„œ๋Š” ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„๊ฐ€ ๋„์›Œ์ ธ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก์œผ๋กœ ๋Œ๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— D๋ฅผ ๋ถ™์ธ ๋ฐ˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ ์ž…์žฅ์—์„œ๋Š” ์•„ํŒŒ์น˜ ์›น์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ ํ„ฐ๋ฏธ๋„์„ ์ฐจ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ทธ๋ผ์šด๋“œ ์žก์œผ๋กœ ๋Œ๋ ค์•ผ ํ•ด์„œ FOREGROUND๋ฅผ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค. 

 

๋‘๋ฒˆ์งธ๋กœ๋Š” docker run ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๋’ค์— ์ปค๋งจ๋“œ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์„ ์ธ์ž๋กœ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.(์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ด„) ๊ทธ๋Ÿฐ๋ฐ CMD ๋ช…๋ น์–ด๊ฐ€ ์ž…๋ ฅ๋œ Dockerfile๋กœ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฏธ์ง€๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๋งŒ์•ฝ docker run ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ปค๋งจ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ์ž…๋ ฅํ•œ ์ปค๋งจ๋“œ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ ์• ์ดˆ์— ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ถ„ํˆฌ, CentOS์™€ ๊ฐ™์€ ๊ณต์‹ ์ด๋ฏธ์ง€์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” COMMAND๋Š” Dockerfile์— CMD๋ฅผ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์ด๋ฏธ์ง€์— ๋‚ด์žฅ๋œ COMMAND๋ฅผ Dockerfile์˜ CMD๋กœ ๋ฎ์–ด์“ธ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

5-2. Dockerfile ๋นŒ๋“œํ•˜๊ธฐ

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„์—์„œ ์ž‘์„ฑํ•œ Dockerfile ์˜ˆ์‹œํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ๋นŒ๋“œํ•ด๋ณด์ž. ์—ฌ๊ธฐ์„œ ๋นŒ๋“œํ•ด๋ณธ๋‹ค๋ผ๋Š” ๊ฒƒ์€ ๋„์ปค์˜ build ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด Dockerfile์— ๋ช…์‹œ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ํ”ํ•œ build ๋ช…๋ น์–ด ์‚ฌ์šฉ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

$ docker build -t [repository:tag] [Dockerfile ์œ„์น˜ ๊ฒฝ๋กœ]

 

-t ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด build ํ•ด์„œ ๋งŒ๋“ค ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ 16์ง„์ˆ˜์˜ ํ•ด์‹œ๊ฐ’์œผ๋กœ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. ์‹ค์ œ๋กœ build ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ›„ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋‚ด ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„์—์„œ ๋งŒ๋“  ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ์ฆ‰, zedd_image:v1 ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.

 

$ docker run -d -P --name zedd_container zedd_image:v1

 

๋‚ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ

 

์œ„ ์‚ฌ์ง„์„ ๋ณด๋ฉด zedd_container๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก์„ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ, ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด COMMAND ํ•ญ๋ชฉ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ Dockerfile์—์„œ CMD ๋ช…๋ น์–ด์— ๋ช…์‹œํ•ด์ฃผ์—ˆ๋˜ ๋ช…๋ น์–ด๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด์žˆ๊ณ , PORTS ํ•ญ๋ชฉ์— ๋ณด๋ฉด ํ˜ธ์ŠคํŠธ์˜ 32768ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋Š” ๋ฐ”๋กœ Dockerfile์—์„œ EXPOSE์— ๋ช…์‹œํ•ด์ฃผ์—ˆ๋˜ ํฌํŠธ๋ฒˆํ˜ธ์ด๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ ์œ„์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ LABEL๋กœ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋˜ ๊ฒƒ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ฐพ์•„๋ณด์ž. ๋ณดํ†ต ๋ ˆ์ด๋ธ”์„ ํ™œ์šฉํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์œผ๋ ค๋ฉด --filter ์˜ต์…˜์„ ๋„ฃ๊ณ  label ์ธ์ž์™€ ํ•จ๊ป˜ key=value ๊ฐ’ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ์–ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker images --filter "label=purpose=practice"

 

5-3. ๋นŒ๋“œ ๊ณผ์ • ์‚ดํŽด๋ณด๊ธฐ

์œ„ ๋ชฉ์ฐจ์—์„œ๋Š” ๋นŒ๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณด์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ๋Œ€์ฒด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž. ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ ‘ํ•  ๊ฐœ๋…์€ ๋ฐ”๋กœ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์ด๋‹ค.

5-3-1. ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ

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

 

๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋Š” build ๋ช…๋ น์–ด์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ ์ง€์ •๋œ ์œ„์น˜์—์žˆ๋Š” ํŒŒ์ผ์„ ์ „๋ถ€ ํฌํ•จํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ๋กœ๋Š” ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ /Users/zedd/Destkop ์ด๋ผ๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค

 

$ docker build -t zedd_image:v1 /Users/zedd/Desktop/

 

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

 

๋ฌผ๋ก  ๋˜ ๋›ฐ์–ด๋‚œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์œ„์™€ ๊ฐ™์€ ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•ด ํŠน์ • ํŒŒ์ผ์€ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ๋ช…์‹œํ•˜๋Š” ํŒŒ์ผ์„ ๊ฐœ๋ฐœํ•˜์˜€๋Š”๋ฐ, ๋ฐ”๋กœ ๊นƒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” .gitignore ํŒŒ์ผ๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” .dockerignore ํŒŒ์ผ์ด๋‹ค. .dockerignore ํŒŒ์ผ์— ๋ช…์‹œ๋œ ํŒŒ์ผ๋“ค์€ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์˜ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ, ๋‹ค์‹œ ๋งํ•ด build ๋ช…๋ น์–ด์—์„œ ๋งจ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ๊ฒฝ๋กœ์ด์ž Dockerfile์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ์™€ ๊ฐ™์€ ๊ณณ์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.

 

.dockerignore์— ๋ช…์‹œํ•˜๋Š” ํŒŒ์ผ ํฌ๋งท์œผ๋กœ๋Š” ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ํŒŒ์ผ์„ ์˜๋ฏธํ•˜๋Š” *(asterisk) ๋ฌธ์ž๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ? ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž„์˜์˜ 1์ž๋ฆฌ ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•„ํ„ฐ๋งํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ํŠน์ˆ˜ํ•œ ํŒŒ์ผ๋งŒ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜๋ฉด ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๋ช… ๋งจ ์•ž์— ! ๋ฌธ์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. ์•„๋ž˜๋Š” .dockerignore ํŒŒ์ผ ์˜ˆ์‹œ์ด๋‹ค.

 

*.html
/*/*.csv
!index.html

5-3-2. Dockerfile ๋‚ด๋ถ€ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ๊ณผ ์ปค๋ฐ‹

Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ด๋ฏธ์ง€๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, Dockerfile์— ๋ช…์‹œ๋œ ๋ช…๋ น์–ด ํ•œ์ค„ ๋‹น ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์€ Dockerfile์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install apache2 -y

 

์œ„์™€ ๊ฐ™์€ Dockerfile ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ญ์ œ๋˜๋ฉด์„œ ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

 

Dockerfile์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€๋ฅผ ์™„์„ฑํ•œ๋‹ค

 

์œ„ ๊ทธ๋ฆผ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. Step1๋ฒˆ์œผ๋กœ, FROM ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ Ubuntu:14.04 ๋ผ๋Š” ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์ปค๋ฐ‹์„ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด 1์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Step1๋ฒˆ์œผ๋กœ ์ƒ์„ฑ๋œ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒซ๋ฒˆ์งธ RUN ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ„์†์ ์œผ๋กœ ์ตœ์ข… ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ๊นŒ์ง€ ์ค‘๊ฐ„์˜ ๋ช…๋ น์–ด ํ•œ ์ค„ ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค, ์ตœ์ข… ์ด๋ฏธ์ง€๊ฐ€ ์™„์„ฑ๋œ ํ›„์—๋Š” ์ค‘๊ฐ„์— ์ƒ์„ฑ๋˜์—ˆ๋˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค. ๊ฒฐ๊ตญ, Dockerfile์— ๋ช…์‹œ๋œ ๋ช…๋ น์–ด ์ค„ ๊ฐœ์ˆ˜๋งŒํผ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๊ฐ€ ์ƒ๊ธฐ๊ณ  ๊ทธ ์ˆซ์ž๋งŒํผ์˜ ์ž„์‹œ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์ค‘๊ฐ„์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

5-3-3. ์บ์‹œ๋ฅผ ์ด์šฉํ•œ ๋นŒ๋“œ

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

 

์ฐธ๊ณ ๋กœ ๋„์ปค ๋นŒ๋“œ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด build ๋ช…๋ น์–ด๊ฐ€ ์ค‘์ง€๋˜๋ฉด์„œ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ ๋ฐ ์‚ญ์ œํ•˜๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ์„ฑ๋œ ์ค‘๊ฐ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋‚จ๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™„์ „ํ•œ ๋นŒ๋“œ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— docker build -t ์˜ต์…˜ ๋‹ค์Œ์— ๋„ฃ์–ด์ค€ ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ์•„๋‹Œ ์ด๋ฆ„์ด <none>:<none>์ธ ์ฆ‰, ๋Œ•๊ธ€๋ง ์ด๋ฏธ์ง€๋กœ ๋‚จ๊ฒŒ ๋œ๋‹ค. 

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์บ์‹œ ๊ธฐ๋Šฅ์ด ๋ถˆํŽธํ•˜๊ฒŒ ๋Š๊ปด์งˆ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ผ๋ก€๋กœ, Dockerfile์— ํŠน์ • ๊นƒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ clone ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ์•„๋ž˜ Dockerfile ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

 

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install git -y
RUN git clone https://github.com/young-hun-jo/DeepLearningOnlyNumpy.git

 

๊ทธ๋Ÿฐ๋ฐ ์ตœ์ดˆ์— ๋นŒ๋“œํ•  ๋•Œ๋ž‘ ๋‘๋ฒˆ์งธ ๋นŒ๋“œํ•  ๋•Œ๋ž‘ ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์†Œ์Šค์ฝ”๋“œ์— ์ˆ˜์ •(๋ฆฌ๋น„์ ผ)์ด ์ƒ๊ฒผ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋งŒ์•ฝ ์ด๋Ÿฐ ์ƒํ™ฉ์ผ ๋•Œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•ด์„œ ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ์ด์ „ ๋ฒ„์ „์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋งŒ ํด๋ก ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ Dockerfile์„ docker build ๋กœ ์‹คํ–‰ํ•˜๋˜ --no-cache ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker build --no-cache -t zedd_git_image:v1 .

 

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, ํŠน์ • ์ด๋ฏธ์ง€๋งŒ์„ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด ๋นŒ๋“œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด ํฌ๋งท์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

 

$ docker build --cache-from [IMAGE] -t zedd_cache_image:v1 .

5-3-4. ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€๋ฅผ ์ด์šฉํ•œ Dockerfile ๋นŒ๋“œ

๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋Š” ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.(๋‹จ, ๋„์ปค ์—”์ง„ 17.05 ๋ฒ„์ „ ์ด์ƒ์—์„œ๋งŒ ๊ฐ€๋Šฅ) ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ Dockerfile๊ณผ main.py์„ ์ž‘์„ฑํ•ด๋ณด์ž. 

 

# main.py
def f():
    return "Hello zedd"

 

FROM python:3.10.1
ADD main.py /root
WORKDIR /root
RUN python main.py

 

์œ„ 2๊ฐœ์˜ ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋’ค ์•„๋ž˜ build ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

 

$ docker build -t zedd_python:v1 .

 

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€ ์ฆ‰, zedd_python:v1 ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์„ ์‚ดํŽด๋ณด์ž.

 

 

์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ 917MB ์šฉ๋Ÿ‰์ด๋‚˜ ์ฐจ์ง€ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์šฉ๋Ÿ‰์ด ์ปค์ง„ ์ด์œ ๋Š” ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ์ด๋ฏธ์ง€๊ฐ€ ๊ฐ„์†Œํ™”๋œ ๋ฒ„์ „์ด ์•„๋‹Œ python:3.10.1 ์ด๋ฏธ์ง€์ธ ์ด์œ ๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹คํ–‰ํ•˜๊ธธ ์›ํ•˜๋Š” ์ฆ‰, main.py ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ ๋ง๊ณ ๋„ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ข… ํŒจํ‚ค์ง€ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋„์ปค๋Š” ์ด๋ ‡๊ฒŒ ํฐ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋”๋ผ๋„ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๊ฐ„์†Œํ™”๋œ python ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•ด์„œ python:slim, python:alpine ๋“ฑ๊ณผ ๊ฐ™์€ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋„ ํ•œ๋‹ค.(์ฐธ๊ณ ๋กœ slim์€ ํŒŒ์ด์ฌ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์ด๋ฏธ์ง€์ด๊ณ , alpine, busybox, bullseye๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์ธ Ubuntu, CentOS ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๊ธฐ๋Šฅ์ด ์ตœ์†Œํ•œ์œผ๋กœ๋งŒ ๋“ค์€ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์„ ๋œปํ•œ๋‹ค)

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€๋Š” ํ•˜๋‚˜์˜ Dockerfile ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ FROM ์ด๋ฏธ์ง€๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ๋นŒ๋“œ ์™„๋ฃŒ ์‹œ ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Dockerfile ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ FROM ์ด๋ฏธ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค๋‹ˆ? ๋Œ€์ฒด ๋ฌด์Šจ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ผ๋‹จ ์˜ˆ์‹œ Dockerfile ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. 

 

FROM python:3.10.1
ADD main.py /root
WORKDIR /root
RUN python main.py

FROM alpine:latest
WORKDIR /root/alpine
COPY --from=0 /root /root/alpine
CMD ["/bin/sh", "-c", "python /root/alpine/main.py"]

 

์œ„ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ณด๋ฉด 2๊ฐœ์˜ FROM์ด ๋ช…์‹œ๋˜์—ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฌธ๋‹จ์— ์žˆ๋Š” ๊ฒƒ์€ ์œ„์—์„œ ์‹ค์Šตํ•ด ๋ณธ ๊ฒƒ์ด๋ž‘ ๋™์ผํ•˜๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‘ ๋ฒˆ์งธ ๋ฌธ๋‹จ์˜ ๋‚ด์šฉ๋“ค์ด๋‹ค. ์ผ๋‹จ, ๋‘๋ฒˆ์งธ ๋ฌธ๋‹จ์—์„œ๋Š” alpine:latest ๋ผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ /root/alpine ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑ ๋ฐ ์ด๋™์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ "--from=0" ์ด๋‹ค. ์—ฌ๊ธฐ์„œ 0์€ ์ฒซ ๋ฒˆ์งธ FROM์—์„œ(์ฒซ ๋ฒˆ์งธ ๋ฌธ๋‹จ์—์„œ) ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€์˜ ์ตœ์ข…์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ตœ์ข…์ƒํƒœ์˜ ์ด๋ฏธ์ง€์˜ /root ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋‘ ๋ฒˆ์งธ FROM ์ด๋ฏธ์ง€์ธ alpine:latest ์ด๋ฏธ์ง€์˜ /root/alpine ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌ(COPY) ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. Dockerfile ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ Dockerfile ํ•ด์„

 

์œ„ Dockerfile์„ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๋นŒ๋“œํ•œ ๋’ค, zedd_multi_stg:v1 ์ด๋ผ๋Š” ์ด๋ฏธ์ง€์™€ zedd_python:v1 ์ด๋ผ๋Š” ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ด๋ณด์ž. ๋˜‘๊ฐ™์€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€์ด์ง€๋งŒ, ํฌ๊ธฐ ์ฐจ์ด๊ฐ€ ์—„์ฒญ ๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ์˜ ์žฅ์ ์ธ ๊ฒƒ์ด๋‹ค!

 

(***์šฉ๋Ÿ‰ ์ฐจ์ด ์‚ฌ์ง„ ์ฒจ๋ถ€ํ•˜๊ธฐ****)

 

์ฒซ ๋ฒˆ์งธ FROM ์ด๋ฏธ์ง€๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์˜ ์ด๋ฏธ์ง€๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์—์„œ 0์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํŠน์ • ๋‹จ๊ณ„์˜ ์ด๋ฏธ์ง€ ์ด๋ฆ„์— ๋ณ„์นญ(alias)์„ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„ Dockerfile ์˜ˆ์‹œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

 

FROM python:3.10.1 as python_3
ADD main.py /root
WORKDIR /root
RUN python main.py

FROM alpine:latest
WORKDIR /root/alpine
COPY --from=python_3 /root /root/alpine
CMD ["/bin/sh", "-c", "python /root/alpine/main.py"]

5-4. Dockerfile์˜ ๋‹ค๋ฅธ ๋ช…๋ น์–ด

์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” Dockerfile ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ข€ ๋” ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์—ฌ๊ธฐ์„œ๋Š” ๋ช…๋ น์–ด ์ข…๋ฅ˜๋ฅผ ํ‘œ ํ˜•ํƒœ๋กœ ์•Œ์•„๋ณด๊ณ , ๋ณ„๋„๋กœ ์‹ค์Šต์„ ํ•ด๋ณด๋ฉด์„œ ์ดํ•ดํ•  ๋ช…๋ น์–ด๋Š” ํ‘œ ์•„๋ž˜์—์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

 

๋ช…๋ น์–ด ์˜๋ฏธ ํŠน์ง•
ENV [NAME] [VALUE] Dockerfile์—์„œ ์‚ฌ์šฉ๋  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง€์ •. ๋ณดํ†ต ์…ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์ฒ˜๋Ÿผ Dockerfile์—์„œ๋„ #${NAME} ๋˜๋Š” #$NAME ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ - Dockerfile์—์„œ ์„ ์–ธํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น Dockerfile๋กœ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฏธ์ง€์• ๋„ ์ €์žฅ๋˜๋ฏ€๋กœ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ๋„ ๊ทธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
- Dockerfile์—์„œ ENV๋กœ ์„ ์–ธํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์ด ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ docker run ์˜ -e ์˜ต์…˜์œผ๋กœ ๋™์ผํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์„ ์–ธํ•œ๋‹ค๋ฉด -e ์˜ต์…˜์—์„œ ์„ ์–ธํ•œ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๋จ
- ํŠน์ • ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ• ์ง€๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.
ex1) ${env_name: -value}
โž” env_name ์ด๋ผ๋Š” ์ด๋ฆ„์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด value ๋ผ๋Š” ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
โž” env_name ์ด๋ผ๋Š” ์ด๋ฆ„์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์‚ฌ์šฉ
ex2) ${env_name: +value}
โž” env_name ์ด๋ผ๋Š” ์ด๋ฆ„์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉ
โž” env_name ์ด๋ผ๋Š” ์ด๋ฆ„์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด value ๋ผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉ
VOLUME [CONTAINER ๊ฒฝ๋กœ] Dockerfile๋กœ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ๊ณผ ๊ณต์œ ํ•  ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •. ์ฆ‰, ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•  ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ช…๋ น์–ด JSON ๋ฐฐ์—ด ํ˜•์‹ ๋˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Œ
ARG [key]=[value] build ๋ช…๋ น์–ด๋กœ Dockerfile์„ ๋นŒ๋“œํ•  ๋•Œ ์ถ”๊ฐ€๋กœ ์ธ์ž๋ฅผ ๋ฐ›์•„ Dockerfile ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„ค์ •
<key>=<value> ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•จ
Dockerfile ๋‚ด์—์„œ๋Š” ํ•ด๋‹น ์ธ์ž๋ฅผ ${build_arg} ํ˜•ํƒœ๋กœ ENV ๋ช…๋ น์–ด ์ฒ˜๋Ÿผ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•จ
- <value>๋ฅผ ๋ช…์‹œํ•˜๋ฉด ํ•ด๋‹น ์ธ์ž์˜ ๋””ํดํŠธ ๊ฐ’์ด ๋ช…์‹œ๋˜๋Š” ์…ˆ 
- build ๋ช…๋ น์–ด ์‚ฌ์šฉ ์‹œ, ๋ฐ˜๋“œ์‹œ --build-arg ์˜ต์…˜์„ ์ฃผ์–ด ์ธ์ž๋ฅผ ์ฃผ์–ด์•ผ ํ•จ
- ๋งŒ์•ฝ ARG ์ธ์ž๋กœ ์ฃผ๋Š” ์ธ์ž์˜ ์ด๋ฆ„์„ ENV๋กœ ๋ช…์‹œํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ฐ™๊ฒŒ ํ•œ๋‹ค๋ฉด ENV๊ฐ€ --build-arg ์—์„œ ๋ช…์‹œํ•˜๋Š” ARG์˜ ์ธ์ž๊ฐ’์„ ๋ฎ์–ด์“ฐ๊ธฐ ํ•จ์— ์ฃผ์˜
USER [username] Dockerfile์„ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ์‚ฌ์šฉ์ž ๊ณ„์ • - ๋ณดํ†ต ์ปจํ…Œ์ด๋„ˆ๋Š” root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ, ๋งŒ์•ฝ ์ด ๋•Œ, ํ˜ธ์ŠคํŠธ์™€ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜ธ์ŠคํŠธ์˜ root ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•จ. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ˜ธ์ŠคํŠธ์˜ root ๊ถŒํ•œ์„ ์ด์šฉํ•˜์—ฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ง˜๋Œ€๋กœ ์กฐ์ž‘ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์Œ
- ๊ทธ๋ž˜์„œ ๋ณดํ†ต ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๋ฐฐํฌํ•  ๋•Œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•จ 
ONBUILD [๋ช…๋ น์–ด] ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๊ฐ€ Dockerfile๋กœ ์ƒ์„ฑ๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด - ๋‚˜์ค‘์— ๋นŒ๋“œ๋  ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ช…์‹œํ•จ
- ONBUILD์— ๋ช…์‹œ๋œ ๋ช…๋ น์–ด๋Š” ๋ถ€๋ชจ ์ด๋ฏธ์ง€์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ๋ฐ˜๋“œ์‹œ ์ž์‹ ์ด๋ฏธ์ง€์—์„œ๋งŒ ์‹คํ–‰๋จ. ๋˜ํ•œ ์ž์‹ ์ด๋ฏธ์ง€์˜ ์ž์‹ ์ด๋ฏธ์ง€(์ฆ‰, ๋ถ€๋ชจ์ž…์žฅ์—์„  ์†์ž ์ด๋ฏธ์ง€)์—๋„ ONBUILD ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋จ
STOPSIGNAL [SIGNAL] ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ง€๋  ๋•Œ ์‚ฌ์šฉ๋  ์‹œ์Šคํ…œ ์ฝœ(ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ „์†กํ•˜๋Š” ์‹ ํ˜ธ)์˜ ์ข…๋ฅ˜๋ฅผ ์ง€์ • - ์—ฌ๊ธฐ์„œ SIGNAL์˜ ์ข…๋ฅ˜๋Š” ๋ฆฌ๋ˆ…์Šค ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด ๊ฒƒ์„ ์˜๋ฏธ
- ๋””ํดํŠธ ์‹ ํ˜ธ๋Š” SIGTERM์ž„
- docker run ์—๋Š” --stop-signal ์˜ต์…˜์œผ๋กœ, docker stop, kill ์—์„œ๋Š” --signal ์˜ต์…˜์œผ๋กœ ๊ฐœ๋ณ„์  ๋ช…์‹œ ๊ฐ€๋Šฅ
HEALTHCHECK [OPTIONS] [ex. curl ๋ช…๋ น์–ด] Dockerfile์„ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ช…๋ น์–ด - ex) HEALTHCHECK --interval=1m --timeout=3s --retries=3 [CMD curl -f https://localhost]
- ์œ„ ๋ช…๋ น์–ด ์˜๋ฏธ๋Š” 1๋ถ„ ๋งˆ๋‹ค 3์ดˆ ์ด์ƒ์ด ์†Œ์š”๋˜๋ฉฐ 3๋ฒˆ ์ด์ƒ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํžˆ๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ƒ์ฑ„๊ฐ€ unhealthy ์ƒํƒœ๊ฐ€ ๋จ
- ์ฃผ๊ธฐ์ ์ธ ์ƒํƒœ ์ฒดํฌ์— ๋Œ€ํ•œ ๋กœ๊ทธ ๊ฒฐ๊ณผ๋Š” docker inspect ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ ๋ถ€๋ถ„ ์ค‘ "State -> Helath -> Log" ํ•ญ๋ชฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ
SHELL Dockerfile์„ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์…ธ ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œ - Dockerfile์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์…ธ์€ sh ์…ธ์ž„
- ๋งŒ์•ฝ, bash๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด SHELL ["/bin/bash"] ํ˜•ํƒœ๋กœ bash ๋ช…๋ น์–ด ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋จ

5-5. ADD vs COPY ๋ช…๋ น์–ด ์ฐจ์ด

Dockerfile ๋ช…๋ น์–ด ์ค‘์— ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ฝ์–ด๋“ค์ธ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์˜ ํŒŒ์ผ๋“ค์„ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ADD, COPY์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘ ๊ฐœ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? COPY๋Š” ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ํŒŒ์ผ(๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ)๋งŒ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ADD๋Š” ๊นƒ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ URL ๋ฐ ์•„์นด์ด๋ธŒ/์••์ถ• ํŒŒ์ผ์ธ tar ํŒŒ์ผ๋„ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, COPY์˜ ๊ธฐ๋Šฅ์€ ADD์˜ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์‹ ๊ธฐํ•œ ๊ฒƒ์€ ADD๋ฅผ ํ†ตํ•ด tar ํŒŒ์ผ์„ ๋ช…์‹œํ•˜๋ฉด ์•Œ์•„์„œ ์•„์นด์ด๋ธŒ ๋ฐ ์••์ถ•ํ•ด์ œ๋ฅผ ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค.

 

COPY๋Š” ADD์— ์ข…์†๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ

 

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

5-6. ENTRYPOINT vs CMD ๋ช…๋ น์–ด ์ฐจ์ด

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด docker run ๋ช…๋ น์–ด์˜ ๋งจ๋’ค์ธ CMD(์ปค๋งจ๋“œ)๋ฅผ ๋ช…์‹œํ•˜๋Š” ์ž๋ฆฌ์— /bin/bash ๋ฅผ ์ž…๋ ฅํ•จ์œผ๋กœ์จ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€์„œ bash ์…ธ์„ ํ™œ์„ฑํ™” ํ•˜๋„๋ก ํ•ด๋ณด์ž. 

 

$ docker run -it --name cmd_container ubuntu:14.04 /bin/bash

 

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

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ docker run ๋ช…๋ น์–ด์—์„œ ENTRYPOINT๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž. docker run ๋ช…๋ น์–ด์—์„œ๋Š” --entrypoint ๋ผ๋Š” ์˜ต์…˜์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€ /bin/bash ์…ธ์„ ํ™œ์„ฑํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ /bin/bash ๋ผ๋Š” ์ถœ๋ ฅ์„ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด echo /bin/bash ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ด๋ณด์ž. ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker run -it --name entrypoint_container --entrypoint="echo" ubuntu:14.04 /bin/bash

 

์œ„ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ echo /bin/bash ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ‘œ์ค€์ถœ๋ ฅ์œผ๋กœ ๋‚ด๋ฑ‰์–ด์ค€ ํ›„, ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฉˆ์ถ”๋ฉด์„œ ํ˜ธ์ŠคํŠธ๋กœ ๋‹ค์‹œ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฆ‰, docker run ๋ช…๋ น์–ด์—์„œ ENTRYPOINT๋Š” CMD๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ, ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” CMD๊ฐ€ /bin/bash ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ENTRYPOINT์˜ echo ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ENTRYPOINT๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด CMD์— ์„ค์ •๋œ ๋ช…๋ น์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜์ง€๋งŒ, ENTRYPOINT๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ๋Š” CMD๋Š” ๋‹จ์ง€ ENTRYPOINT์— ๋ช…์‹œ๋œ ๋ช…๋ น์–ด์˜ ์ธ์ž(argument) ์—ญํ• ๋งŒ ํ•˜๋Š” ์…ˆ์ด๋‹ค.

 

๋ฌผ๋ก  ์œ„์—์„œ ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ echo ๋ช…๋ น์–ด๋ฅผ ENTRYPOINT๋กœ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋ณดํ†ต์€ ํŠน์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ENTRYPOINT์™€ CMD๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฒˆ์—๋Š” Dockerfile์—์„œ ENTRYPOINT์™€ CMD๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์€ Dockerfile๊ณผ example.sh ์ด๋ผ๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install apache2 -y
ADD example.sh /example.sh
RUN chmod a+x /example.sh
ENTRYPOINT ["/bin/bash", "/example.sh"]

 

#!/bin/bash
#example.sh

echo $1 $2
apachectl -DFOREGROUND

 

์œ„ example.sh ์Šคํฌ๋ฆฝํŠธ์—์„œ $1, $2๋กœ ํ•ด๋‹น ์…ธ ์Šคํฌ๋ฆฝํŠธ์˜ ์ธ์ž๋ฅผ ๋ฐ›์€ ๊ฒƒ์„ echo๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค. ํ˜น์‹œ ์…ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์ธ์ž๋ฅผ ์™œ $1, $2๋กœ ๋ฐ›๋Š”์ง€ ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด์ „ ๋ฆฌ๋ˆ…์Šค ํฌ์ŠคํŒ…์„ ์ฐธ์กฐํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

์œ„ 2๊ฐœ์˜ ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋’ค ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ detached(๋ฐฑ๊ทธ๋ผ์šด๋“œ)๋ชจ๋“œ๋กœ ์ƒ์„ฑํ•ด๋ณด์ž.

 

$ docker build -t entrypoint:v1 .
$ docker run -d --name entrypoint_c1 entrypoint:v1 argument_1 argument_2
$ docker logs entrypoint_c1

 

๋งˆ์ง€๋ง‰ docker logs ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋ฐœ์ƒํ•œ ๋กœ๊ทธ๋ฅผ ํ‘œ์ค€์ถœ๋ ฅ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ์…ธ ์Šคํฌ๋ฆฝํŠธ์˜ ์ธ์ž๋กœ ์ค€ argument_1, argument_2๊ฐ€ echo ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ์•Œ์•„๋ณผ ์ ์€ ENTRYPOINT์™€ CMD ๋ช…๋ น์–ด์—์„œ JSON ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ฃผ๋Š” ๊ฒƒ๊ณผ ์ผ๋ฐ˜ ํ˜•ํƒœ๋กœ ์ฃผ๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์ด๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์ผ๋ฐ˜ ํ˜•ํƒœ๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌด์กฐ๊ฑด sh ๋ผ๋Š” ์…ธ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์€ CMD๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

FROM ubuntu:14.04
CMD echo "Hello world"

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์…ธ ํ”„๋กฌํ”„ํŠธ์—์„œ ๋ช…๋ น์–ด๋กœ ์น˜์ž๋ฉด /bin/sh -c echo "Hello world" ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์— ์•„๋ž˜์™€ ๊ฐ™์ด JSON ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•˜๋ฉด ์‹ค์ œ๋กœ JSON ๋ฐฐ์—ด์— ๋ช…์‹œํ•œ ๊ทธ๋Œ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

FROM ubuntu:14.04
CMD ["/bin/bash", "echo Hello world"]

5-7. Dockerfile ๋นŒ๋“œ ์‹œ ์ฃผ์˜์ 

์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ Dockerfile์„ ๋นŒ๋“œํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ  ๊ฐ€์ž. Dockerfile ๊ณผ ์ด๋ฏธ์ง€์˜ ๊ตฌ์กฐ ๊ฐ„์— ๊ด€๊ณ„๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ํ•˜๋‚˜ ๋ช…์‹ฌํ•˜๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฝ์–ด๋‚˜๊ฐ€๋ณด์ž. Dockerfile์—์„œ์˜ ๋ช…๋ น์–ด ํ•œ ์ค„์€ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค!(์ด ๋‚ด์šฉ์€ ์œ„ [๋ชฉ์ฐจ 5-3-2]์—์„œ ๋ฐฐ์› ๋‹ค)

 

์šฐ์„  ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์‹œ Dockerfile์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด Dockerfile์€ ubuntu ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ๊ทธ ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— 100MB์˜ ๋”๋ฏธํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค ์‚ญ์ œํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.(์ฐธ๊ณ ๋กœ fallocate ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „ ๋ฆฌ๋ˆ…์Šค ํฌ์ŠคํŒ… ๋•Œ ๋ฐฐ์šด์ ์ด ์žˆ๋‹ค)

 

FROM ubuntu:14.04
RUN mkdir /dummy
RUN fallocate -l 100M /dummy/dummy_file
RUN rm /dummy/dummy_file

 

$ docker run -t dummy_img:v1 .

 

ubuntu:14.04 ์˜ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์€ ๋Œ€๋žต 200MB๊ฐ€ ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿฐ ์ƒํƒœ์—์„œ ์œ„์™€ ๊ฐ™์€ Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์ด ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ? 100MB์˜ ๋”๋ฏธ ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ์ง€๋งŒ ๋งˆ์ง€๋ง‰์— ์‚ญ์ œํ–ˆ์œผ๋ฏ€๋กœ ์ € ์ด๋ฏธ์ง€๋„ ubuntu:14.04 ์ด๋ฏธ์ง€๋ž‘ ์šฉ๋Ÿ‰์ด ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€ ์•Š์„๊นŒ? ์ง์ ‘ ํ™•์ธํ•ด๋ณด์ž.

 

 

์ด์ƒํ•˜๊ฒŒ ์‚ฌ์ด์ฆˆ๊ฐ€ 301MB๋‚˜ ๋œ๋‹ค. ๋Œ€์ฒด ์™œ๊ทธ๋Ÿฐ ๊ฒƒ์ผ๊นŒ? ๋ฐ”๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด๋ฏธ์ง€๋กœ ์ƒ์„ฑํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ์‚ฌํ•ญ๋งŒ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋กœ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์œ„ Dockerfile์—์„œ fallocate ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋Š” RUN ๋ช…๋ น์–ด๋กœ 100MB์˜ ๋”๋ฏธํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ทธ ํ›„์— ๋ฐ”๋กœ rm ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋Š” RUN ๋ช…๋ น์–ด๋กœ ์ด ๋”๋ฏธํŒŒ์ผ์„ ์‚ญ์ œํ•œ๋‹ค๊ณ  ํ•œ๋“ค ์‹ค์ œ๋กœ ๊ทธ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "100MB ๋”๋ฏธ ํŒŒ์ผ์„ ์‚ญ์ œํ•จ" ์ด๋ผ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ์ถ”๊ฐ€๋กœ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ 100MB์˜ ๋”๋ฏธํŒŒ์ผ์€ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด์— ๋‚จ์•„์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ์ €์žฅ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋˜ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๋”๋ฏธํŒŒ์ผ์ด ์‹ค๋ฌผ๋กœ ๋‚จ์•„์žˆ์ง€๋Š” ์•Š๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ํ•ด๋‹น ์ด๋ฏธ์ง€(dummy_img:v1 ์ด๋ฆ„์˜ ์ด๋ฏธ์ง€)๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€ /dummy ๋ผ๋Š” ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด 100MB์˜ ๋”๋ฏธ ํŒŒ์ผ์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ Dockerfile์— ์“ฐ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ && ๋ช…๋ น์–ด์ด๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” RUN ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜๋งŒ ์“ฐ๊ณ  ๊ฑฐ๊ธฐ์— ๋‹ค ๋ชฐ์•„์„œ ๋ช…์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ํ•˜๋‚˜์˜ RUN ๋ช…๋ น์–ด ๋‹น ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ Dockerfile์„ ๊ฐœ์„ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

FROM ubuntu:14.04
RUN mkdir /dummy && \
fallocate -l 100M /dummy/dummy_file && \
rm /dummy/dummy_file

 

$ docker build -t dummy_img:v1 .

 

๊ทธ๋ฆฌ๊ณ  ์œ„ 2๊ฐœ์˜ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ํ•œ๋ฒˆ ๋น„๊ตํ•ด๋ณด์ž.

 

 

๊ฐœ์„ ํ•œ Dockerfile ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“  dummy_img:v2 ๋ผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ 197MB๋กœ ์•ฝ 100MB ๋” ์šฉ๋Ÿ‰์ด ์ ์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, A, B๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋‘ ๊ฐœ ๋ชจ๋‘ C๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์šฉ๋Ÿ‰์ด ๊ฝค ์ปค์„œ ์•ฝ 700MB ์ •๋„๋กœ ํฐ ์‚ฌ์ด์ฆˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด ๋•Œ, ์šฐ๋ฆฌ๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  A, B ์ปจํ…Œ์ด๋„ˆ ๊ฐ๊ฐ์— C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ณ„๋กœ ์„ค์น˜ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋Œ€๋žต์ ์œผ๋กœ ์ตœ์†Œํ•œ 1.4GB๊ฐ€ ๋„˜๋Š” ์ €์žฅ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์„ค์น˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋จผ์ € ํ•˜๋‚˜ ๋งŒ๋“  ๋‹ค์Œ, ์ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ A, B ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋Œ€๋žต์ ์œผ๋กœ ์ตœ์†Œํ•œ 700MB๊ฐ€ ๋„˜๋Š” ์ €์žฅ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ „์ž์˜ ๊ฒฝ์šฐ๋ณด๋‹ค ์ ˆ๋ฐ˜์˜ ์ €์žฅ๊ณต๊ฐ„ ํšจ์œจ์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋„์ปค ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…๊ณผ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Dockerfile์— ๋Œ€ํ•ด์„œ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋„์ปค ๋ฐ๋ชฌ์ด๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

๋ฐ˜์‘ํ˜•