docker build, push (jenkins pipeline)

LeeKyoungChang·2023년 1월 23일
2
post-thumbnail

docker, jenkins 실행 목록

 

📚 1. docker commit와 docker build

둘 다 image를 만드는 명령어이다.

📖 A. docker commit

commit : 사용하고 있는 container를 image를 만드는 (backup과 같은 느낌)

생활 코딩 강의 참고

스크린샷 2023-01-23 오후 4 41 26
  • docker run 시킬 때 마다 container가 새로 생성된다.
  • container들은 서로 독립적이다.
  • container에서 한 작업들은 해당 container에서만 저장된다.
  • 수정한 container에서 commit 명령어를 내리면 새로운 image가 만들어진다. (또 이 image를 docker run 하면 새로운 container가 만들어진다.)
  • 해당 container를 docker hub에 올리면 누구나 사용가능하다.

 

 

📖 B. docker build

build : dockerfile을 통해서(개발자가 원하는 속성을 추가한 후) 해당 image를 만들 수 있다. 예를들면, 개발자가 원하는 시간의 순서에 따라 image를 만들 수 있다. (생성)

스크린샷 2023-01-23 오후 5 21 37

 

✔️ 현재 나의 docker image는?

  • docker-compose.yml을 통해 만들었다.
  • 이후 이 image를 통해 container에 접속하여 settings했다.
  • 이제 container에서 변경한 작업을 저장해야 한다. (jar 파일)

 

 

📚 2. docker build 실행

Dockerfile을 작성했다면, docker build 명령어로 이미지를 생성할 수 있다.

 

✔️ docker build -t, -f

docker build -t <이미지 명> <Dockerfile 위치 경로> : 이미지 생성
docker build -f /home/ubuntu/docker_test/Dockerfile-Server : 파일 이름이름 Dockerfile이 아닌 경우 f를 사용해 파일이름 지정

 

✔️ docker container에서 docker build 실행

스크린샷 2023-01-23 오후 5 17 02

나 같은 경우 Dockerfile 위치 : /var/jenkins_home/workspace/d208jenkins/study_docker/chuno/

 

✔️ Jenkins pipeline에서 실행 결과

Screenshot 2023-01-23 at 6 20 32 PM Screenshot 2023-01-23 at 6 21 45 PM

첫 실행할 때 23초, 이후 똑같은 내용일 경우 4초, 실행 완료된다.

 

✔️ 현재까지의 pipeline

pipeline {
    agent any

    stages {
        stage('git clone') {
            steps {
                dir('study_docker') {
                    checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
                }
            }
        }
        
        stage('build') {
            steps {
                dir('study_docker/chuno') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean bootJar"
                }
            }
        }
        
        stage('docker-build'){
            steps {
                script {
                    sh "docker build -t backendimage study_docker/chuno/"
                }
            }
        }
        
        
    }
}

 

docker push 할 때 참고 주소

https://kanoos-stu.tistory.com/53

 

 

📚 3. docker push

💡 참고
생활 코딩 수업을 참고했습니다.

 

Screenshot 2023-01-23 at 6 37 05 PM

 

📝 이게 무엇이냐면?
docker hub로 이미지를 공유하는 것이다.

 

✔️ docker hub에서 repository 만들기

Screenshot 2023-01-23 at 6 39 40 PM Screenshot 2023-01-23 at 6 40 38 PM
  • public : 누구나 사용할 수 있다.
  • private : 협업하는 사람들만 사용할 수 있다.

 

Screenshot 2023-01-23 at 6 42 11 PM
  • image이름 : lkc263/d208backend
  • docker build -t (image이름) (경로) : 이때, image는 docker hub repository image이름에 맞게 만들어야 한다.

 

✔️ 현재 pipeline

pipeline {
    agent any

    stages {
        stage('git clone') {
            steps {
                dir('study_docker') {
                    checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
                }
            }
        }
        
        stage('build') {
            steps {
                dir('study_docker/chuno') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean bootJar"
                }
            }
        }
    
        stage('docker-build'){
            steps {
                script {
                    sh "docker build -t lkc263/d208backend:1.0 study_docker/chuno/"
                }
            }
        }
        
        
    }
}
스크린샷 2023-01-24 오전 12 40 25

 

✔️ docker push 적용

$ docker login : docker login을 한다.
$ docker push lkc263/d208backend:1.0 : docker hub lkc263/d208backend:1.0 repository에 저장한다.
$ docker pull lkc263/d208backend:1.0 : docker hub에서 repository을 가져온다.

 

✔️ 현재 문제점

  • 이렇게 하면 실행 되지만, 매번 docker hub 로그인을 해야하는 단점이 있다.
  • dockerhub에 연결하기 위해 아이디, 패스워드가 pipeline에 쉽게 노출된다.

