ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5. Docker Registry๋ž€? Docker Hub์™€ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ ์ดํ•ดํ•˜๊ธฐ
    DevOps 2026. 7. 23. 10:10

     

    ๐Ÿ“š Docker & Kubernetes ์‹œ๋ฆฌ์ฆˆ

    ์ด์ „ ๊ธ€์—์„œ๋Š” Spring Boot ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Docker Container์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •์„ ์•Œ์•„๋ดค๋‹ค.

    ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด Docker Image๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ Docker Image๋Š” ์–ด๋””์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ• ๊นŒ?

    ๊ฐœ๋ฐœ์ž ๊ฐœ์ธ์˜ PC์—์„œ๋Š” ๋กœ์ปฌ์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ·์Šคํ…Œ์ด์ง€·์šด์˜ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๋ ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Docker Registry์ด๋‹ค.

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Docker Registry์˜ ๊ฐœ๋…๊ณผ Docker Hub๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‚ด๋ ค๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

     

     


    Docker Image๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ์— ์ €์žฅ๋œ๋‹ค

    ๋จผ์ € Docker Image๋ฅผ ์ƒ์„ฑํ•ด ๋ณด์ž.

    docker build -t my-spring-app .
     

     

    ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ˜„์žฌ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    docker images
     

     

    ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

    REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
    my-spring-app   latest    9f18c12ab123   10 seconds ago   280MB
     

     

    ์ด ์ƒํƒœ์—์„œ my-spring-app ์ด๋ฏธ์ง€๋Š” ํ˜„์žฌ Docker๋ฅผ ์‹คํ–‰ํ•œ PC์—๋งŒ ์กด์žฌํ•œ๋‹ค.

    ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ PC๋‚˜ ์šด์˜ ์„œ๋ฒ„์—์„œ๋Š” ์ด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ณต์šฉ ๋˜๋Š” ์‚ฌ์„ค ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค.

     

     


    Docker Registry๋ž€?

    Docker Registry๋Š” Docker Image๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

    ์†Œ์Šค ์ฝ”๋“œ๋ฅผ GitHub๋‚˜ GitLab๊ณผ ๊ฐ™์€ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Docker Image๋Š” Docker Registry์— ์ €์žฅํ•œ๋‹ค.

    ์—ญํ• ์„ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Git Repository
    → ์†Œ์Šค ์ฝ”๋“œ ์ €์žฅ ๋ฐ ๊ณต์œ 
    
    Docker Registry
    → Docker Image ์ €์žฅ ๋ฐ ๊ณต์œ 
     

     

    Docker Registry๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„๋‚˜ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‚ด๋ ค๋ฐ›์•„ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ „์ฒด ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Spring Boot ์†Œ์Šค
            โ”‚
            โ–ผ
    Gradle Build
            โ”‚
            โ–ผ
    JAR ์ƒ์„ฑ
            โ”‚
            โ–ผ
    Docker Build
            โ”‚
            โ–ผ
    Docker Image ์ƒ์„ฑ
            โ”‚
            โ–ผ
    Docker Registry์— Push
            โ”‚
            โ–ผ
    ๋ฐฐํฌ ์„œ๋ฒ„์—์„œ Pull
            โ”‚
            โ–ผ
    Container ์‹คํ–‰

     

     


    Repository์™€ Registry์˜ ์ฐจ์ด

    Docker๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด Registry์™€ Repository๋ฅผ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฝ๋‹ค.

    Registry๋Š” ์—ฌ๋Ÿฌ Docker Image๋ฅผ ์ €์žฅํ•˜๋Š” ์ „์ฒด ์„œ๋น„์Šค์ด๊ณ , Repository๋Š” Registry ์•ˆ์—์„œ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

     

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

    username/my-spring-app:1.0.0
     

     

    ๊ฐ ๋ถ€๋ถ„์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    username
    → Registry ๋‚ด ์‚ฌ์šฉ์ž ๋˜๋Š” ์กฐ์ง ์ด๋ฆ„
    
    my-spring-app
    → Repository ์ด๋ฆ„
    
    1.0.0
    → Image Tag
     

     

    ํ•˜๋‚˜์˜ Repository์—๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    username/my-spring-app:1.0.0
    username/my-spring-app:1.1.0
    username/my-spring-app:latest
     

    ์ฆ‰, ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋„ Tag๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    Image Tag๋ž€?

    Docker Image์˜ Tag๋Š” ์ด๋ฏธ์ง€์˜ ๋ฒ„์ „์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

    ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๋’ค์— :์„ ๋ถ™์—ฌ ์ง€์ •ํ•œ๋‹ค.

    my-spring-app:1.0.0
    my-spring-app:1.1.0
    my-spring-app:dev
    my-spring-app:stg
    my-spring-app:latest
     

     

    Tag๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ latest๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

    docker build -t my-spring-app .
     

    ์œ„ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.

    my-spring-app:latest
     

     

    ํ•˜์ง€๋งŒ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” latest๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐํฌ ๋ฒ„์ „์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” Tag๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    my-spring-app:1.0.0
    my-spring-app:20260723
    my-spring-app:build-152
    my-spring-app:a1b2c3d
     

    Git Commit Hash๋‚˜ Jenkins Build Number๋ฅผ Tag๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€์ธ์ง€ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๋‹ค.

     

     


    Docker Hub๋ž€?

    Docker Hub๋Š” Docker์—์„œ ์ œ๊ณตํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ณต๊ฐœ Registry ์„œ๋น„์Šค์ด๋‹ค.

     

    Docker Hub์—๋Š” ์ง์ ‘ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    Dockerfile์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์ด๋ฏธ์ง€๋„ Registry์—์„œ ๋‚ด๋ ค๋ฐ›๋Š” ์ด๋ฏธ์ง€์ด๋‹ค.

    FROM eclipse-temurin:21-jre
     

    ๋ณ„๋„์˜ Registry ์ฃผ์†Œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด Docker๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Docker Hub์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๋Š”๋‹ค.

    ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ๋Š” Docker Hub์— ์ €์žฅ๋œ eclipse-temurin:21-jre ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

     

     


    Docker Hub์—์„œ Image๋ฅผ ๋‚ด๋ ค๋ฐ›๋Š” ๋ฐฉ๋ฒ•

    Docker Registry์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์„ ๋•Œ๋Š” docker pull ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    docker pull eclipse-temurin:21-jre
     

     

    Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๋Š”๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    docker pull username/my-spring-app:1.0.0
     

     

    ๋‚ด๋ ค๋ฐ›์€ ์ด๋ฏธ์ง€๋Š” ๋กœ์ปฌ์— ์ €์žฅ๋œ๋‹ค.

    docker images
     

     

    ์ดํ›„ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Container๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

    docker run -d \
      --name my-spring-app \
      -p 8080:8080 \
      username/my-spring-app:1.0.0

     

     


    Docker Hub์— Image๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•

    ์ด๋ฒˆ์—๋Š” ์ง์ ‘ ๋งŒ๋“  Spring Boot ์ด๋ฏธ์ง€๋ฅผ Docker Hub์— ์—…๋กœ๋“œํ•ด ๋ณด์ž.

     

    ๋จผ์ € Docker Hub ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•œ๋‹ค.

    docker login
     

     

    ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ๋กœ์ปฌ ์ด๋ฏธ์ง€์— Docker Hub Repository ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

    ํ˜„์žฌ ๋กœ์ปฌ ์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.

    my-spring-app:latest
     

     

    Docker Hub์— ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ํฌํ•จํ•œ ํ˜•ํƒœ๋กœ Tag๋ฅผ ๋‹ค์‹œ ์ง€์ •ํ•œ๋‹ค.

    docker tag my-spring-app:latest username/my-spring-app:1.0.0
     

     

    ์ด ๋ช…๋ น์–ด๋Š” ๊ธฐ์กด ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ์ด๋ฏธ์ง€์— ์ƒˆ๋กœ์šด ์ด๋ฆ„๊ณผ Tag๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    ํ™•์ธํ•ด ๋ณด๋ฉด ๋™์ผํ•œ Image ID๋ฅผ ๊ฐ€์ง„ ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

    docker images
    REPOSITORY                     TAG       IMAGE ID
    my-spring-app                  latest    9f18c12ab123
    username/my-spring-app         1.0.0     9f18c12ab123
     

     

    ์ด์ œ docker push ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•œ๋‹ค.

    docker push username/my-spring-app:1.0.0
     

     

    ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค๋ฅธ PC๋‚˜ ์„œ๋ฒ„์—์„œ๋„ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    docker pull username/my-spring-app:1.0.0

     

     


    Docker Push์™€ Pull

    Docker Registry์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์€ push์™€ pull์ด๋‹ค.

    docker push
    → ๋กœ์ปฌ Image๋ฅผ Registry์— ์—…๋กœ๋“œ
    
    docker pull
    → Registry์˜ Image๋ฅผ ๋กœ์ปฌ๋กœ ๋‹ค์šด๋กœ๋“œ
     

     

    ํ๋ฆ„์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    ๊ฐœ๋ฐœ์ž PC
            โ”‚
            โ”‚ docker push
            โ–ผ
    Docker Registry
            โ”‚
            โ”‚ docker pull
            โ–ผ
    ๊ฐœ๋ฐœ·์Šคํ…Œ์ด์ง€·์šด์˜ ์„œ๋ฒ„
     

    ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ Docker Image๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    Public Registry์™€ Private Registry

    Docker Registry๋Š” ๊ณต๊ฐœ ๋ฒ”์œ„์— ๋”ฐ๋ผ Public Registry์™€ Private Registry๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

     

    Public Registry

    ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐœ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์ด๋‹ค.

    ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ Docker Hub์˜ Public Repository๊ฐ€ ์žˆ๋‹ค.

    Java, Ubuntu, Nginx, MySQL ๋“ฑ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ๊ณต๊ฐœ Registry์—์„œ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    docker pull nginx
    docker pull mysql
    docker pull eclipse-temurin:21-jre
     

    Private Registry

    ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์„ค ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์ด๋‹ค.

    ๊ธฐ์—…์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋‚ด๋ถ€ ์†Œ์Šค์™€ ์„ค์ • ๊ตฌ์กฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ Private Registry๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ๋Œ€ํ‘œ์ ์ธ Registry ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Docker Hub Private Repository
    Harbor
    AWS ECR
    Google Artifact Registry
    Azure Container Registry
    GitLab Container Registry
     

    ํšŒ์‚ฌ ๋‚ด๋ถ€์—์„œ Harbor๋ฅผ ๊ตฌ์ถ•ํ•ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ AWS ECR๊ณผ ๊ฐ™์€ ๊ด€๋ฆฌํ˜• Registry๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    Harbor๋ž€?

    Harbor๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ Private Container Registry์ด๋‹ค.

    ๊ธฐ์—… ๋‚ด๋ถ€์—์„œ Docker Image๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

    ๋‹จ์ˆœํžˆ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

    ์‚ฌ์šฉ์ž ๋ฐ ํ”„๋กœ์ ํŠธ ๊ถŒํ•œ ๊ด€๋ฆฌ
    Private Repository ๊ด€๋ฆฌ
    Image ์ทจ์•ฝ์  ๊ฒ€์‚ฌ
    Image ๋ณต์ œ
    ์ ‘๊ทผ ์ด๋ ฅ ๊ด€๋ฆฌ
    Image ๋ณด์กด ์ •์ฑ… ๊ด€๋ฆฌ
     

    Docker Hub๊ฐ€ ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋˜๋Š” Registry ์„œ๋น„์Šค๋ผ๋ฉด, Harbor๋Š” ํšŒ์‚ฌ ๋‚ด๋ถ€ ํ™˜๊ฒฝ์— ์ง์ ‘ ๊ตฌ์ถ•ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Registry๋ผ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    AWS ECR์ด๋ž€?

    AWS ECR์€ Amazon Web Services์—์„œ ์ œ๊ณตํ•˜๋Š” Container Registry์ด๋‹ค.

    ECR์€ Elastic Container Registry์˜ ์•ฝ์ž์ด๋‹ค.

    AWS ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ํ•œ๋‹ค๋ฉด Docker Image๋ฅผ ECR์— ์ €์žฅํ•˜๊ณ , Amazon EKS๋‚˜ ECS์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์ „์ฒด ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Jenkins
            โ”‚
            โ–ผ
    Docker Image Build
            โ”‚
            โ–ผ
    AWS ECR Push
            โ”‚
            โ–ผ
    Amazon EKS ๋˜๋Š” ECS
            โ”‚
            โ–ผ
    Container ์‹คํ–‰
     

    ์ง์ ‘ Registry ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

     

     


    ์‹ค๋ฌด์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

    ์‹ค๋ฌด์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  Registry์— ์—…๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์„ CI ๋„๊ตฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด Jenkins๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ฐœ๋ฐœ์ž๊ฐ€ Git Push
            โ”‚
            โ–ผ
    Jenkins Pipeline ์‹คํ–‰
            โ”‚
            โ–ผ
    Gradle Build
            โ”‚
            โ–ผ
    JAR ์ƒ์„ฑ
            โ”‚
            โ–ผ
    Docker Image Build
            โ”‚
            โ–ผ
    Image Tag ์ง€์ •
            โ”‚
            โ–ผ
    Private Registry์— Push
     

     

    Jenkins๋Š” ๋นŒ๋“œ ๋ฒˆํ˜ธ๋‚˜ Git Commit Hash๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€ Tag๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    my-spring-app:build-152
    my-spring-app:a1b2c3d
     

     

    Registry์— ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋˜๋ฉด Kubernetes๊ฐ€ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด Pod๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

    Private Registry
            โ”‚
            โ”‚ Image Pull
            โ–ผ
    Kubernetes
            โ”‚
            โ–ผ
    ์ƒˆ๋กœ์šด Pod ์ƒ์„ฑ
            โ”‚
            โ–ผ
    Health Check
            โ”‚
            โ–ผ
    ์ •์ƒ Pod๋ฅผ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ
     

    Argo CD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” Kubernetes ๋ฐฐํฌ ์„ค์ •์ด ์ €์žฅ๋œ Git Repository์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐํฌ ์„ค์ •์˜ Image Tag๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.

    containers:
      - name: my-spring-app
        image: registry.example.com/my-spring-app:build-152
     

    Argo CD๊ฐ€ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Kubernetes์— ๋ฐ˜์˜ํ•˜๋ฉด Kubernetes๋Š” Registry์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด Pod๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    ์ƒˆ๋กœ์šด Pod์˜ Health Check๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด ์ƒˆ Pod๋กœ ์—ฐ๊ฒฐ๋˜๊ณ , ๊ธฐ์กด Pod๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

     

     


    Registry๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

    Docker Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ์ˆœํžˆ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ์€ ์•„๋‹ˆ๋‹ค.

     

    ๋™์ผํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ ์œ ์ง€

    ๊ฐœ๋ฐœ, ์Šคํ…Œ์ด์ง€, ์šด์˜ ํ™˜๊ฒฝ์ด ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

    ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
    → my-spring-app:1.0.0
    
    ์Šคํ…Œ์ด์ง€ ํ™˜๊ฒฝ
    → my-spring-app:1.0.0
    
    ์šด์˜ ํ™˜๊ฒฝ
    → my-spring-app:1.0.0
     

    ํ™˜๊ฒฝ๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•œ ๋ฒˆ ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

     

    ๋ฒ„์ „ ๊ด€๋ฆฌ

    Tag๋ฅผ ์ด์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    my-spring-app:1.0.0
    my-spring-app:1.1.0
    my-spring-app:1.2.0
     

    ๋ฐฐํฌ ์ด๋ ฅ ์ถ”์ 

    ์–ด๋–ค ์ด๋ฏธ์ง€๊ฐ€ ์–ธ์ œ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    Git Commit Hash๋‚˜ Jenkins Build Number๋ฅผ Tag์— ํฌํ•จํ•˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ์™€ Docker Image๋ฅผ ์—ฐ๊ฒฐํ•ด ์ถ”์ ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

     

    ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณต๊ตฌ

    ์‹ ๊ทœ ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด ์ด๋ฏธ์ง€๋กœ ๋‹ค์‹œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ˜„์žฌ ๋ฐฐํฌ ๋ฒ„์ „
    → my-spring-app:1.2.0
    
    ๋ฌธ์ œ ๋ฐœ์ƒ ํ›„ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณต๊ตฌ
    → my-spring-app:1.1.0
     

    ๋‹ค๋งŒ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์˜ ๋ณต๊ตฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ํ˜ธํ™˜์„ฑ๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

     

     


    latest Tag ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

    latest๋Š” ๊ฐ€์žฅ ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ์˜๋ฏธํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.

    Tag๋ฅผ ์ƒ๋žตํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ์ด๋ฆ„์— ๊ฐ€๊น๋‹ค.

     
    docker build -t my-spring-app .
     

    ์œ„ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•˜๋‹ค.

    docker build -t my-spring-app:latest .
     

    latest Tag์— ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๊ณ„์† ๋ฎ์–ด์“ฐ๋ฉด ํ˜„์žฌ ๋ฐฐํฌ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ค ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

    ๋˜ํ•œ ๊ฐ™์€ Tag๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์‹คํ–‰ ํ™˜๊ฒฝ์— ์ด์ „ ์ด๋ฏธ์ง€๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด ์˜ˆ์ƒํ•œ ์ด๋ฏธ์ง€์™€ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋”ฐ๋ผ์„œ ์‹ค๋ฌด์—์„œ๋Š” ๊ณ ์œ ํ•œ Tag๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    my-spring-app:1.0.0
    my-spring-app:build-152
    my-spring-app:20260723-1530
    my-spring-app:a1b2c3d
     

    ์šด์˜ ๋ฐฐํฌ์—์„œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ณ ์œ  Tag๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ„๋„๋กœ latest, dev, stg์™€ ๊ฐ™์€ ๋ณ„์นญ Tag๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     


    ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Docker Registry ๋ช…๋ น์–ด

    Docker Hub ๋กœ๊ทธ์ธ

    docker login

     

    Image์— ์ƒˆ๋กœ์šด Tag ์ง€์ •

    docker tag my-spring-app:latest username/my-spring-app:1.0.0
     

    Registry์— Image ์—…๋กœ๋“œ

    docker push username/my-spring-app:1.0.0
     

    Registry์—์„œ Image ๋‹ค์šด๋กœ๋“œ

    docker pull username/my-spring-app:1.0.0
     

    ๋กœ์ปฌ Image ํ™•์ธ

    docker images
     

    ๋กœ์ปฌ Image ์‚ญ์ œ

    docker rmi username/my-spring-app:1.0.0

     

     


    ์ „์ฒด ํ๋ฆ„ ์ •๋ฆฌ

    Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Docker Registry๋ฅผ ๊ฑฐ์ณ ๋ฐฐํฌ๋˜๋Š” ์ „์ฒด ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Spring Boot ์†Œ์Šค ์ˆ˜์ •
            โ”‚
            โ–ผ
    Gradle Build
            โ”‚
            โ–ผ
    JAR ์ƒ์„ฑ
            โ”‚
            โ–ผ
    Docker Image Build
            โ”‚
            โ–ผ
    Image Tag ์ง€์ •
            โ”‚
            โ–ผ
    Docker Registry์— Push
            โ”‚
            โ–ผ
    ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ Image Pull
            โ”‚
            โ–ผ
    ์ƒˆ๋กœ์šด Container ๋˜๋Š” Pod ์‹คํ–‰
            โ”‚
            โ–ผ
    Health Check
            โ”‚
            โ–ผ
    ์„œ๋น„์Šค ๋ฐ˜์˜
     

    Docker Registry๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  Docker Image๋ฅผ ์ €์žฅํ•˜๊ณ , ์—ฌ๋Ÿฌ ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

     

     


    ์ •๋ฆฌ

    Docker Image๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋กœ์ปฌ ํ™˜๊ฒฝ์—๋งŒ ์ €์žฅ๋œ๋‹ค.

    ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Docker Registry์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค.

     

    Docker Registry์™€ ๊ด€๋ จ๋œ ํ•ต์‹ฌ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Registry
    → Docker Image๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ์ „์ฒด ์„œ๋น„์Šค
    
    Repository
    → ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„
    
    Tag
    → Image์˜ ๋ฒ„์ „ ๋˜๋Š” ๋นŒ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฐ’
    
    Push
    → ๋กœ์ปฌ Image๋ฅผ Registry์— ์—…๋กœ๋“œ
    
    Pull
    → Registry์˜ Image๋ฅผ ๋กœ์ปฌ๋กœ ๋‹ค์šด๋กœ๋“œ
     

    Docker Hub๋Š” ๋Œ€ํ‘œ์ ์ธ Public Registry์ด๋ฉฐ, ๊ธฐ์—… ํ™˜๊ฒฝ์—์„œ๋Š” Harbor, AWS ECR, GitLab Container Registry ๋“ฑ์˜ Private Registry๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์‹ค๋ฌด์—์„œ๋Š” Jenkins๊ฐ€ Docker Image๋ฅผ ๋นŒ๋“œํ•ด Registry์— ์—…๋กœ๋“œํ•˜๊ณ , Kubernetes๊ฐ€ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด Pod๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

    ๊ฒฐ๊ตญ Docker Registry๋Š” Docker Image๋ฅผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์Šคํ…Œ์ด์ง€์™€ ์šด์˜ ํ™˜๊ฒฝ๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ์ค‘๊ฐ„ ์ €์žฅ์†Œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    ๋‹ค์Œ ๊ธ€

    ์ง€๊ธˆ๊นŒ์ง€ Docker Image๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Registry์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ์•Œ์•„๋ดค๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์†Œ์Šค๋ฅผ Git์— Pushํ•œ ์ดํ›„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ์™€ Docker Image ์—…๋กœ๋“œ๋Š” ๋ˆ„๊ฐ€ ์ˆ˜ํ–‰ํ• ๊นŒ?

     

    “Jenkins์™€ Argo CD๋Š” ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ?”

     

     

    ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Jenkins์™€ Argo CD๋กœ ์ดํ•ดํ•˜๋Š” CI/CD๋ฅผ ์ฃผ์ œ๋กœ, ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ Docker Image๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  Kubernetes์— ๋ฐฐํฌ๋˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

     

    ๋Œ“๊ธ€

Designed by Tistory.