DockerStudy

[[Docker ๐Ÿณ] 4. DockerFile์„ ํ™œ์šฉํ•ด ์ด๋ฏธ์ง€ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

์ด๊ทœํ˜„2026-01-30
[[Docker ๐Ÿณ] 4. DockerFile์„ ํ™œ์šฉํ•ด ์ด๋ฏธ์ง€ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

DockerFile์ด๋ž€?

Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ฒŒ ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด๋‹ค.


FROM

FROM์€ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŠน์ • ์ดˆ๊ธฐ ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ์„ธํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•œ 'ํŠน์ • ์ดˆ๊ธฐ ์ด๋ฏธ์ง€'๊ฐ€ ๊ณง ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€์ด๋‹ค.

์‚ฌ์šฉ๋ฒ•

# ๋ฌธ๋ฒ•
FROM [์ด๋ฏธ์ง€๋ช…]
FROM [์ด๋ฏธ์ง€๋ช…]:[ํƒœ๊ทธ๋ช…]
// ํƒœ๊ทธ๋ช…์„ ์ ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ์ตœ์‹ (latest) ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค.

์‹ค์Šต : FROM์„ ์ด์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

  1. Dockerfile ๋งŒ๋“ค๊ธฐ
FROM NODE
  1. Dockerfile ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด
# docker build -t [์ด๋ฏธ์ง€๋ช…]:[ํƒœ๊ทธ๋ช…] [Dockerfile์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ]
$ docker build -t my-next-app .
  1. ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ
$ docker run -d my-next-app

  1. ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒํ•˜๊ธฐ
$ docker ps # ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋‹ค.
$ docker ps -a # ํ™•์ธํ•ด๋ณด๋‹ˆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์žˆ๋‹ค.

Docker์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ช…๋ น์„ ๋‹ค ์ˆ˜ํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ €์ ˆ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

  1. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€์„œ node๊ฐ€ ์ž˜ ๊น”๋ ธ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ Dockerfile
FROM node

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-next-app . # ์ด๋ฏธ์ง€ ๋นŒ๋“œ
$ docker run -d my-next-app # ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
$ docker ps # ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒ
$ docker exec -it [์ปจํ…Œ์ด๋„ˆ ID] bash # ์ปจํ…Œ์ด๋„ˆ ์ ‘์†

$ node -version # node ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ง€ ํ™•์ธ


COPY

COPY๋ž€??

ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์‚ฌ์šฉ๋ฒ•

# ๋ฌธ๋ฒ•
COPY [ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ๋ณต์‚ฌํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ] [์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ์ด ์œ„์น˜ํ•  ๊ฒฝ๋กœ]

# ์˜ˆ์‹œ
COPY app.txt /app.txt

์‹ค์Šต : ํŒŒ์ผ ๋ณต์‚ฌํ•ด๋ณด๊ธฐ

  1. app.txt ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
  2. Dockerfile ๋งŒ๋“ค์–ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ Dockerfile
FROM ubuntu

COPY app.txt /app.txt

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

์‹ค์Šต : ํด๋” ์•ˆ์— ๋ชจ๋“  ํŒŒ์ผ๋“ค ๋ณต์‚ฌ

  1. my-app ๋””๋ ‰ํ„ฐ๋ฆฌ ๋งŒ๋“ค๊ธฐ, my-app ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

  2. Dockerfile ๋งŒ๋“ค์–ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

FROM ubuntu

COPY my-app /my-app/

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

$ docker build -t my-server2 .
$ docker run -d my-server2
$ docker exec -it [Container ID] bash

$ ls

์‹ค์Šต : ์™€์ผ๋“œ ์นด๋“œ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

  1. app.txt,readme.txt ํŒŒ์ผ 2๊ฐœ ๋งŒ๋“ค๊ธฐ
  2. Dockerfile ๋งŒ๋“ค์–ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
 FROM ubuntu

 COPY *.txt /text-files/

 ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
  • ์ฃผ์˜) /text-files๋ผ๊ณ  ์ ์œผ๋ฉด ์•ˆ ๋˜๊ณ  /text-files/๋ผ๊ณ  ์ ์–ด์•ผ text-files๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ํŒŒ์ผ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋ณต์‚ฌ๋œ๋‹ค.

$ docker build -t my-server3 .
$ docker run -d my-server3
$ docker exec -it [Container ID] bash

$ ls

์‹ค์Šต : .dockerignore ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ํŠน์ • ํŒŒ์ผ ๋˜๋Š” ํด๋”๋งŒ COPY๋ฅผ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ .dockerignore๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

  1. .dockerignore ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ .dockerignore
readme.txt
  1. Dockerfile ๋งŒ๋“ค์–ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
FROM ubuntu

COPY ./ /

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

$ docker build -t my-server4 .
$ docker run -d my-server4
$ docker exec -it [Container ID] bash

$ ls

ENTRYPOINT

ENTRYPOINT๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ตœ์ดˆ๋กœ ์‹คํ–‰ํ•  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋œปํ•œ๋‹ค. ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ENTRYPOINT์—๋Š” ๋ฏธ๋‹ˆ ์ปดํ“จํ„ฐ์˜ ์ „์›์„ ํ‚ค๊ณ ๋‚˜์„œ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ๋ช…๋ น์–ด๋ฅผ ์ ์œผ๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉ๋ฒ•

# ๋ฌธ๋ฒ•
ENTRYPOINT [๋ช…๋ น๋ฌธ...]

# ์˜ˆ์‹œ
ENTRYPOINT ["node", "dist/main.js"]

์‹ค์Šต

Dockerfile

FROM ubuntu

ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
$ docker build -t my-server5 .
$ docker run -d my-server5
$ docker ps -a
$ docker logs [Container ID]


RUN

์ด๋ฏธ์ง€ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ๋ฒ•

# ๋ฌธ๋ฒ•
RUN [๋ช…๋ น๋ฌธ]

# ์˜ˆ์‹œ
RUN npm install

โœ…ย RUN vs ENTRYPOINT

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

์‹ค์Šต

๋ฏธ๋‹ˆ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์ด ubuntu๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๊ณ  git์ด ๊น”๋ ค์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด๋Ÿฐ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Dockerfile์„ ํ™œ์šฉํ•ด ubuntu, git์ด ๊น”๋ ค์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

  1. Dockerfile ์ž‘์„ฑํ•˜๊ธฐ Dockerfile
    FROM ubuntu
    RUN apt update && apt install -y git
    ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
  1. ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
$ docker build -t my-server6 .
$ docker run -d my-server6
$ docker exec -it [Container ID] bash

$ git -v # ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— git์ด ์ž˜ ์„ค์น˜๋๋Š” ์ง€ ํ™•์ธ


WORkDIR

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

์‚ฌ์šฉ๋ฒ•

# ๋ฌธ๋ฒ•
WORKDIR [์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ ˆ๋Œ€ ๊ฒฝ๋กœ]

# ์˜ˆ์‹œ
WORKDIR /usr/src/app

์‹ค์Šต

  1. app.txt, src, config.json ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

  2. Dockerfile ๋งŒ๋“ค์–ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

    WORKDIR์„ ์•ˆ ์ผ์„ ๋•Œ ํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ๋จผ์ € ํ™•์ธ

    Dockerfile

    FROM ubuntu
    
    COPY ./ ./
    
    ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
    

$ docker build -t my-server7 . $ docker run -d my-server7 $ docker exec -it [Container ID] bash

$ ls

 ![](https://velog.velcdn.com/images/leekh010502/post/202374c3-ae1a-412c-915b-d948be74133f/image.png)

---

>WORKDIR์„ ์ผ์„ ๋•Œ ํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š” ์ง€ ํ™•์ธ

Dockerfile
```docker
FROM ubuntu

WORKDIR /my-dir

COPY ./ ./

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server8 .
$ docker run -d my-server8
$ docker exec -it [Container ID] bash

$ ls

์›น ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ (Next.js)๋ฅผ Docker๋กœ ๋ฐฐํฌํ•˜๊ธฐ

  1. Next.js ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ
$ npx create-next-app@latest
  1. Dockerfile ์ž‘์„ฑํ•˜๊ธฐ Dockerfile
FROM node:20-alpine

WORKDIR /app

COPY . .

RUN npm install

RUN npm run build

EXPOSE 3000

ENTRYPOINT [ "npm", "run", "start" ]
  1. .dockerignore ์ž‘์„ฑํ•˜๊ธฐ .dockerignore
node_modules
  • ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ npm install์„ ํ†ตํ•ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๊น”๋”ํ•˜๊ฒŒ ํ•„์š”ํ•œ ์˜์กด์„ฑ๋งŒ ์„ค์น˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์— ์žˆ๋Š” node_modules๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ด๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  1. Dockerfile์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ธฐ
$ docker build -t my-web-server .
  1. ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ์ƒ์„ฑ๋๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
$ docker image ls
  1. ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰์‹œ์ผœ๋ณด๊ธฐ
$ docker run -d -p 80:3000 my-web-server
  1. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
$ docker ps
  1. localhost:80์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด๊ธฐ

๊ทธ๋ฆผ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ

FROM node vs FROM node:20-alpine

node: "์ „๋ถ€ ๋‹ค ๋“ค์–ด์žˆ๋Š” ์ข…ํ•ฉ ์„ ๋ฌผ ์„ธํŠธ" (๋ฌด๊ฒ์ง€๋งŒ ํŽธ๋ฆฌํ•จ)

node:alpine: "๋”ฑ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋“ค์–ด์žˆ๋Š” ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜ ์„ธํŠธ" (๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„)

์ด๋Ÿฌํ•œ ์ฐจ์ด์  ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.