๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Docker

[Docker] ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” Dockerfile: FROM๋ถ€ํ„ฐ EXPOSE๊นŒ์ง€ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ธฐ

by carrot0911 2025. 5. 14.

Dockerfile์ด๋ž€?!

Docker ์ด๋ฏธ์ง€๋“ค์„ ๋ˆ„๊ตฐ๊ฐ€ ๋งŒ๋“ค์–ด์„œ Dockerhub์— ์˜ฌ๋ ค๋†“๊ณ , ๊ทธ๊ฑธ ๋‹ค์šด๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด Docker ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”๊ฑธ๊นŒ?

Dockerfile์ด๋ผ๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•ด์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, Dockerfile์ด๋ž€ Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ฒŒ ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด๋‹ค.

 

FROM : ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ƒ์„ฑ

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

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ ๋„์›Œ์„œ ๋ฏธ๋‹ˆ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ๊ฒŒ ๊น”๋ ค์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋Š”์ง€ ์„ ํƒํ•˜๋Š” ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

# ๋ฌธ๋ฒ•
FROM [์ด๋ฏธ์ง€๋ช…]
FROM [์ด๋ฏธ์ง€๋ช…]:[ํƒœ๊ทธ๋ช…]

๐Ÿ‘‰  ํƒœ๊ทธ๋ช…์„ ์ ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ์ตœ์‹ (latest) ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค.

์‹ค์Šต

1. Dockerfile ๋งŒ๋“ค๊ธฐ

# JDK 17
FROM openjdk:17-jdk

2. Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

$ docker build -t my-jdk17-server .

3. ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ

$ docker run -d my-jdk17-server

4. ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒํ•˜๊ธฐ

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

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

FROM openjdk:17-jdk

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

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

 

์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ์— ๋“ค์–ด๊ฐ€์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

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

๐Ÿ‘‰  docker logs๋ฅผ ํ™œ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ
๐Ÿ‘‰  docker exec -it๋ฅผ ํ™œ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์ง์ ‘ ๋“ค์–ด๊ฐ€ ๋ณด๊ธฐ

์œ„์˜ ๋ฐฉ๋ฒ• ์ค‘ docker exec -it์€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด, ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์„ฑ์ƒ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค ๋๋‚˜๋Š” ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜•์„ฑ๋๋Š”์ง€ ๋””๋ฒ„๊น…์„ ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

FROM openjdk:17-jdk

...

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500์ดˆ ๋™์•ˆ ์‹œ์Šคํ…œ์„ ์ผ์‹œ์ •์ง€ ์‹œํ‚ค๋Š” ๋ช…๋ น์–ด

๐Ÿ‘‰ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฐ”๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๋’ค์— docker exec -it๋ฅผ ํ™œ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์ง์ ‘ ๋“ค์–ด๊ฐ€์„œ ๋””๋ฒ„๊น…์„ ํ•˜๋ฉด ๋œ๋‹ค.

 

COPY : ํŒŒ์ผ ๋ณต์‚ฌ(์ด๋™)

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

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

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

ํŒŒ์ผ ๋ณต์‚ฌํ•ด ๋ณด๊ธฐ

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

2. 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-server .
$ docker run -d my-server
$ 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-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

.dockerignore ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

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

1. .dockerignore ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

readme.txt

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

FROM ubuntu

COPY ./ /

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # ๋””๋ฒ„๊น…์šฉ ์ฝ”๋“œ
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash

$ ls

 

ENTRYPOINT : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด

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

FROM ubuntu

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

 

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

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

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

# ์˜ˆ์‹œ
RUN npm install

RUN vs ENTRYPOINT

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

 

WORKDIR : ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •

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

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

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

 

EXPOSE : ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ํฌํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ธฐ

EXPOSE๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ํฌํŠธ์— ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ง€๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ์—ญํ• ๋งŒ ํ•œ๋‹ค.
์‰ฝ๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด EXPOSE ๋ช…๋ น์–ด๋Š” ์“ฐ๋‚˜ ์•ˆ ์“ฐ๋‚˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

# ๋ฌธ๋ฒ•
EXPOSE [ํฌํŠธ ๋ฒˆํ˜ธ]

# ์˜ˆ์‹œ
EXPOSE 3000