[๐Ÿ‹Docker] Dockerfile ์ด๋ž€? (feat. Dockerfile ์ž‘์„ฑ ๋ช…๋ น์–ด)

vincaยท2023๋…„ 12์›” 7์ผ
0
post-thumbnail

DockerFile ์ด๋ž€?

Docker ์ƒ์—์„œ ์ž‘๋™์‹œํ‚ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•œ ํŒŒ์ผ
Docker build ๋ช…๋ น์„ ํ†ตํ•ด Docker file ์— ๊ธฐ์ˆ ๋œ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Docker image๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

DockerFile์˜ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ

  • FROM : ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ •
  • VOLUME : ๋ณผ๋ฅจ ๋งˆ์šดํŠธ
  • RUN : ๋ช…๋ น ์‹คํ–‰
  • USER : ์‚ฌ์šฉ์ž ์ง€์ •
  • CMD : ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ช…๋ น (์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ฐ€๋Šฅ)
  • ENTRYPOINT : CMD ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ช…๋ น (์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ถˆ๊ฐ€)
    WORKDIR : ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ
  • EXPOSE : ํฌํŠธ ์ต์ŠคํฌํŠธ
  • ONBUILD : ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น

DockerFile์„ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

# ๊ธฐ๋ณธ
docker build -t my_ubuntu:1.0 .
# ๋„์ปคํŒŒ์ผ์˜ ์ด๋ฆ„์ด Dockerfile์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ์ง์ ‘ -f ์˜ต์…˜์„ ํ†ตํ•ด ์จ์ค˜์•ผํ•œ๋‹ค.
docker build -t my_ubuntu:2.0 -f ./new_dockerfile .

-t : ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ๋ถ™์ด๋Š” ์˜ต์…˜.

  • my_ubuntu:1.0์€ my_ubuntu๋ผ๋Š” ์ด๋ฏธ์ง€์— 1.0์ด๋ผ๋Š” ํƒœ๊ทธ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

-f : Dockerfile์˜ ๊ฒฝ๋กœ์™€ ํŒŒ์ผ๋ช…์„ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ Docker๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
    ๋งŒ์•ฝ Dockerfile์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” -f ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ -f ./new_dockerfile์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

. : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐํ˜ธ.

  • Dockerfile์ด ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ด ์žˆ์„ ๋•Œ, .์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile์„ ๋นŒ๋“œํ•œ๋‹ค.
    ์ด๋Ÿฌํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ "๋นŒ๋“œ ์ปจํ…์ŠคํŠธ(build context)"๋ผ๊ณ  ํ•œ๋‹ค.

RUN

RUN [์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋ช…๋ น]

RUN์€ ์‹ค์ œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
์ด๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํฌํ•จ๋˜๋Š” ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์— ๊ด€์—ฌํ•œ๋‹ค.

์ฃผ๋กœ ํŒจํ‚ค์ง€ ์„ค์น˜, ์†Œํ”„ํŠธ์›จ์–ด ์„ค์น˜, ์„ค์ • ๋ณ€๊ฒฝ ๋“ฑ๊ณผ ๊ฐ™์ด ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ ํ•„์š”ํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

RUN ๋ช…๋ น์–ด์˜ ๊ธฐ์ˆ  ๋ฐฉ์‹

RUN ๋ช…๋ น์„ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ shell ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฉ์‹๊ณผ Exec ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

CMD

CMD [์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋ช…๋ น]

CMD ๋ช…๋ น์–ด๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๊ฐ€ ๋˜์–ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋™์ž‘ํ•œ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์‹œ์˜ docker run ๋ช…๋ น์–ด ๋งจ ๋์— ์˜ค๋Š” CMD ๋ช…๋ น์–ด๋ฅผ ๋ฎ์–ด์”Œ์šด๋‹ค.

CMD ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ๋””ํดํŠธ๋กœ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋กœ, ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿง RUN๊ณผ์˜ ์ฐจ์ด?

โ€ขRUN์€ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์— ํ•„์š”ํ•œ ๋ช…๋ น์„ ๊ธฐ์ˆ ํ•˜์ง€๋งŒ, CMD๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ์—์„œ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

