많은 고객들이 기존 온프레미스 환경에서 클라우드로 이전하였음에도 서비스 형태나 어플리케이션 배포는 기존 레거시 형태를 사용하는 경우가 많습니다. EC2를 직접 생성하고 그 안에 SSH로 접속해서 어플리케이션을 배포하는 방법은 EC2를 온디맨드로 사용할 수 있다는 것 외에는 크게 달라진 것이 없습니다.

기존 어플리케이션을 도커로 만들게 된다면, 도커 기반의 다양한 기능과 서비스를 이용하여 좀 더 배포에 용이한 CI/CD 구조를 갖출 수 있게 됩니다. 하지만, 그렇다고 기존 어플리케이션을 무턱대고 바꾸기도 어렵겠지요.

이럴 때에 사용하면 유용한 플러그인이 바로 구글에서 오픈소스로 내어놓은 Jib 플러그인 입니다. Jib은 기존의 Java 어플리케이션을 손쉽게 도커 이미지로 만들어주는 패키지인데, Maven 또는 Gradle 플러그인 형태로 제공됩니다. Dockerfile을 다시 생성하는 절차를 생략함으로써 플러그인 셋팅으로 모든 도커 설정을 대체하여 얼마든지 커스터마이즈가 가능합니다.

이번 글에서는 Jib에 예제로 들어있는 helloworld 프로젝트를 Maven으로 빌드하여 도커 이미지를 생성하고 이를 ECR (Amazon Elastic Container Registry)로 배포하는 과정에 대해서 적어볼까 합니다.

Sample Project

먼저 Jib 소스를 다운로드 합니다.

git clone https://github.com/GoogleContainerTools/jib.git
Code language: PHP (php)

IntelliJ에서 examples 폴더 안에 있는 helloworld 프로젝트를 열어줍니다. pom.xml을 선택하면 자동으로 Maven 프로젝트로 불러옵니다.

pom 파일에 Jib 설정이 보입니다.

pom.xml 파일에서 Jib 플러그인의 configuration 부분을 원하는 ECR 리포지토리로 수정합니다. 사전에 해당 ECR 리포지토리는 생성이 되어있어야 합니다.

<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<to>
<image>123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-jib-test</image>
<credHelper>ecr-login</credHelper>
</to>
</configuration>
</plugin>
Code language: HTML, XML (xml)

Credential Helper

ECR에 배포를 하기 위해서는 amazon-ecr-credential-helper가 설치되어 있어야 합니다. [참고 자료] 제가 사용하는 Windows 기준으로는 약간 번거롭습니다. 소스를 직접 빌드해야 하기 때문입니다. 다른 운영체제는 참고 자료 링크에서 확인하시기 바랍니다.

# 관리자 권한으로 실행해야 합니다.
# chocolatey가 설치되어 있어야 합니다.
choco install golang
go get -u github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login
Code language: Bash (bash)

정상적으로 설치가 완료되었다면 다음과 같이 버전을 확인할 수 있습니다.

$ docker-credential-ecr-login version
0.6.3
Code language: Bash (bash)

Build

이제 준비가 완료되었습니다. 소스를 compile 한 다음에 플러그인 목록에서 Jib를 찾아서 build를 진행합니다.

빌드가 잘 진행되었습니다.

경고가 뜨기는 했지만, 정상적으로 완료가 되었습니다. 그리고 ECR에 보시는 바와 같이 도커 이미지가 정상적으로 올라온 것을 확인할 수 있습니다.

latest 태그 이미지가 보입니다.

경고 내용은 from 이미지를 명확하게 지정하지 않아서 다음에 build되는 이미지가 기존 이미지와 다를 수 있다는 것입니다. 필요하다면, from 이미지도 명시하여 언제나 같은 형상을 다시 재현할 수 있습니다.

아직 배포하기는 좀 그렇고, 로컬 테스트가 필요하신가요? 그러면 build 대신에 dockerBuild를 진행하시면 현재 사용중인 호스트 컴퓨터의 도커에 이미지로 생성됩니다. 날짜가 1970년 1월 1일로 지정되면서 51년전으로 나타나네요. 🤣

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-jib-test latest 41af692b3193 51 years ago 133MB

로컬 호스트에 이미지가 생성되었으므로 얼마든지 docker run을 통해 테스트가 가능합니다.


이렇게 손쉽게 Java 어플리케이션을 도커 이미지로 변환하였습니다. 그러면 번거롭게 EC2에 AMI등을 생성하고 Auto Scailing을 통해서 이중화를 할 필요가 없습니다. ECS 또는 EKS 같은 서비스를 통해서 보다 손쉽게 서비스를 유지, 관리하고 배포 프로세스를 단순화 할 수 있습니다. CI/CD 고도화를 위한 Jib 플러그인 소개는 여기까지입니다. 😊