Search

Dockerfile

Created
2021/05/28
Tags
Docker
Dockerfile

Subjects

โ€ข

1. Dockerfile

1) ํ•„์š”์„ฑ

๊ธฐ์กด ๊ธ€์—์„œ ์†Œ๊ฐœ๋œ ๋ฐฉ๋ฒ•๋“ค๋กœ Image๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1.
์šด์˜์ฒด์ œ์— ํ•ด๋‹นํ•˜๋Š” Image๋ฅผ ์ด์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
2.
Container ๋‚ด๋ถ€์—์„œ ํ•„์š”ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋“ฑ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
3.
commit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Container์— ํ•ด๋‹นํ•˜๋Š” ์ƒˆ๋กœ์šด Image๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์€ ๋ชจ๋‘ ๋‹ค ์ˆ˜์ž‘์—…์œผ๋กœ ์ด๋ค„์ง€๋‹ค๋ณด๋‹ˆ ๋™์ผํ•œ Container๋ฅผ ์—ฌ๋Ÿฟ ๊ตฌ์„ฑํ•˜๊ณ  ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ ์„ค์ •์„ ์ฃผ์–ด ๊ฐ๊ฐ ๋‹ค๋ฅธ Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋ฐ˜๋ณต๋˜๋Š” ๋งŽ์€ ๋ช…๋ น์–ด๋“ค์„ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•˜๊ณ , ํ•ด๋‹น ๋ช…๋ น์–ด๋“ค์„ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ๊ณ„ ๋ณ„ ์ž‘์—…์ด ๋งˆ์น  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค.
๋ฌผ๋ก  ์ง์ ‘ ๋ชจ๋“  ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ž‘์—…์„ ์ผ์ผ์ด ํ™•์ธํ•ด๋ณด๊ณ  Image๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— Image์˜ ํ™•์‹คํ•œ ๋™์ž‘์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์ง€๋งŒ, ์ž‘์—…์˜ ๋น„ํšจ์œจ์„ฑ์„ ์ƒ๊ฐํ•˜๋ฉด ๊ทธ๋ฆฌ ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.
์ด์™€ ๊ฐ™์€ ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด Dockerfile์ด๋‹ค. Dockerfile์€ build ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ Image๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Dockerfile์„ ์ด์šฉํ•˜๋ฉด ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ช…์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑํ•˜๋ ค๋Š” Container์—์„œ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์š”๊ตฌ๋˜๊ณ , ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์–ด๋–ค ๋ช…๋ น์–ด๋“ค์ด ์‹คํ–‰๋˜๋Š”์ง€ ๋“ฑ Image๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ธฐ์žฌํ•จ์œผ๋กœ์จ ํ•œ ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์œ ์ง€ ๋ณด์ˆ˜์ ์ธ ์ธก๋ฉด์—์„œ๋„ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นŒ๋“œ์™€ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋“์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ ์ด ๋งŽ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์— Docker Hub์— Image๋ฅผ ๋ฐฐํฌํ•  ๋•Œ Dockerfile์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ •๋ง ๋งŽ๋‹ค.

2) ์ž‘์„ฑ ๋ฐฉ๋ฒ• ๋ฐ ์ฃผ์˜ํ•  ์ 

FROM ubuntu:14.04 LABEL author bigpel66 RUN apt-get update RUN apt-get install apache2 -y ADD ./test.html /var/www/html WORKDIR /var/www/html RUN ["/bin/bash", "-c", "echo hello >> test2.html"] EXPOSE 80 CMD apachectl -DFOREGROUND
Docker
์œ„ ์˜ˆ์‹œ์—์„œ ๊ธฐ์žฌ๋œ FROM, RUN, ADD, EXPOSE ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋“ค์€ Dockerfile์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด์ด๊ณ , ์œ„์˜ Dockerfile์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ Apache Web Server์— ๋Œ€ํ•œ Image๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ๋œ Dockerfile์˜ ๋ช…๋ น์–ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๊ธ€ ์•„๋ž˜์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋งฅ์— ๋Œ€ํ•ด์„œ๋งŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
์œ„ Dockerfile์—์„œ๋Š” test.html์„ ์š”๊ตฌํ•˜๋ฏ€๋กœ Dockerfile์ด ์œ„์น˜ํ•œ ๊ณณ์— ์•„๋ฌด ๋‚ด์šฉ์ด๋ผ๋„ ๋“ค์–ด๊ฐ„ test.html์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘ฌ์•ผ build ๋ช…๋ น์–ด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
Dockerfile์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์ด๋ฏ€๋กœ ํ•œ ์ค„ ํ•œ์ค„ ํ•ด์„๋˜์–ด ์‹คํ–‰๋˜๋ฉฐ, ์ž‘์„ฑ๋œ ํ•œ ์ค„์ด ๊ณง ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ด๋ฃจ๊ฒŒ ๋œ๋‹ค. Docker Engine์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” Dockerfile์—์„œ์˜ ๋ช…๋ น์–ด๋Š” ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์‰˜์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ช…๋ น์–ด์™€ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.
Dockerfile์€ ํ•œ ๋ฒˆ build ๋ช…๋ น์–ด๋กœ Image๋กœ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์— ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ์š”๊ตฌํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์–ด ํ‘œ์ค€ ์ž…๋ ฅ์ด ํ™œ์„ฑํ™”๋˜๋ฉด build ๋ช…๋ น์–ด๊ฐ€ ์ด๋ฅผ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ์˜ ์ง„ํ–‰์„ ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ RUN ๋ช…๋ น์–ด์—์„œ apt-get install apache2์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž์˜ ๋ฌธ๋‹ต์„ ์š”๊ตฌํ•˜๋Š” ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„  -y ์˜ต์…˜์ฒ˜๋Ÿผ ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜์ง€ ์•Š๋„๋ก ๋ฌธ๋‹ต์— ๋ชจ๋‘ y๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
docker build <path>
์ œ์‹œ๋œ ์˜ˆ์‹œ๋ฅผ Image๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” build ๋ช…๋ น์–ด๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด build ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•  ๋•Œ Dockerfile์˜ ํŒŒ์ผ ์ด๋ฆ„์„ ์ธ์ž๋กœ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Docker Engine์ด <path>๋กœ ์ฃผ์–ด์ง„ ๊ฐ’์„ Context๋กœ ์ด์šฉํ•˜์—ฌ, ํ•ด๋‹น ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” Dockerfile์ด๋ผ๋Š” ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, Dockerfile์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ Dockerfile์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
Context์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋™์ž‘ ์›๋ฆฌ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฌ๋‹ค. <path> ๋Œ€์‹ ์— <url>์„ ๊ธฐ์žฌํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, <url>์„ ๊ธฐ๋กํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์žฌํ•œ URL์—์„œ Dockerfile ๋‚ด์šฉ์„ ๊ฐ€์ ธ์™€์„œ build ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Dockerfile์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด -f ์˜ต์…˜์„ ๊ธฐ์žฌํ•จ์œผ๋กœ์จ Dockerfile์˜ ํŒŒ์ผ ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Dockerfile์ด๋ผ๋Š” ์ด๋ฆ„์„ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.
์œ„ ํ˜•ํƒœ์˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด Context์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ์—์„œ Dockefile์„ ์ฐพ์•„ Image๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๊ณ , ์ด ๋•Œ Docker Engine์— ์˜ํ•ด ์ž„์˜๋กœ 16์ž๋ฆฌ ์ด์ƒ์˜ Hashing๋œ Digest๊ฐ’์ด <image-id>๋กœ ํ• ๋‹น๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ <image-name>์ด ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Dangling Image๋กœ ์ƒ์„ฑ๋œ๋‹ค. Dangling Image๋กœ ์ƒ์„ฑ๋˜๋Š” ์ƒํ™ฉ์„ ํ”ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, -t ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ <image-name>์— ๋Œ€ํ•ด ๊ธฐ์žฌํ•ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ -t ์˜ต์…˜์€ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

3) ๋™์ž‘ ์›๋ฆฌ

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

Context ๋ฐ .dockerignore

