CI/CD 구축하기(2) - Docker Hub

YulHee Kim·2021년 9월 19일
8

DevOps

목록 보기
2/2
post-thumbnail

💡 Docker 란?

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.

Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있습니다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원합니다.

Docker의 이점

1. 모듈성
Docker의 컨테이너화 접근 방식은 전체 애플리케이션을 분해할 필요 없이 애플리케이션의 일부를 분해하고, 업데이트 또는 복구하는 능력에 집중되어 있습니다.

2. 계층 및 이미지 버전 제어
각 Docker 이미지 파일은 일련의 계층으로 이루어져 있으며 이 계층들은 단일 이미지로 결합됩니다. 이미지가 변경될 때 계층이 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.

Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다. 중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다. 계층화에는 버전 관리가 내재되어 있으며 새로운 변경 사항이 발생할 때마다 내장 변경 로그가 기본적으로 적용되므로 컨테이너 이미지를 완전히 제어할 수 있습니다.

3. 롤백
계층화에서 가장 유용한 부분은 아마도 롤백 기능일 것입니다. 모든 이미지에는 계층이 있으며, 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다. 이 기능은 애자일(agile) 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적인 통합 및 연속 배포(Continuous Integration and Deployment, CI/CD)를 수행하는 데 도움을 줍니다.

4. 신속한 배포
Docker 기반 컨테이너는 배포 시간을 몇 초로 단축할 수 있습니다. 각 프로세스에 대한 컨테이너를 생성함으로써 사용자는 유사한 프로세스를 새 앱과 빠르게 공유할 수 있습니다

Docker Hub에 push 해보기

1. Docker Hub 회원 가입 및 토큰 발행

Docker Hub는 컨테이너 이미지 관리를위한 웹입니다
빌드한 도커 이미지를 Docker Hub에 저장해서 사용할 수 있도록합니다.

Docker Hub에 계정을 만든 뒤
Github Action에서 Docker 이미지를 올리기 위해서 인증 token을 발행합니다.
[참고한 블로그]

2. Github repository secrets 등록

  • github repository의 Settings -> Secrets
  • DOCKERHUB_USERNAME : Docker Hub에 등록된 유저 이름을 등록
  • DOCKERHUB_TOKEN : Docker Hub에서 발행한 token 값을 등록

그 다음 yml 파일을 수정합니다.
Login to DockerHub 스텝 추가

# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    # The USERNAME and TOKEN need to correspond to the credentials environment variables used in
    # the publishing section of your build.gradle
    - name: Build with Gradle
      run: ./gradlew build
      
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}

이제 도커 이미지를 빌드하고 push 하는 스텝을 추가해보겠습니다.
도커 이미지를 빌드하기 위해선 Dockerfile이 프로젝트에 먼저 작성되어 있어야합니다

build/libs 폴더 아래에 생성된 jar 이름을 적어주었습니다

#실행하기 위한 환경만 필요하면 jre, 개발까지면 jdk
FROM openjdk:11-jre

#컨테이너 안에 jar 파일은 app.jar 될꺼임
COPY build/libs/test-0.0.1-SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

이제 yml 파일에 도커 이미지를 빌드하고 도커 허브에 push하는 스텝을 추가해보겠습니다.

- name: build and release to DockerHub
      env:
        NAME: dbfgml741 # 계정 명
        REPO: practice # 레포 이름
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest

빌드 결과를 확인해보면 성공한 것을 볼 수 있습니다~!

도커 허브에도 잘 올라왔습니다

이어서 배포글도 정리해보겠습니당~

profile
백엔드 개발자

1개의 댓글

comment-user-thumbnail
2023년 11월 21일

좋은 글 잘 보고 갑니다 :)

답글 달기