-
3. Dockerfile์ด๋? Spring Boot ์ด๋ฏธ์ง ๋ง๋ค๊ธฐDevOps 2026. 7. 22. 09:55

๐ Docker & Kubernetes ์๋ฆฌ์ฆ
์ด์ ๊ธ์์๋ Docker Image์ Container์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํ๋ค.
์ด๋ฒ์๋ Docker Image๋ฅผ ์ค์ ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
Docker์์๋ Dockerfile์ด๋ผ๋ ํ์ผ์ ์ด์ฉํด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค. Dockerfile์ ์ด๋ฏธ์ง ์์ฑ ๊ณผ์ ์ ์ฝ๋๋ก ์์ฑํ ์ค์ ํ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
Dockerfile์ด๋?
Dockerfile์ Docker Image๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ค์ ํ์ผ์ด๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์์ ์ ์์๋๋ก ์์ฑํ๋ฉฐ, Docker๋ ์ด ํ์ผ์ ์ฝ์ด ํ๋์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
Dockerfile์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์ ์ํ ์ ์๋ค.
- ์ด๋ค ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง
- ํ๋ก์ ํธ ํ์ผ์ ์ด๋์ ๋ณต์ฌํ ๊ฒ์ธ์ง
- ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์ด๋ค ๋ช ๋ น์ ์คํํ ๊ฒ์ธ์ง
์ฆ, Dockerfile์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์๋ํํ ์คํฌ๋ฆฝํธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
Spring Boot ํ๋ก์ ํธ ์ค๋น
์์ ๋ก ์ฌ์ฉํ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
my-app โโโ src โโโ build โ โโโ libs โ โโโ my-app.jar โโโ Dockerfile โโโ build.gradle โโโ ...Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ค ์ฝ๋๋ฅผ ์ง์ ์คํํ๋ ๊ฒ์ด ์๋๋ผ ๋น๋๋ Jar ํ์ผ์ ์คํํ๋ค.
๋ฐ๋ผ์ Docker Image๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋จผ์ Gradle ๋๋ Maven์ ์ด์ฉํด Jar ํ์ผ์ ์์ฑํด์ผ ํ๋ค.
Gradle์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ผ๋ก Jar ํ์ผ์ ์์ฑํ ์ ์๋ค.
./gradlew bootJar๋น๋๊ฐ ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด Jar ํ์ผ์ด ์์ฑ๋๋ค.
build/libs/my-app.jar์ด์ Docker๋ ์ด Jar ํ์ผ์ ์ด์ฉํด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
Dockerfile ์์ฑํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ Dockerfile์ ์์ฑํด ๋ณด์.
FROM eclipse-temurin:21-jre WORKDIR /app COPY build/libs/*.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]์ด์ ๊ฐ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ดํด๋ณด์.
FROM
FROM eclipse-temurin:21-jreFROM์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ ๊ธฐ๋ฐ ์ด๋ฏธ์ง(Base Image) ๋ฅผ ์ง์ ํ๋ ๋ช ๋ น์ด์ด๋ค.
์ฌ๊ธฐ์๋ Java 21 Runtime(JRE)์ด ํฌํจ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ค.
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ๋ง ํ๋ฉด ๋๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก JDK๋ณด๋ค JRE ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ธ๋ค.
WORKDIR
WORKDIR /appWORKDIR์ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์์ ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ค.
์ดํ ์คํ๋๋ ๋ช ๋ น์ ๋ชจ๋ /app ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ํ๋๋ค.
COPY
COPY build/libs/*.jar app.jarCOPY๋ ํธ์คํธ์ ์๋ ํ์ผ์ Docker Image ๋ด๋ถ๋ก ๋ณต์ฌํ๋ ๋ช ๋ น์ด์ด๋ค.
์ ๋ช ๋ น์ ๋น๋ํ Jar ํ์ผ์ ์ปจํ ์ด๋ ๋ด๋ถ์ /app/app.jar๋ก ๋ณต์ฌํ๋ค.
๋ด PC build/libs/my-app.jar โ โผ Docker Image /app/app.jar์ด๋ ๊ฒ ๋ณต์ฌ๋ Jar ํ์ผ์ด ์ด๋ฏธ์ง์ ํฌํจ๋๊ณ , ์ดํ ์์ฑ๋๋ ๋ชจ๋ ์ปจํ ์ด๋๋ ์ด Jar ํ์ผ์ ์คํํ๊ฒ ๋๋ค.
ENTRYPOINT
ENTRYPOINT ["java", "-jar", "app.jar"]ENTRYPOINT๋ ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ๋ช ๋ น์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํํ๋ฉด
docker run my-app์ปจํ ์ด๋ ๋ด๋ถ์์๋ ๋ค์ ๋ช ๋ น์ด ์คํ๋๋ค.
java -jar app.jar์ฆ, Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๊ฒ์ด๋ค.
Docker Image ์์ฑํ๊ธฐ
Dockerfile์ ์์ฑํ๋ค๋ฉด ๋ค์ ๋ช ๋ น์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
docker build -t my-app .๊ฐ ์ต์ ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- -t : ์์ฑํ ์ด๋ฏธ์ง ์ด๋ฆ(Tag) ์ง์
- my-app : ์ด๋ฏธ์ง ์ด๋ฆ
- . : ํ์ฌ ๋๋ ํฐ๋ฆฌ์ Dockerfile ์ฌ์ฉ
๋น๋๊ฐ ์๋ฃ๋๋ฉด ๋ค์ ๋ช ๋ น์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์๋ค.
docker images์์
REPOSITORY TAG IMAGE ID SIZE my-app latest a1b2c3d4 250MB
์ปจํ ์ด๋ ์คํํ๊ธฐ
์์ฑํ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด ์ปจํ ์ด๋๋ฅผ ์คํํด ๋ณด์.
docker run -p 8080:8080 my-app-p ์ต์ ์ ํธ์คํธ์ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ์ฐ๊ฒฐํ๋ค.
์๋ฅผ ๋ค์ด Spring Boot๊ฐ ์ปจํ ์ด๋ ๋ด๋ถ์์ 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ฒฐ๋๋ค.
๋ด PC (8080) โ โผ Container (8080)์ด์ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080์ผ๋ก ์ ์ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ธํ ์ ์๋ค.
Docker์ ๋์ ๊ณผ์
์ง๊ธ๊น์ง์ ๊ณผ์ ์ ํ๋์ ํ๋ฆ์ผ๋ก ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Spring Boot ํ๋ก์ ํธ โ โผ Gradle Build โ โผ JAR ์์ฑ โ โผ Dockerfile โ โผ docker build โ โผ Docker Image ์์ฑ โ โผ docker run โ โผ Container ์คํ์ฌ๊ธฐ์ ์ค์ํ ์ ์ Dockerfile์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋(docker build)๋ง ์ฌ์ฉ๋๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฏธ์ง๊ฐ ์์ฑ๋ ์ดํ์๋ Dockerfile์ ๋ค์ ์ฝ์ง ์์ผ๋ฉฐ, ์ปจํ ์ด๋๋ ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋๋ค.
์์ฃผ ์ฌ์ฉํ๋ Dockerfile ๋ช ๋ น์ด
๋ช ๋ น์ด ์ค๋ช FROM ๊ธฐ๋ฐ ์ด๋ฏธ์ง ์ง์ WORKDIR ์์ ๋๋ ํฐ๋ฆฌ ์ง์ COPY ํ์ผ ๋ณต์ฌ ENTRYPOINT ์ปจํ ์ด๋ ์์ ์ ์คํํ ๋ช ๋ น ์ ๋ฌธ ๋จ๊ณ์์๋ ์ ๋ค ๊ฐ์ง ๋ช ๋ น์ด๋ง ์ดํดํด๋ ๋๋ถ๋ถ์ Dockerfile์ ์ฝ๊ณ ์์ฑํ ์ ์๋ค.
์ ๋ฆฌ
Dockerfile์ Docker Image๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค์ ํ์ผ์ด๋ค.
Spring Boot ํ๋ก์ ํธ์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๋์ํ๋ค.
Spring Boot ํ๋ก์ ํธ โ โผ Gradle Build โ โผ JAR ์์ฑ โ โผ Docker Build โ โผ Docker Image ์์ฑ โ โผ Docker Run โ โผ Container ์คํ์ฆ,
- Spring Boot ํ๋ก์ ํธ๋ฅผ ๋น๋ํ์ฌ Jar ํ์ผ์ ์์ฑํ๋ค.
- Dockerfile์ ์ด์ฉํด Docker Image๋ฅผ ์์ฑํ๋ค.
- ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ฉด Container๊ฐ ๋ง๋ค์ด์ง๋ค.
Docker๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ด์ ํ๊ฒฝ์์ ๋์ผํ ์คํ ํ๊ฒฝ์ ์์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค.
๋ค์ ๊ธ
์ฌ๊ธฐ๊น์ง ๋ณด๋ฉด ํ ๊ฐ์ง ๊ถ๊ธํ ์ ์ด ์๊ธธ ์ ์๋ค.
"์์ค๋ฅผ ์์ ํ๋ฉด ์คํ ์ค์ธ ์ปจํ ์ด๋์๋ ์๋์ผ๋ก ๋ฐ์๋ ๊น?"
์ ๋ต์ ์๋๋ค.
์คํ ์ค์ธ ์ปจํ ์ด๋๋ ์ด๋ฏธ ์์ฑ๋ Docker Image๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์ ๊ธ์์๋ ์์ค๋ฅผ ์์ ํ๋ฉด Docker๋ ์ด๋ป๊ฒ ๋์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ docker build๋ฅผ ๋ค์ ์คํํด์ผ ํ๋์ง ์์๋ณด๊ฒ ๋ค.
'DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