build ๋ช…๋ น์–ด๋กœ Image๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด Docker Engine์€ build ๋ช…๋ น์–ด์— ๋Œ€ํ•œ Context๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ค. Context๋Š” build์— ๋Œ€ํ•œ Context๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, Image๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์š”๊ตฌ๋˜๋Š” ๊ฐ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ๋“ค์˜ ์œ„์น˜๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” Context๋ž€ Dockerfile์ด ์กด์žฌํ•˜๋Š” ๊ณณ์„ ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์–ด์˜ ์ธ์ž๋กœ ๋ฐ›์€ <path>๊ฐ€ ๊ณง Context๊ฐ€ ๋œ๋‹ค. ์ฆ‰, <path>์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ์— ์•ž ์„œ ์ œ์‹œ๋œ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ๋“ค์ด ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ํ•ด๋‹น ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ๋“ค์€ Dockerfile๊ณผ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Context์— ๋Œ€ํ•œ ํŒŒ์•…์ด ์™„๋ฃŒ๋˜๋ฉด, ADD์™€ COPY ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•  ๋•Œ ๊ธฐ์žฌํ•œ ํŒŒ์ผ ์ด๋ฆ„์€ ํ•ด๋‹น Context๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Context๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํŒŒ์ผ๋“ค์—๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋ฌธ์— Context๋ฅผ ํŒŒ์•…ํ•œ๋‹ค๋Š” ๋ง์€ ์ธ์ž๋กœ ๋ฐ›์€ <path>์˜ ๋ชจ๋“  ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ Context์— ํฌํ•จํ•œ๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Dockerfile์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ์—๋Š” Image๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค๋งŒ ๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ๊ฒƒ์ด ๋˜๋ฏ€๋กœ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋งŽ์ด ์กด์žฌํ•˜๋Š” ๊ณณ์— Dockerfile์„ ๋‘์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์˜ ํฌํ•จ์œผ๋กœ build ๋ช…๋ น์–ด ์ˆ˜ํ–‰์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์š”๊ตฌ๋  ์ˆ˜๋„ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Host์˜ ์ž์› ์ค‘ Memory๋ฅผ ์˜๋„์น˜ ์•Š๊ฒŒ ๋งŽ์ด ์ ์œ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ Dockerfile์„ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ์ตœ์ข…์ ์ธ Image์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์ง€๋งŒ ์ •์ƒ์ ์ธ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๋ชฉ์ ์œผ๋กœ ๋‘” ํŒŒ์ผ๋“ค์ด ์—ฌ๋Ÿฟ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ํŒŒ์ผ๋“ค์ด ์ƒํ™ฉ์— ๋”ฐ๋ผ Context์—์„œ ์‰ฝ๊ฒŒ ์ œ์™ธ๋  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ฒƒ์ด .dockerignore์ด๋‹ค. .dockerignore์€ .gitignore์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Context์—์„œ ์ œ์™ธํ•  ํŒŒ์ผ์„ .dockerignore์— ๋ช…์‹œ๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
Context์—์„œ ์ œ์™ธํ•  ํŒŒ์ผ๋“ค์„ .dockerignore์— ๋ช…์‹œํ–ˆ๋‹ค๋ฉด, .dockerignore๋Š” Dockerfile์— ํ•จ๊ป˜ ์œ„์น˜์‹œํ‚ค๊ธฐ๋งŒ ํ•˜๋ฉด build ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•  ๋•Œ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ Docker Engine์ด ์•Œ์•„์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „์— ์ฃผ์–ด์ง„ Dockerfile์„ ์ด์šฉํ•  ๋•Œ, .dockerignore์— test.html์„ ๋ช…์‹œํ•˜๋ฉด test.html์ด Context์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
.dockerignore์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ๋“ค์€ *, ?, ! ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ์•Œ์•„๋ณด์ž.
# ํ˜„์žฌ Context์—์„œ ๋ชจ๋“  html ํŒŒ์ผ์„ ์ œ์™ธํ•œ๋‹ค. # *์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์˜๋ฏธํ•œ๋‹ค. *.html # ํ˜„์žฌ Context์—์„œ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ์˜ html ํŒŒ์ผ์„ ์ œ์™ธํ•œ๋‹ค. # */๋Š” ํ•œ ๋‹จ๊ณ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ, ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์กด์žฌํ•˜๋Š” html ํŒŒ์ผ์€ ์ œ์™ธํ•˜์ง€ ์•Š๋Š”๋‹ค. */*.html # ํ˜„์žฌ Context์—์„œ test.htmm, test.htmn, test.htmo ๋“ฑ์„ ์ œ์™ธํ•œ๋‹ค. # ?์€ ํ•œ์ž๋ฆฌ ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. test.htm? # ํ˜„์žฌ Context์—์„œ test.html๋งŒ์€ ์ œ์™ธํ•˜์ง€ ์•Š๋Š”๋‹ค. # !์€ ์ œ์™ธํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. !test.html
Docker

Intermediate Container์˜ create, commit, remove

์ด์ „์— ์ž‘์„ฑ๋œ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด Image๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Container๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ ๋’ค commit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Image๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. Dockerfile์„ ์ด์šฉํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ Container๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ Container๋ฅผ ์ƒ์„ฑํ•ด๋‚ธ ๋’ค ์ด๋ฅผ Image๋กœ ์ฐ์–ด๋‚ด๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด build ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ Container๋Š” 1๊ฐœ๋งŒ ์œ ์ง€๋˜์–ด Image๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ? Image์˜ ์ƒ์„ฑ์€ 1๊ฐœ์˜ Container์—์„œ๋งŒ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. build ๋ช…๋ น์–ด์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋Œ€๋žต์ ์ธ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฐ ๋‹จ๊ณ„๋“ค์ด ์ˆ˜ํ–‰๋  ๋•Œ๋Š” ์ƒˆ๋กœ์šด Container๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ตœ์ข…์ ์ธ Image๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ์˜ˆ์‹œ๋Œ€๋กœ ์ถ”์ ํ•ด๋ณด๋ฉด FROM ๊ตฌ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” Container๋ฅผ ๋งŒ๋“ค๊ณ  Image๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ์—ฌ๊ธฐ์— ์‚ฌ์šฉ๋˜์—ˆ๋˜ Container๋ฅผ ์‚ญ์ œํ•˜๊ณ , ์ด์ „ Image๋ฅผ ์ด์šฉํ•˜์—ฌ RUN ๊ตฌ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” Container๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค์‹œ Image๋ฅผ ๋งŒ๋“  ๋’ค Container๋ฅผ ์‚ญ์ œํ•˜๋Š” ์‹์œผ๋กœ ์ตœ์ข… ๋‹จ๊ณ„๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค.
Storage Driver์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์„ ์ฝ์—ˆ๋‹ค๋ฉด ๋” ์ž์„ธํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ๋ฐ, ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ Image๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜์—ฌ ๊ทธ ์œ„์— Container๋ฅผ ์Œ“๊ณ  ์ด๋ฅผ ๋‹ค์‹œ Image๋ฅผ ๋งŒ๋“œ๋Š” ์‹์ด ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๊ตฌ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” Layer๋“ค์„ ๊ณ„์ธต์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. Image๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ์„ธ๋ถ€์ ์ธ Layer๋“ค์— ๋”ฐ๋ผ์„œ ์ฐจ์ด๋Š” ์žˆ๊ฒ ์ง€๋งŒ, Dockerfile์— ๊ธฐ์žฌ๋œ ๋ช…๋ น์–ด ํ•œ ์ค„๋งˆ๋‹ค ์ ์–ด๋„ ํ•˜๋‚˜์˜ Layer๋ฅผ ์ด๋ฃจ๊ฒŒ ๋˜๊ณ  ๊ทธ๋งŒํผ์˜ Container๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ Dockerfile์— ์ž‘์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ ๋ช…๋ น์–ด๊ฐ€ ํ•˜๋‚˜์˜ Layer๋ฅผ ์ด๋ฃจ๊ฒŒ ๋˜๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ Container์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ๊ฐ€ ๋ณ‘ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, Image๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์žˆ์–ด์„œ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ช…๋ น์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ์ค„๋“ค์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN mkdir /test RUN fallocate -l 100m /test/dummy RUN rm /test/dummy
Docker
ํŠนํžˆ RUN ๋ช…๋ ์–ด์— ๋Œ€ํ•ด์„œ ๋งŽ์€ ๋‹จ์ถ•์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑ๋œ ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ ์นจ์œผ๋กœ์จ ๋” ๋‚˜์€ build๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ build ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๋“ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Layer์˜ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Image์˜ ํฌ๊ธฐ๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
์œ„ ์ชฝ์˜ ๋ช…๋ น์–ด ๋ฌถ์Œ์€ 100MB์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œ ํ–ˆ์Œ์—๋„ ๊ฐ ๋ช…๋ น์–ด ํ–‰์ด Layer๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Image์˜ ํฌ๊ธฐ๊ฐ€ 100MB๋ฅผ ์›ƒ๋„๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋”ฐ. ์ด๋Š” 100MB์˜ ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ๋‹ค๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ธฐ๋ก๋งŒ ์žˆ์„ ๋ฟ ํŠน์ • Layer์—๋Š” 100MB๊ฐ€ ์กด์žฌํ•˜๋Š” ํ˜•ํƒœ๋กœ Image๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ณต๊ฐ„์— ๋Œ€ํ•ด์„œ Layer๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋„๋ก ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด Image์˜ ํฌ๊ธฐ๋ฅผ ํ™•์—ฐํžˆ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN mkdir /test && fallocate -l 100m /test/dummy && rm /test/dummy
Docker

Image Layer Cache