โš ๏ธ Dockerfile ์—๋Š” ํ•˜๋‚˜์˜ CMD ๋ช…๋ น์„ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งŒ์ผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ช…๋ น๋งŒ ์œ ํšจํ•˜๋‹ค.

ENTRYPOINT

CMD ๋ช…๋ น์–ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ณ ์ •๋œ ๋ช…๋ น์–ด. CMD์™€ ๋‹ค๋ฅด๊ฒŒ ๊ฐ•์ œ์„ฑ์„ ๊ฐ€์ง„๋‹ค.

์ฆ‰, CMD๋Š” ENTRYPOINT์— ์ง€์ •๋œ ์‹คํ–‰ ๋ช…๋ น์–ด์˜ ์˜ต์…˜ ๋ฐ ์ธ์ž๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ENTRYPOINT ๊ธฐ์ˆ  ๋ฐฉ๋ฒ•

  • Exec ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ 
    ENTRYPOINT [โ€œnginxโ€, โ€œ-gโ€, โ€œdaemon off;โ€]

  • Shell ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ 
    ENTRYPOINT nginx โ€“g โ€œdaemon off;โ€

ENTRYPOINT ์˜ˆ์ œ

  • ์ด๋ฏธ์ง€ ๋นŒ๋“œ
    • top ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง
      -d 10 ์˜ต์…˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐฑ์‹  ์ฃผ๊ธฐ๋ฅผ 10์ดˆ๋กœ ์„ค์ •
  • ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๊ฒฐ๊ณผ
  • ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    ENTRYPOINT๊ฐ€ ๊ณ ์ •๋œ ์ƒํƒœ๋กœ CMD ์ปค๋ฉ˜๋“œ๋ฅผ ๊ฐ๊ฐ ์ˆ˜์ •ํ•˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑํ•ด๋ณด์ž.
    CMD ๋ถ€๋ถ„์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๊ฐ€๋ฉฐ run ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ entry_sample:1.0 ์ด๋ฏธ์ง€์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๋„์ปค ํŒŒ์ผ

# ๋„์ปคํŒŒ์ผ
FROM ubuntu:latest
ENV vinca=0121
# ํ•œ๋ฒˆ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
CMD echo ${vinca}
๋˜๋Š”
# 5์ดˆ๋งˆ๋‹ค ์ถœ๋ ฅ
CMD ["bash", "-c", "while true; do echo ${vinca}; sleep 5; done"]

์‹คํ–‰ ๋ช…๋ น์–ด

bin/bash์™€ ๊ฐ™์ด ๋’ค์— ๋ช…๋ น์–ด๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ๋„์ปค ์ด๋ฏธ์ง€๋กœ ์ •์˜ํ•œ CMD ๋ช…๋ น์–ด๋Š” ๋ฌด์‹œ๋˜๊ณ  /bin/bash๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

# bash ์‰˜์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ 
docker run -it --name=my_container my_image:1.0 /bin/bash
# bash ์‰˜์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ "CMD echo ${vinca}" ๋ถ€๋ถ„์ด ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋จ
docker run -it --name=my_container my_image:1.0

ํ—ฌ์Šค์ฒดํฌ

FROM ubuntu:latest

# apt ์—…๋ฐ์ดํŠธ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ดˆ๊ธฐ ์ค€๋น„ ์ž‘์—… ์ˆ˜ํ–‰
RUN apt update -y

# ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋  ๋ช…๋ น์–ด ์„ค์ • (์˜ˆ: ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ์‹คํ–‰)
CMD ["python3", "-m", "http.server", "8080"]

# exec ํ˜•์‹์˜ ํ—ฌ์Šค ์ฒดํฌ ์ •์˜
HEALTHCHECK --interval=30s --timeout=3s \
  CMD [ "wget", "-q", "http://localhost:8080" ] || exit 1

docker compose์—์„œ์˜ ํ—ฌ์Šค์ฒดํฌ

์†Œ์Šค์ฝ”๋“œ

๊ฒฐ๊ณผ

profile
๋ถ‰์€ ๋ฐฐ ์˜ค์ƒ‰ ๋”ฑ๋‹ค๊ตฌ๋ฆฌ ๊ฐœ๋ฐœ์ž ๐ŸฆƒCloud & DevOps

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