서버 인프라/DevOps

Jenkins를 이용하여 Docker 애플리케이션 배포하기 [2]

트리맨스 2022. 1. 26. 22:41
반응형

 

 

저번 글에서는 Jenkins와 Github를 연결해 보았다. 연결하는 순간 Github에 Jenkins 파일이 생성될 것이다. 젠킨스 파일을 이용해서 파이프라인을 구성하면 배포 과정을 비교적 쉽게 알아챌 수 있다. 3번부터 6번까지의 과정은 Jenkins파일 안에서 스크립트로 진행될 예정인데, 이를 작성하기 위해서는 3번부터 6번까지의 과정을 cli 명령어로 구성할 줄 알아야한다.

 

Docker Image 빌드하기


도커 이미지를 로컬에서 빌드해야 한다. 먼저 다음 설명서를 읽고 도커를 설치하자.

 

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html

 

Docker basics for Amazon ECS - Amazon Elastic Container Service

Docker basics for Amazon ECS Docker is a technology that provides the tools for you to build, run, test, and deploy distributed applications that are based on Linux containers. Amazon ECS uses Docker images in task definitions to launch containers as part

docs.aws.amazon.com

 

여기서 권한설정이 오락가락한다. 먼저 jenkins 유저는 슈퍼유저 권한이 없어서 도커를 설치할 수 없다. 그래서 ec2-user에서 설치를 한 후에 jenkins 유저에서 docker를 사용할 수 있게 했다. 다음 명령어 " sudo chmod 666 /var/run/docker.sock " 를 치면 jenkins 유저에서도 docker를 실행할 수 있다.

 

도커 파일 빌드는 docker build -f {도커파일이름} --tag {태그} 를 실행하면 된다. 여기서 태그는 나중에 ecr에서 생성할 도커 이미지 저장소의 태그와 일치시킨다.

 

도커이미지 ECR에 업로드하기


도커이미지를 만들었으면 이제 ECR에 업로드하자. 업로드는 간단하다. aws ecr 사이트에 처음 접속하게 되면 저장소를 생성하고 명령어를 볼 수 있게 했다. 명령어 입력 전에 인스턴스에 aws-cli를 설치해야 한다. 설치 방법은 다음 공식 문서에 나와 있다.

 

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.htm

 

Installing or updating the latest version of the AWS CLI - AWS Command Line Interface

To update your current installation of the AWS CLI, add your existing symlink and installer information to construct the install command with the --update parameter. $ sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update To

docs.aws.amazon.com

 

aws-cli를 설치했으면 aws configure를 이용해 본인의 id 와 시크릿 키를 등록한다. IAM -> 사용자 -> 보안 자격 증명 -> 엑세스 키 발급을 누르게 되면 발급이 된다. 여기서 주의할 점은 한번 발급받은 id와 시크릿 키는 사용자가 잃어버리면 찾을 수 없다. 보관에 주의하자.

 

 

이제 aws ecr에 자격 증명을 하고 도커 이미지를 업로드해 보자. 명령어는 공식 문서가 더 잘 나와있다. 참고해서 스크립트를 작성해보자.

 

1
2
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 아이디.dkr.ecr.ap-northeast-2.amazonaws.com
docker push 아이디.dkr.ecr.ap-northeast-2.amazonaws.com/:latest
cs

 

 

배포하기


이제 배포를 해보자. 나는 이미 elastic beanstalk에 프로젝트를 배포를 한 상태이다. 이 프로젝트를 업데이트 하는 시그널만 보내줄 예정이다. elastic beanstalk에 프로젝트를 배포하는 방법부터 알아보자.

 

맨 처음에는 elastic beanstalk에서 ecr에 접근할 권한을 부여해야 한다. IAM -> 역할 -> aws-elasticbeanstalk-ec2-role -> AmazonEC2ContainerRegistryReadOnly 정책을 추가한다. 이렇게 해 주어야 elastic beanstalk에서 ecr에 접속하여 이미지 파일을 끌어올 수 있다.

 

 

 

그리고 elastic beanstalk에 가서 프로젝트를 생성한다. 나머지는 다 상관없고, 배포 방식에 아래와 같은 설정을 한다. (나는 docker-compose는 쓰지 않고 Dockerrunaws.json 파일만 사용할 것이다. 최신버전은 단일컨테이너를 지원하지 않는 것 같다.)

 

 

밑에 애플리케이션 코드 -> 코드 업로드에 미리 작성해둔 Dockerrunaws.json을 업로드 하게 되면 알아서 배포가 시작이 된다. Image 항목에는 ecr 주소를 작성한다.

 

 

정말 마지막이다. aws-cli를 이용해서 배포 스크립트를 작성한다. 사실 배포 보다는 환경을 적용하는 명령어를 통해 환경을 업데이트 한다는 느낌이 조금 더 강한 것 같다. 이것도 공식 문서를 찾아보면 바로바로 나온다. 최종적으로 위의 명령을 모두 합친 Jenkinsfile 명령어는 아래와 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
pipeline {
  agent any
  stages {
    stage('Build Dockerfile') {
      steps {
        script {
          try {
            try {
              sh 'docker rmi -f $(docker images -q)'
            } catch(error) {
              print(error)
            }
            sh 'docker build -f prod.dockerfile --tag 태그 .'
          } catch(error) {
            echo 'Docker Build error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
 
    stage('Dockerfile Upload') {
      steps {
        script {
          try {
            sh 'aws ecr get-login-password --region ap-northeast-2 | \
                docker login --username AWS --password-stdin 아이디.dkr.ecr.ap-northeast-2.amazonaws.com'
            sh 'docker tag 태그:latest 아이디.dkr.ecr.ap-northeast-2.amazonaws.com/태그:latest'
            sh 'docker push 아이디.dkr.ecr.ap-northeast-2.amazonaws.com/태그:latest'
          } catch(error) {
            echo 'Dockerfile Upload error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
 
    stage('Start deploy') {
      steps {
        script {
          try {
            sh 'aws elasticbeanstalk update-environment \
                --region ap-northeast-2 \
                --environment-name eb환경\
                --version-label '
          } catch(error) {
            echo 'Deploy Error!'
            echo 'Error Log:'
            print(error)
          }
        }
      }
    }
  }
}
cs

 

결과물


github의 master branch에 파일의 변화가 생기게 되면 Jenkins에서 알아서 빌드를 시작한다!

 

 

위 과정이 끝나면 Elastic Beanstalk에서 알아서 환경을 업데이트한다!

 

 

 

 

 

 

 

 

반응형