๋ช…๋ น์–ด๋ฅผ ๋‹จ์ถ•ํ•˜๋„๋ก ์‹ ๊ฒฝ ์จ์„œ Dockerfile์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋‹จ์  ์•„๋‹Œ ๋‹จ์  ์†์—์„œ Dockerfile์ด ๊ฐ–๋Š” ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์œผ๋ก  ๋ฌด์—‡์ด ์žˆ์„๊นŒ? Dockerfile์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋“ค์€ ์ƒˆ๋กœ์šด Container๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๊ฒƒ์œผ๋กœ Image๋ฅผ ๋งŒ๋“ฆ์œผ๋กœ์จ ์ตœ์ข… Image๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์„ ๋‘”๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, Docker์˜ Image๊ฐ€ ๊ฐ–๋Š” ์žฅ์ ์„ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด Image๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์€ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค. ์ฆ‰, ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋œ Layer๋“ค์€ ๋ชจ๋‘ ์‹œ์Šคํ…œ ์ƒ์— ์œ ์ง€๋˜๊ณ  ์žˆ๊ณ  ์ด๋ฅผ Cache๋กœ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Dockerfile์—์„œ ์ˆ˜ํ–‰๋œ ๋™์ผํ•œ ๋ช…๋ น์–ด๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ Layer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์ด์šฉ๋œ ๋™์ผํ•œ ๋ช…๋ น์–ด ๊ตฌ๋ฌธ๋“ค์€ build ๋ช…๋ น์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN apt-get update RUN apt-get install apache2 -y ADD ./test.html /var/www/html WORKDIR /var/www/html RUN ["/bin/bash", "-c", "echo hello >> test2.html"] EXPOSE 80 CMD apachectl -DFOREGROUND
Docker
FROM ubuntu:14.04 LABEL author bigpel66 RUN apt-get update
Docker
Apache Web Server์˜ Image๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์ œ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํŠน๋ณ„ํžˆ Cache์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†์—ˆ๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์ด 2๊ฐœ์˜ Dockerfile์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์ด๋ฅผ ๊ฐ๊ฐ ์‹คํ–‰ํ•ด๋ณด์ž.
์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ฒซ ๋ฒˆ์งธ build์—์„œ๋Š” Cache๋œ Layer๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ๋‘ ๋ฒˆ์งธ build์—์„œ๋Š” Cache๋œ Layer๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ build์—์„œ ์ด์ „์— ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๋ช…๋ น์–ด์™€ ๋™์ผํ•œ ๋ช…๋ น์–ด๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด Layer๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด์ „์— ๋งŒ๋“ค์–ด์ง„ Layer๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
Layer์˜ ์žฌ์‚ฌ์šฉ์œผ๋กœ build์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋Š” ๊ฒƒ์—๋Š” Dockerfile์„ ์ž˜๋ชป ์ž‘์„ฑํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠนํžˆ ๋” ๋งŽ์€ ์ด๋“์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ Apache Web Server์— ๋Œ€ํ•œ Image๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์„ ๋•Œ test.html์ด ์š”๊ตฌ๋˜๋Š” ์ƒํ™ฉ์—์„œ test.html์ด ์กด์žฌํ•˜์ง€ ์•Š์•„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์˜ค๋ฅ˜ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด build ์ˆ˜ํ–‰์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ด์ „๊นŒ์ง€์˜ Layer๋Š” ์ƒ์„ฑ๋œ ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ฅ˜๋ฅผ ๊ณ ์น˜๊ณ  ๋‹ค์‹œ build๋ฅผ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ Layer๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ test.html์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ด์ „์€ Cache๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ทธ ์ดํ›„๋ถ€ํ„ฐ build๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํฐ ํ๋ชจ์˜ Image๋ฅผ ์ƒ์„ฑํ•˜๋Š” Dockerfile์„ ๊ธด ์‹œ๊ฐ„๋™์•ˆ buildํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‹ค์‹œ ์ดˆ๊ธฐ ์ƒํ™ฉ์˜ ๊ธด ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค.
Image Layer Cache๋Š” ์ด์™€ ๊ฐ™์ด ํฐ ์žฅ์ ๋„ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋„ ์žˆ๋‹ค. GitHub์— ๊ด€๋ จ๋œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ์ด์— ํ•ด๋‹นํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ 1๋ฒˆ Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ git clone์ด๋ž€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Repository์—์„œ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์™€์„œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  git clone์˜ ๋Œ€์ƒ Repository์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ๋‹ค์‹œ build ํ•˜์—ฌ 2๋ฒˆ Image๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ์ƒํ™ฉ์ด ๋˜์—ˆ์„ ๋•Œ, ์‹œ์Šคํ…œ ์ƒ์—๋Š” git clone์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” Layer๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜์—ฌ git clone์ด๋ผ๋Š” ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด Layer๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ buildํ•œ Image์—๋Š” ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ์ดˆ๊ธฐ์— ์‚ฌ์šฉ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ, ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ Image๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์‹œ์Šคํ…œ ์ƒ์— ์œ ์ง€ ์ค‘์ธ Cache๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  build๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Cache๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, build ๋ช…๋ น์–ด์— Cache๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜ต์…˜์„ ๊ธฐ์žฌํ•จ์œผ๋กœ์จ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
docker builder prune
์‹œ์Šคํ…œ ์ƒ์— ์œ ์ง€ ์ค‘์ธ Layer๋“ค์˜ Cache๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์œ„์™€ ๊ฐ™๋‹ค.
docker build โ€”no-cache <path>
build ์‹œ์— Cache๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด โ€”-no-cache ์˜ต์…˜์„ ๊ธฐ์žฌํ•œ๋‹ค.
์ƒํ™ฉ์— ๋”ฐ๋ผ ๋งž๋Š” ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ Image๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๊ตณ์ด ๋ชจ๋“  Cache๋ฅผ ์ง€์šธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ž˜ ์ชฝ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๊ณ , build ๋ช…๋ น์–ด๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์ด ์‹ซ๊ณ  Cache๋ฅผ ์‚ญ์ œํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค๋ฉด ์œ„ ์ชฝ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

4) Multi-Stage

2๊ฐœ์˜ Dockerfile์„ ์ด์šฉํ•˜์—ฌ 2๊ฐœ์˜ Image๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ Container๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋งŒ์•ฝ ๋‘ Container๊ฐ€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋Š” ๋ถ„๋ช… ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์œ„ํ•œ Layer์˜ Cache๋ฅผ Image๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด์šฉํ–ˆ์„ ๊ฒƒ์ด๊ณ , ํ•ด๋‹น Layer๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Image์˜ ํฌ๊ธฐ๋Š” ์–ด๋–จ๊นŒ? ๋™์ผํ•œ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ Layer๋ฅผ 2๊ฐœ์˜ Image๊ฐ€ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ํ™˜๊ฒฝ์— ๋Œ€ํ•œ Layer ๋งŒํผ์„ ๋” ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ Image์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด Multi-Stage์ด๋‹ค. ์ฆ‰, Multi-Stage๋ฅผ ์ด์šฉํ•˜๋ฉด Container์˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ค‘๋ณต๋œ ๋งŽ์€ Dependencies์™€ Library๋“ค์„ ์‹œ์Šคํ…œ ์ƒ์— ์œ ์ง€ํ•จ๊ณผ ๋™์‹œ์— ์ตœ์ข…์ ์ธ Image์—๋Š” ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

(1) Multi-Stage๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

// test1.go package main import "fmt" func main() { fmt.Println("Hello World") }
Go
# Dockerfile1 FROM golang LABEL author bigpel66 ADD test1.go /root WORKDIR /root RUN go build -o /root/test /root/test1.go CMD ["./test"]
Docker
// test2.go package main import "fmt" func main() { fmt.Println("Hello 42") }
Go
# Dockerfile2 FROM golang LABEL author bigpel66 ADD test2.go /root WORKDIR /root RUN go build -o /root/test /root/test2.go CMD ["./test"]
Docker
Docker๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ด์šฉ๋œ Golang์œผ๋กœ Hello World๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” 1๋ฒˆ Dockerfile๊ณผ Hello 42๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” 2๋ฒˆ Dockerfile์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. (๊ฐ Dockerfile์ด ์š”๊ตฌํ•˜๋Š” go ํŒŒ์ผ๋„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.)
1๋ฒˆ Dockerfile์„ ์ด์šฉํ•˜์—ฌ build๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ test1์ด๋ผ๋Š” Image๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ๋ณ„๋„์˜ Cache๋œ Layer๋“ค์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์กฐ๊ธˆ์˜ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด Image๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋•Œ Hello World๋ผ๋Š” ์ถœ๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Golang์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.
2๋ฒˆ Dockerfile์„ ์ด์šฉํ•˜์—ฌ build๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด test2๋ผ๋Š” Image๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋Š” test1์„ ์ƒ์„ฑํ•  ๋•Œ ๋งŒ๋“ค์–ด์ง„ Layer๋“ค์„ Cache๋กœ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณง๋ฐ”๋กœ Image๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ Hello 42๋ผ๋Š” ์ถœ๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ์กด์˜ Golang์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์„œ๋กœ ๋‹ค๋ฅธ Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ Layer๋ฅผ ์žฌ์‚ฌ์šฉ ํ–ˆ์Œ์—๋„, ์ƒ์„ฑ๋œ Image๋“ค์„ ํ™•์ธํ•ด๋ณด๋ฉด ๊ทธ ํฌ๊ธฐ๊ฐ€ ๊ตฌ์„ฑ๋œ ํ™˜๊ฒฝ์˜ ํฌ๊ธฐ๋งŒํผ ๋”ํ•ด์ ธ 2๊ฐœ์˜ Image ๋ชจ๋‘ 864MB์˜ ํฐ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

