[Docker] Jenkins에서 도커 허브 이용하기

Nicky·2024년 3월 24일
post-thumbnail

현재 프로젝트의 이미지의 저장소로 EC2 인스턴스의 레지스트리 이미지를 사용하고 있다.

React 어플리케이션의 보안성을 높이기 위해(Https 적용) 추가적으로 Nginx 이미지를 이용할 계획인데, 현재 EC2 인스턴스의 용량에 무리가 있어, 이미지 저장소로 Docker Hub를 이용하고자 한다.

Docker Hub

도커 허브는 도커 컨테이너 이미지의 원격 저장소로, 이미지를 저장 및 공유할 수 있는 중앙 리포지토리이다.

다양한 소프트웨어의 공식 이미지를 제공하며, 개인(또는 조직)이 만든 도커 이미지를 저장하고 공유할 수 있다. 또한, 이미지에 대한 접근 권한을 관리할 수 있다.

이미지 push, pull

우선 홈페이지에서 회원가입을 하도록 하자.
(https://hub.docker.com/)

나의 경우 이미 WSL2로 docker desktop을 이용중이다.

docker login
원래는 사용자의 이름과 비밀번호를 입력해야하는데, 이미 docker desktop에 로그인된 상태라면 알아서 자격증명을 해주는 모양이다.

docker tag {기존 이미지 태그} {username/spring:latest}
도커 허브로 이미지를 푸시하기 위해 이미지의 태그명을 바꿔야한다.

docker push {username/spring:latest}

허브에 잘 올라간 모습이다.

EC2 인스턴스에서 확인해보자.

docker pull {username/spring:latest}
docker images

Jenkins

Access 토큰 발급

우선 젠킨스에서 도커 허브에 로그인하기 위해 access 토큰을 받아야 한다.

Docker Hub -> Account Settings / Security

어느 정도의 권한을 줄지 결정할 수 있다.

젠킨스 Credentials 등록

  • Kind: Username with password
  • Username: 도커 허브 사용자 이름
  • Password: access 토큰

파이프라인 스크립트를 작성하기 위해 플러그인을 추가로 설치해주었다.

파이프라인 스크립트 작성

pipeline {
    agent any
    environment {
        RDS_END_POINT = {}
        REDIS_END_POINT = {}
        IMAGE_NAME = {}
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main',
                    credentialsId: 'github_access_token',
                    url: '{}' 
            }
        }
        stage('Build') {
            steps {
                sh 'chmod +x ./gradlew'
                sh 'sudo ./gradlew build'
                script {
                    docker.build("${env.IMAGE_NAME}")
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    docker.withRegistry('', 'docker_hub_access_token') {
                        docker.image("${env.IMAGE_NAME}").push()
                    }
                }
                withCredentials([
                    sshUserPrivateKey(credentialsId: 'ec2_private_key', keyFileVariable: 'EC2_PRIVATE_KEY', usernameVariable: 'EC2_USERNAME')
                ]) {
                    sh """
                        ssh -o StrictHostKeyChecking=no -i "$EC2_PRIVATE_KEY" $EC2_USERNAME@$EC2_PUBLIC_IP '
                        sudo docker stop spring-app
                        sudo docker rm spring-app
                        sudo docker rmi $IMAGE_NAME
                        sudo docker pull $IMAGE_NAME
                        sudo docker run -d --name spring-app -p 8080:8080 $IMAGE_NAME
                        '
                    """
                }
            }
        }
    }
}

배포 성공

성공적으로 배포에 성공했다.

profile
코딩 연구소

0개의 댓글