ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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-jre
     

    FROM์€ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€(Base Image) ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

    ์—ฌ๊ธฐ์„œ๋Š” Java 21 Runtime(JRE)์ด ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹คํ–‰๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ JDK๋ณด๋‹ค JRE ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค.

     

     


    WORKDIR

    WORKDIR /app
     

    WORKDIR์€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ž‘์—…ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

    ์ดํ›„ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์€ ๋ชจ๋‘ /app ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

     

     


    COPY

    COPY build/libs/*.jar app.jar
     

    COPY๋Š” ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ํŒŒ์ผ์„ 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๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

    ๋Œ“๊ธ€

Designed by Tistory.