(2) Multi-Stage๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ

Multi-Stage๋Š” Dockerfile ๋‚ด๋ถ€์— FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์„ ์—ฌ๋Ÿฟ ๋‘๊ณ  ์ด๋“ค์„ ๊ฐ๊ฐ์˜ Chunk๋กœ ๋ณด์•˜์„ ๋•Œ, ๋ช…๋ น์–ด๋“ค์„ ์ˆ˜ํ–‰ ํ›„ ๋งˆ์ง€๋ง‰ FROM ๊ตฌ๋ฌธ์˜ Chunk๋งŒ ์ตœ์ข…์ ์ธ Image๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•ด๋ณด์ž.
// test1.go package main import "fmt" func main() { fmt.Println("Hello World") }
Go
# Dockerfile1 FROM golang LABEL author bigpel66 ADD test1.go /root WORKDIR /root RUN go build -o /root/test /root/test1.go FROM alpine LABEL author bigpel66 WORKDIR /root COPY --from=0 /root/test ./ CMD ["./test"]
Docker
// test2.go package main import "fmt" func main() { fmt.Println("Hello 42") }
Go
# Dockerfile2 FROM golang LABEL author bigpel66 ADD test2.go /root WORKDIR /root RUN go build -o /root/test /root/test2.go FROM alpine LABEL author bigpel66 WORKDIR /root COPY --from=0 /root/test ./ CMD ["./test"]
Docker
1๋ฒˆ Dockerfile์„ ์ด์šฉํ•˜์—ฌ build๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ test1์ด๋ผ๋Š” Image๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ๋ณ„๋„์˜ Cache๋œ Layer๋“ค์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์กฐ๊ธˆ์˜ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด Image๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋•Œ Hello World๋ผ๋Š” ์ถœ๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Golang์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.
2๋ฒˆ Dockerfile์„ ์ด์šฉํ•˜์—ฌ build๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด test2๋ผ๋Š” Image๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋Š” test1์„ ์ƒ์„ฑํ•  ๋•Œ ๋งŒ๋“ค์–ด์ง„ Layer๋“ค์„ Cache๋กœ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณง๋ฐ”๋กœ Image๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ Hello 42๋ผ๋Š” ์ถœ๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ์กด์˜ Golang์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” Layer๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์„œ๋กœ ๋‹ค๋ฅธ Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ Layer๋ฅผ ์žฌ์‚ฌ์šฉํ•œ ๊ฒƒ์€ Multi-Stage๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์™€ ๋™์ผํ•˜์ง€๋งŒ, Image์—๋Š” ๊ทธ ํฌ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Dockerfile์˜ ๋ช…๋ น์–ด๋“ค์„ ๊ธ€ ์•„๋ž˜์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ, Multi-Stage์—์„œ ์‚ฌ์šฉ๋œ Dockerfile์„ ๊ฐ„๋‹จํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.
Multi-Stage๋ฅผ ์ด์šฉํ•  ๋•Œ FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์œผ๋กœ ๋‚ด๋ถ€์˜ ๋ช…๋ น์–ด๋“ค์„ ์—ฌ๋Ÿฌ Chunk๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด ๋•Œ ๊ฐ Chunk๋ฅผ index๋กœ์จ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ œ์‹œ๋œ Dockerfile์„ ์‚ดํŽด๋ณด๋ฉด COPY ๋ช…๋ น์–ด์— โ€”-from์ด๋ผ๋Š” ์˜ต์…˜์ด ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ โ€”-from์— ์ด์šฉ๋œ ๊ฐ’์ด FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์˜ Chunk๋ฅผ ์ง€์นญํ•˜๋Š” index๊ฐ€ ๋œ๋‹ค. ์ฒซ ๋ฒˆ์งธ FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์˜ Chunk๋Š” 0๋ฒˆ index, ๋‘ ๋ฒˆ์งธ FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์˜ Chunk๋Š” 1๋ฒˆ index๋ฅผ ๊ฐ€์ง€๋Š” ์‹์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‚˜๋‰˜์–ด์ง„ Chunk๋“ค์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ Image๋ฅผ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋Š”๋ฐ, Dockerfile์˜ ์ฒซ ๋ฒˆ์งธ Chunk๋Š” golang์ด๋ผ๋Š” Image๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด Image๋ฅผ ๋งŒ๋“ค๊ณ , ๋‘ ๋ฒˆ์งธ Chunk๋Š” alpine์ด๋ผ๋Š” Linux์˜ Image๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Image๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด ๋•Œ ๋‘ ๋ฒˆ์งธ Chunk๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์ฒซ ๋ฒˆ์งธ Chunk๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌํ•˜์—ฌ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ๋Š” ๋‘ ๋ฒˆ์งธ Chunk๋งŒ build์˜ ๊ฒฐ๊ณผ๋ฌผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค๋งŒ ์ตœ์ข… Image์— ์œ ์ง€ํ•˜๋ฉด์„œ Image์˜ ํฌ๊ธฐ๋ฅผ ๋งค์šฐ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
alpine์ด๋ผ๋Š” Image๋Š” ubuntu ๋ฐ CentOS์™€ ๋‹ฌ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๋Ÿฐ ํƒ€์ž„๋งŒ ํฌํ•จ๋œ Linux์˜ Image์ด๋‹ค. ํ•ด๋‹น Image๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฒฝ๋Ÿ‰ํ™”๋œ Image๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
FROM golang LABEL author bigpel66 ADD test.go /root WORKDIR /root RUN go build -o /root/test /root/test.go FROM alpine LABEL author bigpel66 WORKDIR /root COPY --from=0 /root/test ./ CMD ["./test"]
Docker
FROM golang as base LABEL author bigpel66 ADD test.go /root WORKDIR /root RUN go build -o /root/test /root/test.go FROM alpine LABEL author bigpel66 WORKDIR /root COPY --from=base /root/test ./ CMD ["./test"]
Docker
Multi-Stage๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ตœ์†Œ 2๊ฐœ์˜ Image๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ๊ฐ Chunk๋ฅผ index๋กœ์จ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ FROM ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์— as๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ„์นญ์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ„์— ์ œ์‹œ๋œ ์ฒซ ๋ฒˆ์งธ Dockerfile์„ ๋‘ ๋ฒˆ์งธ Dockerfile์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Dockerfile Commands

1) FROM

Image๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ์ฒ˜์Œ์— ์ด์šฉ๋  Image๋ฅผ ์˜๋ฏธํ•œ๋‹ค. FROM ๋ช…๋ น์–ด๋Š” Dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ ์ตœ์†Œํ•œ 1ํšŒ๋Š” ์ž…๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค. FROM์œผ๋กœ ์ž…๋ ฅํ•  Image๋Š” docker ๋ช…๋ น์–ด์—์„œ ์ž…๋ ฅํ–ˆ๋˜ <image-name>๊ณผ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ๊ธฐ์žฌํ•˜๋ฉด ๋˜๊ณ , ๋กœ์ปฌ์— ํ•ด๋‹น Image๊ฐ€ ์—†๋‹ค๋ฉด pull ๋ช…๋ น์–ด๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ Docker Hub์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.
# ๋ฒ„์ „ 14.04์˜ ubuntu๋ฅผ ์ดˆ๊ธฐ Image๋กœ ์‚ฌ์šฉ FROM ubuntu:14.04
Docker

2) LABEL

Image์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ด์šฉ๋˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” key : value ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Š” docker image inspect ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. LABEL ๋ช…๋ น์–ด๋Š” Dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋‹ˆ๋ฉฐ, ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์ด์šฉํ•˜์—ฌ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
# Image์— "author" : "bigpel66" ์ด๋ผ๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ LABEL author bigpel66
Docker

3) ADD & COPY

