Dockerfile์ด๋
Dockerfile์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ก ๋น๋ํ๊ธฐ ์ํด ํ์ํ ๋ช ๋ น์ด๋ฅผ ์ ์ํ๋ ํ์ผ์ ๋๋ค.
์คํ๋ง ๋ถํธ์ ์ต์ ํ๋ Dockerfile ์์
# 1. JDK ๊ธฐ๋ฐ ์ด๋ฏธ์ง ์ค์
FROM openjdk:17-jdk-slim
# 2. ์์
๋๋ ํฐ๋ฆฌ ์ค์
WORKDIR /app
# 3. JAR ํ์ผ์ ์ปจํ
์ด๋์ ๋ณต์ฌ
COPY build/libs/myapp-0.0.1-SNAPSHOT.jar app.jar
# 4. ํ๊ฒฝ ๋ณ์ ์ค์
ENV SPRING_PROFILES_ACTIVE=prod
# 5. ์ปจํ
์ด๋์์ ์ฌ์ฉํ๋ ํฌํธ ๋ช
์
EXPOSE 8080
# 6. ์ ํ๋ฆฌ์ผ์ด์
์คํ
ENTRYPOINT ["java", "-jar", "app.jar"]
Dockerfile์ ์ฃผ์ ๊ตฌ์ฑ ์์
Dockerfile์ ํน์ ๋ช ๋ น์ด์ ์ต์ ๋ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋๋ ์ฃผ์ ๋ช ๋ น์ด์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๋ค.
1. FROM
- ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ์ปจํ ์ด๋๋ ํญ์ ํน์ ์ด๋ฏธ์ง์์ ์์๋๋ฏ๋ก FROM์ ํ์๋ก ์์ฑ๋ฉ๋๋ค.
FROM openjdk:17-jdk-slim
2. WORKDIR
- ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ดํ ๋ช ๋ น์ ์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ๋ฉ๋๋ค.
# /app ๋๋ ํฐ๋ฆฌ๋ฅผ ์์
๋๋ ํฐ๋ฆฌ๋ก ์ค์ ํฉ๋๋ค.
WORKDIR /app
3. COPY
- Host ๋ด์ ์๋ ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ปจํ ์ด๋๋ก ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
COPY build/libs/myapp-0.0.1-SNAPSHOT.jar app.jar
4. ADD
- COPY์ ๋น์ทํ์ง๋ง, ์ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก ์์ถ ํ์ผ์ ์๋์ผ๋ก ํ๊ฑฐ๋ URL์์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
# config.zip ํ์ผ์ /app/config/์ ๋ณต์ฌํ๊ณ ์์ถ์ ํ๋๋ค.
# ์ผ๋ฐ์ ์ธ ํ์ผ ๋ณต์ฌ์๋ COPY๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ถ์ฅ๋ฉ๋๋ค.
ADD https://example.com/config.zip /app/config/
5. RUN
- ์ปจํ ์ด๋ ๋น๋ ์ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ ์ํฉ๋๋ค.
- ์ฃผ๋ก ํจํค์ง ์ค์น, ์ค์ ํ์ผ ์์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
# ํจํค์ง ์
๋ฐ์ดํธ ๋ฐ curl ์ค์น๋ฅผ ์คํํฉ๋๋ค.
RUN apt-get update && apt-get install -y curl
6. CMD
- ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํ๋ ๋ช ๋ น์ด๋ฅผ ์ง์ ํฉ๋๋ค.
- Dockerfile์์ ํ ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ช ๋ น์ด๋ ๋ฐฐ์ด ํ์์ผ๋ก ์์ฑํฉ๋๋ค.
# ์ปจํ
์ด๋๊ฐ ์์๋๋ฉด java -jar app.jar ๋ช
๋ น์ ์คํํฉ๋๋ค.
CMD ["java", "-jar", "app.jar"]
7. ENTRYPOINT
- CMD์ ๋น์ทํ์ง๋ง, ๊ณ ์ ๋ ์คํ ํ์ผ์ ์ค์ ํฉ๋๋ค.
- CMD์ ํจ๊ป ์ฌ์ฉํ์ฌ ์คํ ํ์ผ ๋ค์ ๊ธฐ๋ณธ ์ธ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
# ENTRYPOINT๋ ๊ณ ์ ๋ ์คํ ํ์ผ(java -jar)์ ์ค์ ํ๊ณ , CMD๋ ์ถ๊ฐ ์ธ์(app.jar)๋ฅผ ์ ๋ฌํฉ๋๋ค.
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]
8. ENV
- ์ปจํ ์ด๋์์ ์ฌ์ฉ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ฌ๋ฌ ํ๊ฒฝ ๋ณ์ ์ค์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
# ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ์ prod๋ก ์ค์ ํฉ๋๋ค.
ENV SPRING_PROFILES_ACTIVE=prod
9. EXPOSE
- ์ปจํ ์ด๋์์ ์ฌ์ฉํ ํฌํธ๋ฅผ ๋ช ์ํฉ๋๋ค.
- ์ค์ ๋ก ํฌํธ๋ฅผ ์ด์ง๋ ์์ผ๋ฉฐ, ์ ๋ณด ์ ๊ณต ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
# ์ปจํ
์ด๋๊ฐ 8080๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํจ์ ๋ํ๋
๋๋ค.
# ์ฃผ์: ์ค์ ํฌํธ ๋ฐ์ธ๋ฉ์ docker run -p ์ต์
์ผ๋ก ์ํ๋ฉ๋๋ค.
EXPOSE 8080
10. VOLUME
- ์ปจํ ์ด๋์ ํธ์คํธ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ฅผ ์ํ ๋ณผ๋ฅจ์ ์ ์ํฉ๋๋ค.
- ๋ก๊ทธ ๋ฐ์ดํฐ๋ ์๊ตฌ ๋ฐ์ดํฐ ์ ์ฅ ์ ์ ์ฉํฉ๋๋ค.
# /data ๋๋ ํฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ํธ์คํธ ๋๋ ํฐ๋ฆฌ์ ๊ณต์ ํฉ๋๋ค.
VOLUME ["/data"]
11. ARG
- Docker ๋น๋ ์ ์ฌ์ฉํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค.
# ๋น๋ ์ ํน์ ๋ณ์๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
ARG VERSION=1.0
RUN echo "Version: $VERSION"
12. LABEL
- ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ฏธ์ง ์์ฑ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋ ํน์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ ๋ ์ ์ฉํฉ๋๋ค.
LABEL maintainer="your_email@example.com"
13. HEALTHCHECK
- ์ปจํ ์ด๋์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํ ํฌ์ค์ฒดํฌ ๋ช ๋ น์ด๋ฅผ ์ค์ ํฉ๋๋ค.
# ์ปจํ
์ด๋ ๋ด์์ ์คํ๋ง ๋ถํธ์ /actuator/health ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ์ํ๋ฅผ ์ ๊ฒํฉ๋๋ค.
HEALTHCHECK --interval=30s --timeout=10s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
๋น๋ ๋ฐ ์คํ ๋ช ๋ น์ด
1. ์ด๋ฏธ์ง ๋น๋
docker build -t my-spring-app . # .์ ํ์ฌ ํด๋
2. ์ปจํ ์ด๋ ์คํ
docker run -p <ํธ์คํธ ํฌํธ>:<์ปจํ
์ด๋ ํฌํธ> my-spring-app
1. ํธ์คํธ ํฌํธ
- ํธ์คํธ ๋จธ์ ์ ํฌํธ ๋ฒํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ํธ์คํธ์์ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํฌํธ์ ๋๋ค.
2. ์ปจํ ์ด๋ ํฌํธ
- ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋ ํฌํธ ๋ฒํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- Docker ์ปจํ ์ด๋ ๋ด๋ถ์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ธ๋ฉ๋ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด server.port=8080 ์ค์ ์ผ๋ก ์คํ ์ค์ด๋ผ๋ฉด, ์ปจํ ์ด๋ ๋ด๋ถ์ 8080๋ฒ ํฌํธ๊ฐ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค.