본문 바로가기
Infra/Jenkins

[Jenkins] Jenkins를 이용하여 원격 서버에 SpringBoot 컨테이너 띄우기

by dbjh 2021. 1. 24.
반응형

이번글에서는 GCP(Google Cloud Platform) VM 인스턴스 위에서 실행 중인 젠킨스에서 원격 서버인 AWS EC2 인스턴스SpringBoot 프로젝트를 빌드한 jar 및 Dockerfile 을 전송하여 도커이미지로 변환 후 컨테이너로 띄우는 실습을 해볼것이다.

기존에 Jenkins- Github연동이 되어있다는 가정하에 진행되는 과정이니, 만약 연동이 되지 않았다면 아래의 글을 먼저 진행하고 오도록 하자.

 

[Jenkins] Jenkins & Github 연동 및 자동배포 구성하기 1

이 글을 시작으로 jenkins와 github의 특정 프로젝트를 연동 시켜두고 해당 프로젝트에서 push 발생 시, jenkins가 이것을 인식하고 자동으로 배포하는 과정에 대해서 진행하려고한다. 배포될 프로젝트

dbjh.tistory.com

* jenkins-github를 연동하여, 원격서버로 배포하는 과정은 이미 위에 첨부한 링크의 글에서 다루었다. 이번 글에서는 jar를 파일을 직접 실행하지 않고, jar파일을 이미지로 만들어서 해당이미지를 컨테이너로 띄우는 과정이기 때문에 추가적인 작업에 대해서만 다루도록 하겠다.

0. SpringBoot 프로젝트 하위에 Dockerfile 생성하기

도커 이미지를 생성하기 위해서는 Dockerfile(확장자 없음)이 필요한데, 이 파일은 프로젝트 최상위 경로에 위치해야한다.

Dockerfile 경로

Dockerfile 파일을 추가하였다면 내부 스크립트를 작성한 후에 github 원격 레포지토리에 push 하도록 하자.

Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=jenkins-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","/app.jar"]


Dockerfile은 위처럼 작성되는데, Docker라는 프로그램이 해당 프로젝트를 어떠한 도커 이미지로 만들어줘야 하는지에 대해 간단히 명료해둔것이다. 각 명령에 대한 간단한 설명은 아래와 같다. (위에 작성되지 않은 명령어도 포함됨)

  • FROM  : 기반이 되는 이미지 레이어이며, <이미지 이름>:<태그> 형식으로 작성함. 해당 프로젝트를 실행하기 위해 필요한 이미지
  • MAINTAINER:  메인테이너 정보입니다. ex) ~~~@naver.com
  • VOLUME: 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하기 위한 설정
  • CMD : 컨테이너 시작시, 실행할 파일 또는 shell 스크립트. (해당 명령어는 DockerFile내 1회만 사용 가능)
  • WORKDIR : CMD에서 설정한 실행 파일이 실행될 디렉토리
  • EXPOSE 호스트와 연결할 포트 번호입니다. ex) 8080
  • ENV환경변수를 정의. ex) 추후 프로파일로 사용될 환경변수등을 설정할 수 있음.
  • ADDCOPY이미지 안에 파일을 복사할 때 사용함. 'COPY jerkins.sh /user/local/bin/jenkins.sh'와 같은 방식으로 사용. 이 때 압축해제없이 단순히 이미지 안에 넣을 때는 COPY를 쓰고, 압축해제 등의 작업 후 처리가 필요하다면 ADD를 사용
  • ENTRYPOINT: 이미지 실행 명령을 다시 지정하기 위해 사용. 기본적으로 이미지는 한 번 만들어지면 수정할 수 없다는 점에서 마치 프로그램을 작성하듯이 쉘 스크립트를 작성하여 엔트리 포인트로 걸어놓고 사용가능.
  • RUN: 도커이미지가 생성되기 전에 수행할 쉘 명령어

 

* 여기서 알아야할 것은, JAR_FILE=jenkins-0.0.1-SNAPSHOT.jar으로 되어있는데 기존에 jar파일은 빌드가 되면 /build/libs 디렉토리 하위에 생성된다. 하지만 위에서는 Dockerfile과 jar파일을 같은 디렉토리로 파일전송하기 때문에 prefix 경로를 입력하지 않았다. 만약 로컬에서 Springboot 프로젝트를 도커 컨테이너로 띄우는 경우에는 JAR FILE의 경로에 prefix로 /build/libs 입력하고 사용하되, 젠킨스에서 jar파일 전송디렉토리 경로도 수정해주도록하자.

1. 빌드 후 조치 스텝  추가하기

젠킨스 프로젝트의 "구성" 메뉴로 이동하여 빌드 후 조치 스텝(Send build artifacts over SSH)을 추가하도록하자

빌드 후 조치 스텝 추가하기

빌드 후 조치 스텝(Send build artifacts over SSH) 추가 UI가 노출되면 아래와 같이 작성하도록하자. 

위처럼 작성한 후 저장하면 마무리된다. 위의 설정에 대한 설명을 간단히 하자면,

당연히 Dockerfile을 원격 서버로 배포해야 하기때문에 Source files에 Dockerfile을 명시하였다. 해당프로젝트 최상위에 있기때문에 prefix 경로가 필요없다. 그리고 jar파일이 배포되는 위치 그대로 Remote directory를 설정하였다. 마지막으로 스크립트 내용은 아래와 같다.

# Dockerfile이 위치하는 디렉토리로 이동
cd /home/ec2-user/jenkins-dev

# 기존에 name이 jenkins로 실행 중인 컨테이너 종료
docker stop jenkins

# 기존 name이 jenkins인 컨테이너 삭제
docker rm jenkins

# 기존 name이 jenkins인 이미지 삭제
docker image rm jenkins

# jenkins라는 이름으로 이미지 생성
docker build -t jenkins .

# 컨테이너로 실행
docker run -d -p 9090:8888 --name jenkins jenkins

 

2. 원격 서버로 접속하여 컨테이너 확인

위처럼 모든 설정이 끝났다면, 저장 후에 빌드를 실행하도록하자. 빌드 후에 원격 서버(여기서는 AWS EC2인스턴스)로 접속하여 해당 컨테이너가 정상적으로 실행되었는지 확인해 보도록하자.

jenkins라는 이름으로 실행된 컨테이너 확인

정상적으로 실행되고 있는 컨테이너를 확인할 수 있다.

*만약 빌드중에 /var/run/docker.sock의 permission denied 관련 에러가 발생하는 경우, docker.sock파일 사용권한이 없는 것인데, 원격서버에서 아래와 같이 설정하고 다시 빌드하도록하자.

sudo chmod 666 /var/run/docker.sock

 

추가적으로, 위에서는 Dockerfile과 jar파일을 같이 원격서버로 전송하여 이미지를 생성하였지만 젠킨스 컨테이너 위에서 해당 Springboot 이미지를 만들어서 Docker hub의 원격 레포지토리로 push 후 원격 서버에서 해당이미지를 받아서 컨테이너로 띄우는 방법도있으니, 참고하도록하자

 

젠킨스를 이용하여 SpringBoot 프로젝트를 Docker Container로 배포하기 끝.

반응형

댓글