ADD์™€ COPY๋Š” ๊ณตํ†ต์ ์œผ๋กœ Host์—์„œ ์œ ์ง€ ์ค‘์ธ ํŒŒ์ผ์„ Image ๋‚ด๋ถ€์— ๋ณต์‚ฌํ•˜์—ฌ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ๋ช…์‹œํ•œ ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ build ๋ช…๋ น์–ด์˜ <path>๋ผ๋Š” Context๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•„ ์ฐพ๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด test.html์„ ๋ช…์‹œํ•˜์˜€๊ณ  build ๋ช…๋ น์–ด์˜ Context๊ฐ€ .์ด๋ผ๋ฉด, Dockerfile์ด ์œ„์น˜ํ•˜๋Š” ๊ณณ ๊ธฐ์ค€์œผ๋กœ ๋™์ผํ•œ ๊ณณ์— ์žˆ๋Š” ./test.html์„ ์ฐพ์•„ Image ๋‚ด๋ถ€์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.
# build ๋ช…๋ น์–ด์˜ Context๋ฅผ ๊ธฐ์ค€์œผ๋กœ test.html์„ ์ฐพ์•„ Image ๋‚ด๋ถ€์˜ /var/www/html์— ์ถ”๊ฐ€ ADD test.html /var/www/html
Docker
ADD์™€ COPY์˜ ๋™์ž‘์€ ๋ณต์‚ฌ๋ผ๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ, ADD์˜ ๋ช…๋ ์–ด ์ˆ˜ํ–‰์ด COPY์— ๋น„ํ•ด ์กฐ๊ธˆ ๋” ํฌ๊ด„์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค. COPY๋Š” build ๋ช…๋ น์–ด์˜ Context๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ์ปฌ์˜ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ๋•Œ๋งŒ ์ด์šฉ๋˜์ง€๋งŒ, ADD๋Š” ๊ทธ ํ™œ์šฉ ๋ฒ”์œ„๊ฐ€ URL ๋ฐ tar์™€ ๊ฐ™์€ ์•„์นด์ด๋น™ ํŒŒ์ผ์—๋„ ํ•ด๋‹น๋œ๋‹ค. ADD๋ฅผ ์ด์šฉํ•  ๋•Œ URL์„ ๊ธฐ์žฌํ•˜๊ฒŒ ๋˜๋ฉด, URL์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ๋ฐ›์•„์™€์„œ Image ๋‚ด๋ถ€์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , tar๋ฅผ ๊ธฐ์žฌํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ์•„์นด์ด๋น™์„ ํ’€์–ด์„œ Image ๋‚ด๋ถ€์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ URL๊ณผ tar ๋‚ด๋ถ€์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ๋“ค์ด ์–ด๋–ค ๊ฒƒ๋“ค์ธ์ง€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๊ธ‰์ ์ด๋ฉด ADD ๋ณด๋‹ค๋Š” COPY๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. COPY๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋กœ์ปฌ์˜ Context์—์„œ ํŒŒ์ผ์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์นด์ด๋น™์„ ํ’€์ง€ ์•Š์€ tar ์ž์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ณ , URL๊ณผ tar ๋‚ด๋ถ€์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ๋“ค์ด ๋ชจ๋‘ ์–ด๋–ค ํŒŒ์ผ์ธ์ง€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
# URL์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ /var/www/html์— ์ถ”๊ฐ€ ADD https://<some-repository>/<someone>/<file-name> /var/www/html # test.tar์˜ ์•„์นด์ด๋น™์„ ํ’€์–ด /var/www/html์— ์ถ”๊ฐ€ ADD test.tar /var/www/html
Docker

4) RUN

Dockerfile์„ ์ด์šฉํ•˜์—ฌ Image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ ๋ช…๋ น์–ด ํ•œ ์ค„์ด ๊ณง ํ•˜๋‚˜์˜ Layer๊ฐ€ ๋œ๋‹ค๊ณ  ํ–ˆ์—ˆ๊ณ , Layer๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ณผ์ •์—์„œ Container๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค. RUN ๋ช…๋ น์–ด๋„ ์ด์™€ ๊ฐ™์ด ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— RUN ๋ช…๋ น์–ด ์ˆ˜ํ–‰ ๋’ค์—๋Š” Image์˜ ํ•œ Layer๋กœ์จ ์œ ์ง€๋˜์ง€๋งŒ, Layer๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ด์ „์˜ Container ์ƒํƒœ์—์„œ๋Š” RUN ๋ช…๋ น์–ด์— ๊ธฐ์žฌ๋œ ์‰˜ ๋ช…๋ น์–ด๋“ค์„ Container ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, RUN ๋ช…๋ น์–ด์— ๊ธฐ์žฌ๋œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ Container ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ๋‹ค์Œ์˜ ์ƒํƒœ๊ฐ€ Layer๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.
# Container ๋‚ด๋ถ€์—์„œ apt-get update ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ RUN apt-get update # Container ๋‚ด๋ถ€์—์„œ apt-get install apache2 -y ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ # ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  yes๋ฅผ ๋‹ตํ•˜๋„๋ก -y ์˜ต์…˜์„ ์ด์šฉ RUN apt-get install apache2 -y
Docker
RUN ๋ช…๋ น์–ด ํ•˜๋‚˜๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ด์— ๋Œ€ํ•œ Layer๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฏ€๋กœ RUN ๋ช…๋ น์–ด๋ฅผ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ณ , ํ‘œ์ค€ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์ƒํ™ฉ์ด ๋˜๋ฉด build ๋ช…๋ น์–ด๋Š” ์ด๋ฅผ ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ ์ƒํ˜ธ์ž‘์šฉ์ด ์ด๋ค„์ง€์ง€ ์•Š๋„๋ก ์‰˜ ๋ช…๋ น์–ด์˜ ์ ์ ˆํ•œ ์˜ต์…˜์„ ์ทจํ•ด์•ผ ํ•œ๋‹ค.
RUN ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ RUN ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” RUN ["์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ", "์ธ์ž 1", "์ธ์ž 2", ...]๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. ๋‘ ๋ฐฉ๋ฒ•์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
๊ธฐ์กด์— ์ž‘์„ฑํ•œ RUN ๋ช…๋ น์–ด์™€ ๊ฐ™์ด json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด, sh -c๋ฅผ ์ด์šฉํ•˜์—ฌ Dockerfile์— ๊ธฐ์žฌํ•œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. -c ์˜ต์…˜์„ ์ด์šฉํ•˜๋ฉด ์‰˜์„ ์‹คํ–‰ํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์—ฌ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ์ž๋กœ ๋ฐ›์€ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰๋งŒ ํ•œ ํ›„ ๊ทธ ์—ญํ• ์„ ๋งˆ์น˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, -c ์˜ต์…˜์€ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์‰˜์˜ ์ง€์†์ ์ธ ์‹คํ–‰ ์—†์ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ฃผ๋กœ ์ด์šฉํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ๋”ฐ๋ผ์„œ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ RUN ๋ช…๋ น์–ด๋Š” sh -c๊ฐ€ ์ƒ๋žต์ด ๋˜์—ˆ์„ ๋ฟ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
๋ฐ˜๋ฉด์— json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ RUN ๋ช…๋ น์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด sh -c๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์—์„œ ์ ํžŒ ๊ฒƒ์„ ์ž˜ ์‚ดํŽด๋ณด๋ฉด json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ๋ช…๋ น์–ด๋Š” ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ๋ฌธ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์‰˜ ๋ช…๋ น์–ด๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ์Šคํ…œ ์ƒ์— ํŒŒ์ผ์„ ํ†ตํ•ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ RUN ๋ช…๋ น์–ด๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ๋„ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ๋ฅผ ํ†ตํ•ด json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ RUN ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์ด ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ๋” ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
# ์ œ์‹œ๋œ ๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด์šฉ๋˜๋Š” ๊ตฌ๋ฌธ RUN export NEW_ENV=docker # json ๋ฐฐ์—ด ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ RUN echo $NEW_ENV # json ๋ฐฐ์—ด ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ RUN ["sh", "-c" "echo $NEW_ENV"]
Docker
json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ RUN ๋ช…๋ น์–ด๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, echo ์—ญ์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— RUN ["echo", "์ธ์ž 1", "์ธ์ž 2", ...]์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์‹œ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ ๊ตฌ๋ฌธ์€ ๊ฐ€์žฅ ์ฒซ ์š”์†Œ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— RUN ["echo $NEW_ENV"]๋กœ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Š” $NEW_ENV ๋ถ€๋ถ„๋„ ํŒŒ์ผ์˜ ์ด๋ฆ„์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ RUN ["echo", "$NEW_ENV"]์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์‰˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ $NEW_ENV๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๋กœ echo๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์‹œ์— ์ž‘์„ฑ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‰˜์„ ํŒŒ์ผ๋กœ์จ ์‹คํ–‰ ์‹œํ‚จ ๋’ค, ์‰˜ ๋ช…๋ น์–ด๋“ค์„ ๊ทธ ์ธ์ž๋กœ ๋ฐ›๋Š” ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

5) WORKDIR