=> 그래서 Credentials (인증정보)에 docker hub 계정을 등록하면 된다. (등록할 시, pipeline에 생성한 인증 정보 id만 주면 docker hub 사용하기 위해 인증할 필요가 없다.)

 

🔔 Dockerfile 변경 - backend

dockerfile이 jar이 아닌 jenkins 기반으로 작성된 것 같아 수정했다.

스크린샷 2023-01-24 오후 3 55 52
# open jdk java11 버전 환경
FROM openjdk:11-jdk

# JAR_FILE 변수 정의
ARG JAR_FILE=./build/libs/chuno-0.0.1-SNAPSHOT.jar

# JAR 파일 메인 디렉터리에 복사
COPY ${JAR_FILE} app.jar

# 시스템 진입점 정의
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • Dockerfile은 docker build를 통해 image를 만들 때 사용된다.

 

 

📖 A. docker hub 계정 등록하기

Dashboard -> Jenkins 관리 -> Credentials

스크린샷 2023-01-24 오후 12 38 51

 

스크린샷 2023-01-24 오후 4 01 10

 

스크린샷 2023-01-24 오후 4 01 34 - `kind` : Username with password - `Username` : docker hub 계정 Id (공식사이트 아이디) - `Password` : docker hub 계정 password (공식사이트 비밀번호) - `ID` : 파이프라인 작성 시 사용할 이름 (DockerHub_IdPwd) - `Description` : 설명 (DockerHubIdPwd)

 

스크린샷 2023-01-24 오후 4 05 29
  • 현재 github 계정, github token, Docker hub 계정이 등록되었다.

 

 

📖 B. docker build, push 성공!!!

✔️ environment

Jenkins 공식 사이트 environment 설명

    environment {
        imagename = "lkc263/d208backend"
        registryCredential = 'DockerHub_IdPwd'
        dockerImage = ''
    }
  • 환경 변수를 사용할 때는 environment 을 사용하면 유용하다.
  • 전역변수와 유사한 개념이다.
  • imagename : 현재 docker hub의 사용자id/repository이름
스크린샷 2023-01-24 오후 4 31 29
  • registryCredential : 조금 전 credentials에서 만들었던 id (docker hub 계정 추가했었다.)

 

✔️ docker build

         stage('docker-build'){
            steps {
                echo 'Build Docker'
                dir('study_docker/chuno'){
                    script {
                        sh "pwd"
                        dockerImage = docker.build imagename
                        
                    }
                }
            }
        }
  • git repository 이름 : study_docker
  • chuno : backend project
  • chuno안에 Dockerfile이 존재한다.
  • dockerImagedocker.build imagename을 대입했다.
    • imagename : 환경 변수에서 추가했던, docker hub의 사용자id/repository이름
    • docker.build => docker build -t : 이미지 생성한다. (이때, Dockerfile이 실행된다.)
    • Dockerfile 텍스트 파일을 사용하여 image를 생성한다.

 

💡 참고
docker build -t (image이름) (경로) : 이때, image는 docker hub repository image이름에 맞게 만들어야 한다.

 

✔️ docker push

        stage('docker-push'){
            steps{
                echo 'Push Docker'
                script {
                    docker.withRegistry('', registryCredential){
                        dockerImage.push("1.0")
                    }
                }
                
            }
        }

 

✔️ 현재까지의 pipeline

pipeline {

    agent any
    
    environment {
        imagename = "lkc263/d208backend"
        registryCredential = 'DockerHub_IdPwd'
        dockerImage = ''
    }
    
    stages {
        stage('git clone') {
            steps {
                dir('study_docker') {
                    checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
                }
            }
        }
        
        stage('build') {
            steps {
                dir('study_docker/chuno') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean bootJar"
                }
            }
        }
        
         stage('docker-build'){
            steps {
                echo 'Build Docker'
                dir('study_docker/chuno'){
                    script {
                        sh "pwd"
                        dockerImage = docker.build imagename
                        
                    }
                }
            }
        }
        
        stage('docker-push'){
            steps{
                echo 'Push Docker'
                script {
                    docker.withRegistry('', registryCredential){
                        dockerImage.push("1.0")
                    }
                }
                
            }
        }
        
    }
}

 

✔️ 실행 결과

스크린샷 2023-01-24 오후 5 16 03 스크린샷 2023-01-24 오후 5 17 28 스크린샷 2023-01-24 오후 5 17 40 스크린샷 2023-01-24 오후 5 19 37

 

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

1개의 댓글

comment-user-thumbnail
2024년 11월 12일

실습 내용 정리해주셔서 감사합니다. CICD 파이프라인 구축 중인데 참고하기 좋은 자료인거 같아😁팔로우 하고 갑니다!!

답글 달기