[๐Ÿณ Docker ๐Ÿณ] DockerFile

Yohan_05ยท2023๋…„ 2์›” 2์ผ
0

Docker

๋ชฉ๋ก ๋ณด๊ธฐ
9/11

Dockerfile ๋ฌธ๋ฒ•

FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

๋„์ปค ๊ณต์‹ ๋ฌธ์„œ์— ๊ฐ€๋ณด๋ฉด ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Format

ํ˜•์‹์€ Dockerfile .

# Comment
INSTRUCTION arguments
  • ๋ช…๋ น์–ด๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ. ํ•˜์ง€๋งŒ ์ธ์ˆ˜์™€ ๋” ์‰ฝ๊ฒŒ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ฌธ์ž๋กœ ์ง€์ •ํ•˜๋Š” ํŽธ์ž„.
  • Docker ๋ช…๋ น์„ Dockerfile ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•จ.
  • ๋„์ปค ํŒŒ์ผ์€ from ๋ช…๋ น์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผํ•จ.
  • from ๋ช…๋ น์€ ๋นŒ๋“œํ•  ์ƒ์œ„ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•จ.
  • from ์€ ๋„์ปค ํŒŒ์ผ์˜ from ํ–‰์— ์‚ฌ์šฉ๋˜๋Š” ์ธ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ arg ๋ช…๋ น์–ด ์•ž์—๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Œ.
  • ๋„์ปค๋Š” #๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ–‰์„ ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•จ.

์ฃผ์š” ๋ช…๋ น

FROM

  • ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ • ๋ช…๋ น
  • Dockerfile์—์„œ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ช…๋ น์–ด์ž„.
  • ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ž€ ๊ทธ ์ถฉ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์ด๋ฏธ์ง€์ด๊ณ  FROM์ด ์ด ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ด์คŒ.

LABEL

  • = ํ˜•์‹์œผ๋กœ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • ๋ณดํ†ต ์ €์ž,๋ฒ„์ „,์„ค๋ช…,์ž‘์„ฑ์ผ์ž ๋“ฑ์„ ๊ฐ๊ฐ key = value ํ˜•์‹์œผ๋กœ ์ ๋Š”๋‹ค.
LABEL maintainer="dev.yohan05@gmail.com"

CMD

  • ํ•ด๋‹น dockerfile ๋กœ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ, ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋  ํ”„๋กœ๊ทธ๋žจ์„ ๊ธฐ์ˆ 
  • CMD๋Š” ํ•˜๋‚˜์˜ dockerfile์—์„œ ํ•œ ๊ฐ€์ง€๋งŒ ์„ค์ •๋˜๋ฉฐ, ๋งŒ์•ฝ cmd ์„ค์ •์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ, ๋งจ ๋งˆ์ง€๋ง‰์— ์„ค์ •๋œ CMD ์„ค์ •๋งŒ ์ ์šฉ๋จ.

RUN

  • ๋„์ปค ๋ช…๋ น์–ด์˜ run ์™€๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์–ด
  • ์ด ํ•ญ๋ชฉ์˜ ๊ธฐ๋Šฅ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” docker ์ด๋ฏธ์ง€์˜ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์•Œ์•„์•ผํ•จ.
    • docker๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ, ํ•˜๋‚˜์˜ layer๋งŒ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ layer๋ฅผ ์ธต์ธต์ด ์Œ“์•„์•ผํ•จ.
    • RUN ๋ช…๋ น์€ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์‹œ, ์ผ์ข…์˜ layer์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„, ๋ณดํ†ต ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€์— ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•จ.

...

RUN apt-get update
RUN apt-get install -y apache2

# ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.

ENTRYPOINT

๋งŒ์•ฝ dockerfile ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ๋‹ค์Œ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ docker run ์œผ๋กœ ์ƒ์„ฑ/์‹คํ–‰ํ•˜๋ฉด์„œ ๋ช…๋ น๋ฌธ์„ ๊ฐ™์ด ์ ์œผ๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ๊ธฐ์กด ์ด๋ฏธ์ง€์— ์žˆ๋˜ CMD ๋ช…๋ น์ด ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์„ ์”Œ์›Œ์ง„๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋ฏธ์ง€์— entrypoint ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด, docker run ์œผ๋กœ ๋ช…๋ น์„ ์‹ฑํ–‰ํ•˜๋”๋ผ๋„ entrypoint์˜ ๋ช…๋ น์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ๋ชปํ•˜๊ณ  entrypoint์˜ ๋ช…๋ น ๋’ค์— ์ญ‰ ์ธ์ž๋กœ ๋‚˜์—ด์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

EXPOSE

  • docker ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํฌํŠธ๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๋Š” ์„ค์ •
  • docker run -p ์˜ต์…˜๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ฐจ์ด์ ์€ -p ์˜ต์…˜์€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํฌํŠธ๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๊ณ , ํ•ด๋‹น ํฌํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ pc ์˜ ํŠน์ • ํฌํŠธ์™€ ๋งคํ•‘ ์‹œํ‚ค๋Š” ๊ฒƒ๊นŒ์ง€ ์•Œ์•„์„œ ํ•ด์ฃผ์ง€๋งŒ, expose ๋Š” ๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ ํฌํŠธ๋ฅผ ์—ด์–ด์ฃผ๊ธฐ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ.
  • ๊ฒฐ๊ตญ ๋„์ปค ํŒŒ์ผ์— expose ๋กœ ํฌํŠธ๋ฅผ ์—ด์–ด์ค˜๋„ docker run ์„ ํ• ๋•Œ p ์˜ต์…˜์„ ์“ฐ๊ฒŒ ๋œ๋‹ค.

WORKDIR

  • ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ํŠน์ • ํด๋”๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์“ฐ๋Š” ๋ช…๋ น cd ๊ฐ™์€ ๋Š๋‚Œ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
    WORKDIR /usr/app

๋„์ปค ํ™˜๊ฒฝ๋ณ€์ˆ˜

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

ENV PORT 80
EXPOSE $PORT # EXPORT PORT 80
  • ์ด๋•Œ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜.

๋นŒ๋“œ ์ธ์ˆ˜

์ธ์ˆ˜์˜ ๊ฒฝ์šฐ Dockerfile์„ ํ†ตํ•ด docker build ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ --build-arg ์˜ต์…˜์œผ๋กœ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹. ์ด ๋ฐฉ์‹์€ ์ด๋ฏธ์ง€๋ฅผ build ํ•  ๋•Œ ๋‹ค๋ฅธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.

run time ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅธ ๊ฒƒ : ์ด์ „ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ์‹œ์ผœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ ๊ฒƒ์ด์ง€๋งŒ arg ๋ฐฉ์‹์€ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ํ•  ๋•Œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹.

FROM node:14
ARG DEFAULT_PORT=80 #ARG ์˜ต์…˜ ์ถ”๊ฐ€
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
ENV PORT $DEFAULT_PORT
EXPOSE $PORT

CMD ["npm", "start"]
  • 80๋ฒˆ ํฌํŠธ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์ง€๋งŒ build๋ฅผ ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ์Œ.
    docker build -t node-server:prd --build-arg DEFAULT_PORT 8080 .
  • ๋„์ปคํŒŒ์ผ์˜ ์ˆ˜์ •์ด ํ•„์š”์—†์ด ์œ ์—ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž„.
profile
์•ˆ๋…•ํ•˜์„ธ์š” DevOps ์—”์ง€๋‹ˆ์–ด๋กœ ํ˜„์—…์—์„œ ํ™œ๋™์ค‘์ธ ์š”ํ•œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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