Dockerfile์— ๊ธฐ์žฌ๋œ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•  ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ์‰˜์—์„œ cd ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์œ„์น˜๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฐœ๋…์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ WORKDIR์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ cd๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด WORKDIR /root์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ ํ›„์— RUN touch test๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, /root/test๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์•„๋ž˜์— ๋ช…์‹œ๋œ ๋‘ ๋ช…๋ น์–ด ๊ตฌ๋ฌธ์€ ๋™์ผํ•œ ๊ตฌ๋ฌธ๋“ค์ด๋‹ค.
# ํ•œ ๋ฒˆ์— /root/some-directory๋กœ ์ด๋™ WORKDIR /root/some-directory # ๋‘ ๋ฒˆ์— ๊ฑธ์ณ /root/some-directory๋กœ ์ด๋™ WORKDIR /root WORKDIR some-directory
Docker

6) EXPOSE

Dockerfile๋กœ ์ƒ์„ฑ๋  Image๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์™ธ๋ถ€์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•ด ํฌํŠธ ํฌ์›Œ๋”ฉ์„ ํ•˜๋ ค๋Š” Port๋ฅผ ๋ช…์‹œํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ๋‹ค๋งŒ ์˜คํ•ดํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ ์ด ์žˆ๋Š”๋ฐ, EXPOSE ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ณง ๋ฐ”๋กœ Host์˜ Port์™€ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑ๋œ Image๋ฅผ ์ด์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด๋„ Host์˜ Port์™€ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. EXPOSE๋Š” ๋‹จ์ˆœํžˆ ํ•ด๋‹น Image๊ฐ€ ํŠน์ • Port๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•˜๊ณ  ์ด๋ฅผ ๋ฐํžˆ๋Š” ์—ญํ• ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Container ์ƒ์„ฑ ์‹œ EXPOSE์— ๋ช…์‹œ๋œ Port๋ฅผ ๋ฐ›์•„์™€ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ Port๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ „์ž๊ฐ€ docker run ๋ช…๋ น์–ด์˜ -P ์˜ต์…˜์ด๊ณ  ์ด๋Š” Host์˜ ๋ฌด์ž‘์œ„ Port๋กœ ๋ฐ”์ธ๋”ฉ ๋˜๋ฏ€๋กœ ์–ด๋–ค Port๋ฅผ ์ด์šฉํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ„๋„์˜ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค. ํ›„์ž๋Š” docker run ๋ช…๋ น์–ด์˜ -p ์˜ต์…˜์ด๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋Š” Port๋“ค์„ ์ง์ ‘ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
# ์ตœ์ข… Image๋Š” 80๋ฒˆ Port๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ž„์„ ๋ช…์‹œ EXPOSE 80
Docker

7) ENTRYPOINT & CMD

CMD ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Dockerfile๋กœ ๋งŒ๋“ค์–ด๋‚ธ Image๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์‰˜ ๋ช…๋ น์–ด๋ฅผ ๊ธฐ์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. Container ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ ์ดˆ๊ธฐ์— ์‚ฌ์šฉํ•  ์‰˜ ๋ช…๋ น์–ด๋งŒ ๋ฐ›์œผ๋ฏ€๋กœ Dockerfile์—์„œ 1ํšŒ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Docker์˜ run ๋ช…๋ น์–ด์˜ ๋ ์ธ์ž๋กœ Container์—์„œ ์‹คํ–‰ํ•  ์‰˜ ๋ช…๋ น์–ด๋ฅผ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ Dockerfile์— CMD๋ฅผ ๊ธฐ๋กํ•œ ์ƒํƒœ๋กœ Image๋ฅผ ๋งŒ๋“  ํ›„์— Docker์˜ run ๋ช…๋ น์–ด์˜ ๋ ์ธ์ž๋กœ Container์—์„œ ์‹คํ–‰ํ•  ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด Dockerfile์˜ CMD ๋ช…๋ น์–ด๋Š” ๋ฌด์‹œ๋œ๋‹ค.
Docker์˜ run ๋ช…๋ น์–ด์˜ ๋ ์ธ์ž๋กœ ์ถ”๊ฐ€์ ์ธ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  Dockerfile์˜ CMD๋ฅผ ์ด์šฉํ•˜์—ฌ Container์—์„œ ์‹คํ–‰ํ•  ์‰˜ ๋ช…๋ น์–ด๋ฅผ ๊ธฐ์žฌํ–ˆ๋‹ค๋ฉด, CMD์— ๊ธฐ๋ก๋œ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ์„œ Container๋ฅผ attach๋กœ ๋‘˜์ง€ detach๋กœ ์ค„์ง€๊ฐ€ ์ค‘์š”ํ•ด์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Apache Web Server์˜ Image๋ฅผ ๋งŒ๋“œ๋Š” Dockerfile์—์„œ CMD๋กœ apachectl -DFOREGROUND์™€ ๊ฐ™์ด ๋‘” ๊ฒฝ์šฐ์—๋Š”, Container๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ Container๋ฅผ detach๋กœ ๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. Container๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์‚ฌ์šฉ๋  ์‰˜ ๋ช…๋ น์–ด๋ฅผ Dockerfile์— ๊ธฐ์žฌํ•˜๋Š” ๋ช…๋ น์–ด๋Š” CMD ์™ธ์—๋„ ENTRYPOINT๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
ENTRYPOINT์™€ CMD๋Š” ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ENTRYPOINT์™€ CMD ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ์—๋Š” Dockerfile๋กœ ๋งŒ๋“ค์–ด๋‚ธ Image๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ ์€ ๋™์ผํ•˜์ง€๋งŒ, ENTRYPOINT์™€ CMD ๋ชจ๋‘ ์ด์šฉ๋œ ๊ฒฝ์šฐ์—๋Š” ENTRYPOINT๊ฐ€ CMD๋ฅผ ์ธ์ž๋กœ์จ ์ด์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
ENTRYPOINT์™€ CMD ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ด์šฉํ•˜์—ฌ ubuntu์—์„œ /bin/bash๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก Container๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž. ์ด์™€ ๊ฐ™์€ ์˜ˆ์‹œ์—์„œ๋Š” Dockerfile์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  Docker์˜ run ๋ช…๋ น์–ด๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ™•์ธํ–ˆ๋Š”๋ฐ, Docker์˜ run ๋ช…๋ น์–ด์—์„œ ENTRYPOINT์— ํ•ด๋‹นํ•˜๋Š” โ€”-entrypoint ์˜ต์…˜๊ณผ CMD์— ํ•ด๋‹นํ•˜๋Š” ๋ช…๋ ์–ด์˜ ๋ ์ธ์ž๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.
ENTRYPOINT์™€ CMD๋ฅผ ๋ชจ๋‘ ์ด์šฉํ–ˆ์„ ๊ฒฝ์šฐ์—” ENTRYPOINT๊ฐ€ CMD๋ฅผ ์ธ์ž๋กœ์จ ์ด์šฉํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ์—” ENTRYPOINT๊ฐ€ ๊ณง Container ์‹คํ–‰ ์‹œ ์ˆ˜ํ–‰ํ•  ์‰˜ ๋ช…๋ น์–ด๊ฐ€ ๋˜๊ณ , CMD๋Š” ์‰˜ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ENTRYPOINT์˜ ์ธ์ž๋กœ์จ ๋™์ž‘ํ•œ๋‹ค. ENTRYPOINT์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ ๋’ค์— CMD์˜ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ •๋ง ๋ง ๊ทธ๋Œ€๋กœ CMD๋Š” ENTRYPOINT์˜ ์ธ์ž๋กœ์จ ์ด์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
ENTRYPOINT์™€ CMD๋Š” ubuntu์˜ Image๋ฅผ ์ด์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•  ๋•Œ -i์™€ -t ์˜ต์…˜์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ ์–ด๋„ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด์กฐ๊ฑด ๋ช…์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค. Container๊ฐ€ ์‹คํ–‰ ์ƒํƒœ๋กœ ์žˆ๊ธฐ ์œ„ํ•ด์„  ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‘”๋‹ค๋Š” ๊ฒƒ์€ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋“  ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋“  ENTRYPOINT ํ˜น์€ CMD์˜ ์—ญํ• ์„ ํ†ตํ•ด์„œ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ENTRYPOINT์™€ CMD๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด์ œ๊นŒ์ง€์˜ Dockerfile์„ ์†Œ๊ฐœํ•˜๋Š” ์˜ˆ์‹œ๋“ค์„ ์ž˜ ์‚ดํŽด๋ณด๋ฉด, ENTRYPOINT์™€ CMD์—๋Š” ๋‹จ์ˆœํžˆ ์‰˜ ๋ช…๋ น์–ด๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ๊ธฐ์žฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋˜ํ•œ CMD์˜ ๊ฒฝ์šฐ์—” Docker์˜ run ๋ช…๋ น์–ด์˜ ๋ ์ธ์ž๋ฅผ ํ†ตํ•ด ๋ช…์‹œํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ENTRYPOINT๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์ง€์ •ํ•œ ๋’ค์—, ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์š”๊ตฌํ•˜๋Š” ์ธ์ž๋“ค์„ Container์˜ ์ƒ์„ฑ ์‹œ์ ์— ์ƒํ™ฉ์— ๋งž๋Š” ์ธ์ž๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ์ž๊ฐ€ ์ฃผ๋„๋ก ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1.
Container ์‹คํ–‰ ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ํ™˜๊ฒฝ ์„ค์ •์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑ
2.
ADD ํ˜น์€ COPY๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ Image ๋‚ด๋ถ€์— ๋ณต์‚ฌ
3.
๋ณต์‚ฌ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ENTRYPOINT๋กœ ์ง€์ •
4.
build๋ฅผ ํ†ตํ•ด Image๋ฅผ ์ƒ์„ฑ
5.
์ƒ์„ฑ๋œ Image๋ฅผ ์ด์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑ, ์ด ๋•Œ run์˜ ๋ ์ธ์ž๋กœ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•„์š”ํ•œ ์ธ์ž๋ฅผ ์ „๋‹ฌ
echo $1 $2
Shell
FROM ubuntu:14.04 LABEL author bigpel66 COPY entrypoint.sh /root RUN chmod 755 /root/entrypoint.sh ENTRYPOINT ["/bin/bash", "/root/entrypoint.sh"]
Docker
์œ„ ์Šคํฌ๋ฆฝํŠธ์™€ Dockerfile์„ ์ด์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ๊ณผ์ •๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ง์ ‘ ํ™•์ธํ•ด๋ณด์ž. ์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฆ„์€ entrypoint.sh์ด๋ฉฐ Dockerfile๊ณผ ๋™์ผํ•œ ๊ณณ์— ์œ„์น˜ํ•œ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์Šคํฌ๋ฆฝํŠธ์˜ ๋ชฉ์ ๋Œ€๋กœ Container ์ƒ์„ฑ ์‹œ ๊ธฐ์žฌํ•œ ์ธ์ž๋“ค์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์œ„์˜ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ๋œ Dockerfile๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด, ENTRYPOINT๊ฐ€ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ENTRYPOINT ๋ฐ CMD๋„ RUN ๋ช…๋ น์–ด ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์ด json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ , json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ์•ˆ ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ์„œ ๊ทธ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. ์ด์— ๋Œ€ํ•ด์„  ENTRYPOINT ๋ฐ CMD๋„ RUN์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.
ENTRYPOINT ๋ฐ CMD๋ฅผ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” sh -c๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰˜ ๋ช…๋ น์–ด ํ˜น์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. json ๋ฐฐ์—ด๋กœ ๋ช…์‹œํ•œ ๊ฒฝ์šฐ์—๋Š” ENTRYPOINT ๋ฐ CMD๋ฅผ sh -c๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์— ๋ช…์‹œ๋œ ๊ทธ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. json ๋ฐฐ์—ด์˜ ํ˜•์‹์€ ["์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ", "์ธ์ž 1", "์ธ์ž 2", ...]๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.
# ์‹ค์ œ๋กœ๋Š” sh -c echo test๋กœ ์ฒ˜๋ฆฌ CMD echo test # ์‹ค์ œ๋กœ๋Š” sh -c ./entrypoint.sh๋กœ ์ฒ˜๋ฆฌ ENTRYPOINT ./entrypoint.sh # ์‹ค์ œ๋กœ๋Š” sh -c ./entrypoint.sh sh -c echo test๋กœ ์ฒ˜๋ฆฌ CMD echo test ENTRYPOINT ./entrypoint.sh # ์‹ค์ œ๋กœ๋Š” /bin/bash ./entrypoint.sh echo test๋กœ ์ฒ˜๋ฆฌ CMD ["echo", "test"] ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]
Docker
๋”ฐ๋ผ์„œ ENTRYPOINT์™€ CMD๋ฅผ ํ•จ๊ป˜ ๋ช…์‹œํ•˜์—ฌ Dockerfile์„ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š”, ์ด์™€ ๊ฐ™์€ ํŠน์„ฑ๊นŒ์ง€๋„ ์ž˜ ๊ณ ๋ คํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

8) ENV

Dockerfile์—์„œ ์‚ฌ์šฉ๋  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ENV๋ฅผ ํ†ตํ•ด์„œ ์„ค์ •ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” Image ๋‚ด๋ถ€์—๋„ ์ €์žฅ๋˜๋ฏ€๋กœ Container๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ENV๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” Dockerfile์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ํ˜•ํƒœ๋ฅผ ${ENV_NAME}์œผ๋กœ ์ด์šฉํ•œ๋‹ค. Docker์˜ run ๋ช…๋ น์–ด์—์„œ -e ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์— ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 ENV new_env config.json RUN touch /root/$new_env
Docker
ENV์—๋Š” ์žฌ๋ฐŒ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ, ${ENV_NAME} :- ${VALUE}์™€ ${ENV_NAME} :+ ${VALUE}์ด๋‹ค. :-๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด VALUE๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ์ด๊ณ , :+๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด VALUE๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  buildํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์•„๋ณด์ž.
FROM ubuntu:14.04 LABEL author bigpel66 ENV no_env "" ENV new_env new_value RUN echo ${new_env:-value} / ${new_env:+value} / ${no_env:-nothing} / ${no_env:+nothing}
Docker

9) VOLUME

VOLUME์œผ๋กœ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด Host ๊ณต๊ฐ„์— Docker Volume์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— Docker Volume์„ mountํ•˜์—ฌ Host์™€ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด VOLUME์„ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ 2๊ฐœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ž‘์„ฑํ•˜๋ฉด, Container ์ƒ์„ฑ ํ›„์— 2๊ฐœ์˜ Docker Volume์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN mkdir /root/test1 /root/test2 RUN echo test1 >> /root/test1/testfile && echo test2 >> /root/test2/testfile VOLUME ["/root/test1", "/root/test2"]
Docker

10) ARG

ARG๋Š” build ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ„๋„์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ž๋ฅผ ๋ฐ›์•„ Dockerfile ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•ด์ค€๋‹ค. ์ด ๋•Œ ARG๋กœ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ build ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. build ๋ช…๋ น์–ด์—์„œ ARG๋กœ ์ง€์ •ํ•œ ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹น ๋ฐ›๋Š” ์˜ต์…˜์€ โ€”-build-arg์ด๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 ARG arg_1 ARG arg_2=value2 RUN touch /root/${arg_1} && touch /root/${arg_2}
Docker
ARG๋กœ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๋Š” ENV์™€ ๋™์ผํ•˜๊ฒŒ ${ARG_NAME}๋กœ Dockerfile ๋‚ด์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ARG์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ENV์™€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๊ธ‰์ ์ด๋ฉด ๊ทธ ์ด๋ฆ„์ด ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ํ˜น์‹œ๋‚˜ Dockerfile ๋‚ด์—์„œ ARG๋กœ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๋ฅผ ENV์—์„œ ๋‹ค์‹œ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด โ€”-build-arg๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋”๋ผ๋„ ENV์— ์˜ํ•ด ๊ฐฑ์‹ ๋œ๋‹ค. ์ฆ‰, ENV์™€ ARG๋Š” ์„œ๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Dockerfile ๋‚ด๋ถ€์—์„œ ์ตœ์ข…์ ์œผ๋กœ ์ •์˜๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋‘ ๋ช…๋ น์–ด์˜ ์ฐจ์ด๋Š” ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ž…๋ ฅ์„ ๋ฐ›๋Š”์ง€ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ARG๋Š” Dockerfile์—์„œ ENV์™€ ๋™์ž‘๋งŒ ๊ฐ™์„ ๋ฟ Container ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ENV์™€์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค.

11) USER

Container๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž๋Š” root์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ Container์˜ ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ USER์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •๋ช…์ด๋‚˜ UID๋ฅผ ์ด์šฉํ•˜์—ฌ USER๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Container ์ƒ์„ฑ ์‹œ์—๋Š” root ์™ธ์—๋Š” ๋ณ„๋„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Dockerfile์—์„œ RUN ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ทธ๋ฃน ๋ฐ ๊ทธ์— ๋Œ€ํ•œ ๊ณ„์ •๋ช…์„ ์ƒ์„ฑํ•œ ๋’ค USER๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. root๋ฅผ ๊ผญ ์ด์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ Container๋ฅผ ์ด์šฉํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ด์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๋ฅผ ๋‚˜๋ˆ„์–ด ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN groupadd new_group && useradd -g new_group bigpel66 USER bigpel66
Docker

12) STOPSIGNAL

์‹คํ–‰ ์ค‘์ธ Container๋“ค์€ ์ •์ง€ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํŠน์ • SIGNAL์„ ๋‚ด๋ณด๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ, ์ด SIGNAL์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ๊ฐ๊ฐ ๋‹ค๋ฅด๋‹ค. Dockerfile์—์„œ STOPSIGNAL์„ ๋ช…์‹œํ•˜๊ฒŒ ๋˜๋ฉด, Container๊ฐ€ ์ •์ง€๋˜์—ˆ์„ ๋•Œ STOPSIGNAL์— ํ•ด๋‹นํ•˜๋Š” SIGNAL์„ ๋‚ด๋ณด๋‚ด๋ฉด์„œ ์ด์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. STOPSIGNAL์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” SIGTERM์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. STOPSIGNAL ์—ญ์‹œ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋“ค์ฒ˜๋Ÿผ Docker์˜ run ๋ช…๋ น์–ด์—์„œ โ€”-stop-signal์ด๋ผ๋Š” ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
FROM ubuntu:14.04 STOPSIGNAL SIGKILL
Docker
์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š” SIGNAL๋“ค์€ TERMINATION SIGNAL์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ด์— ํ•ด๋‹นํ•˜๋Š” SIGNAL๋“ค์€ ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

13) HEALTHCHECK

HEALTHCHECK๋Š” build๋œ Image๋กœ Container๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ Container๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด์ด๋‹ค. Container ๋‚ด๋ถ€์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ ๊ธฐ๋Šฅ์„ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์— ์ด๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์ฃผ๋กœ ์ด์šฉ๋œ๋‹ค. HEALTHCHECK๋ผ๋Š” ๋ช…๋ น์–ด๋Š” Container ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์‚ฌ์ „์— curl์ด ๋จผ์ € ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ์•ผ ์–ผ๋งŒํผ์˜ ์ฃผ๊ธฐ๋กœ ํ™•์ธํ• ์ง€, ์ตœ๋Œ€ ๋ช‡ ํšŒ๊นŒ์ง€์˜ ์š”์ฒญ์„ ๋ณด๋‚ผ์ง€, ์š”์ฒญ ๋‹น ์–ผ๋งŒํผ์˜ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆด์ง€ ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
์–ผ๋งŒํผ์˜ ์ฃผ๊ธฐ๋กœ ํ™•์ธํ•˜๋Š”์ง€๊ฐ€ โ€”-interval ์˜ต์…˜์ด๊ณ , ์ตœ๋Œ€ ๋ช‡ ํšŒ๊นŒ์ง€์˜ ์š”์ฒญ์„ ๋ณด๋‚ผ์ง€๊ฐ€ โ€”-retries ์˜ต์…˜์ด๊ณ , 1ํšŒ์˜ ์š”์ฒญ ๋‹น ๊ธฐ๋‹ค๋ฆด ์ตœ๋Œ€ ์†Œ์š” ์‹œ๊ฐ„์ด โ€”-timeout ์˜ต์…˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด curl์ด๋ผ๋Š” ๋ช…๋ น์–ด ์•ž์— CMD๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค. 1ํšŒ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ๋„˜์–ด์„œ๋„ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด 1ํšŒ์˜ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ์ฃผ๊ธฐ๋งˆ๋‹ค ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์ตœ๋Œ€ ์š”์ฒญ ํšŸ์ˆ˜๊นŒ์ง€ ์‘๋‹ต์„ ๋ฐ›๋Š”๋ฐ ์‹คํŒจํ•˜๋ฉด HEALTHCHECK๋Š” Container ๋‚ด๋ถ€์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ unhealthy๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์กฐ๊ฑด๋“ค์„ ํ† ๋Œ€๋กœ Dockerfile์„ ์ž‘์„ฑํ•˜์—ฌ Image๋ฅผ ๋งŒ๋“ค๊ณ  Container๊นŒ์ง€ ์ƒ์„ฑํ•ด๋ณด์ž.
FROM centos:7 RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo RUN yum -y install nginx curl HEALTHCHECK --interval=10s --retries=3 --timeout=3s CMD curl http://127.0.0.1/ || exit 1 CMD ["nginx", "-g", "daemon off;"]
Docker
์œ„์˜ ์˜ˆ์‹œ๋Š” 10์ดˆ์˜ ์ฃผ๊ธฐ๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ตœ๋Œ€ 3ํšŒ๊นŒ์ง€์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉฐ, ํ•œ ๋ฒˆ์˜ ์š”์ฒญ ๋‹น 3์ดˆ๊ฐ€ ๋„˜๊ฒŒ ๊ฑธ๋ฆฌ๋ฉด 1ํšŒ์˜ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๋„๋ก HEALTHCHECK๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๋˜ํ•œ nginx๋ฅผ ๋กœ์ปฌ์—์„œ ๋Œ๋ฆฌ๋„๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— https://localhost๋กœ curl์„ ๋ณด๋‚ด๋„๋ก ํ–ˆ์œผ๋ฉฐ, ์ตœ๋Œ€ ์š”์ฒญ์„ ๋„˜์–ด์„œ๋ฉด unhealthy๋กœ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด exit 1์œผ๋กœ ์ฃผ์—ˆ๋‹ค. (exit 0๋Š” healthy๋ฅผ ์˜๋ฏธํ•˜๊ณ  exit 2๋Š” starting์ด๋ผ๊ณ  ํ•˜์—ฌ ์˜ˆ์•ฝ๋œ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.) ๋˜ํ•œ nginx์—์„œ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋Š” Port๋“ค์„ Host์™€ ๋ฐ”์ธ๋”ฉ ํ•˜๊ธฐ ์œ„ํ•ด -P ์˜ต์…˜์„ ์ด์šฉํ–ˆ๋‹ค.
HEALTHCHECK๋ฅผ ์ด์šฉํ•˜์—ฌ Image๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ Container๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด docker ps ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ STATUS ํƒญ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ healthy์™€ unhealthy๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋Š” docker ps๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, docker container inspect ๋ช…๋ น์–ด๋กœ State๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

14) SHELL

RUN, ENTRYPOINT, CMD ๋ฅผ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด sh -c๋กœ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์šฉํ•˜๋Š” ์‰˜์„ sh๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‰˜๋กœ ์ง€์ •ํ•  ๋•Œ SHELL์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ๋‹ค. RUN, ENTRYPOINT, CMD์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ์‰˜์„ ํ•ญ์ƒ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ๋„ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์œผ๋‚˜, json ๋ฐฐ์—ด์„ ๊ผญ ์จ์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ์‰˜ ๋ช…์‹œ๋งŒ์„ ์œ„ํ•ด json ๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” SHELL ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. SHELL ๋ช…๋ น์–ด๋Š” ๋ฐ˜๋“œ์‹œ json ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
FROM ubuntu:14.04 LABEL author bigpel66 RUN apt-get install zsh -y SHELL ["/usr/bin/zsh"]
Docker

15) ONBUILD

ONBUILD ๋ช…๋ น์–ด๋Š” ONBUILD, FROM๊ณผ ๋ช…๋ น์–ด๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ช…๋ น์–ด๋“ค ์•ž์— ๋ถ™์„ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ONBUILD ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์ตœ์ดˆ build๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ , build๋œ Image๋ฅผ ์ด์šฉํ•˜์—ฌ build๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ONBUILD๊ฐ€ ์‚ฌ์šฉ๋œ Dockerfile์˜ depth๋ฅผ 0์ด๋ผ ํ•˜๊ณ  ํ•ด๋‹น Image๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ Dockerfile์˜ depth๊ฐ€ 1์ด๋ผ ํ•  ๋•Œ, 0์—์„œ ์ž‘์„ฑํ•œ ONBUILD๋Š” 1์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, 1์„ ์ด์šฉํ•œ Dockerfile์˜ depth๊ฐ€ 2๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋Š” 0์˜ ONBUILD ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์ด์™€ ๊ฐ™์ด ONBUILD๋Š” Parent - Child ๊ตฌ์กฐ์—์„œ๋งŒ ์ ์šฉ์ด๋  ๋ฟ์ด๊ณ  Child์—๊ฒŒ ์ƒ์†๋˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋‹ˆ๋‹ค. ONBUILD ๋ช…๋ น์–ด๋ฅผ ์ž˜ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•จ์œผ๋กœ์จ Dockerfile์„ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
FROM ubuntu:14.04 RUN echo "base echoing" ONBUILD RUN echo "onbuild echoing"
Docker
FROM onbuild_testing RUN echo "onbuild finished"
Docker
์œ„ ์ชฝ ๋ช…๋ น์–ด๊ฐ€ ์ฒซ ๋ฒˆ์งธ Dockerfile์„ ์ด์šฉํ•˜์—ฌ Image๋ฅผ ๋งŒ๋“  ๊ฒƒ์ด๊ณ , ์ด๋ ‡๊ฒŒ ๋งŒ๋“  Image๋ฅผ ์ด์šฉํ•˜์—ฌ ์•„๋ž˜ ์ชฝ ๋ช…๋ น์–ด๋กœ build๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ด๋‹ค.

3. Reference

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