Maven Plugin을 활용한 Docker Container 이미지 배포 환경 구성

본 문서는 Google Container Tools 에서 제공하는 메이븐 플러그인 중 Jib 을 활용하여 각 프로젝트별 Docker 이미지를 메이블으로 생성 및 배포하는 환경 구축에 대해 기술한다.

대상으로 하는 클라우드 환경은 AWS와 Nexus를 활용한 자체 구축 Private Docker Registry이다.

배포 환경별 설정 및 구성

Amazon ECR

AWS CLI 설치 및 구성

AWS CLI 설치
  • Windows 환경

    AWS에서 제공하는 MSI 설치 관리자 페이지에서 본인 환경에 맞는 MSI 설치 파일을 다운 받아 설치 후 해당 페이지에서 안내하는 가이드라인을 따른다.

  • Unix (Linux or macOS) 환경

    1. 터미널에서 아래 명령을 실행하여 설치 스크립트를 다운로드

      1
      2
      curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
      sudo python get-pip.py
    2. Pip를 사용하여 AWS CLI를 설치

      1
      sudo pip install awscli
    3. 정상 설치 여부 확인

      1
      aws help

    AWS CLI 설치를 위해서는 Python 2.6.5 버전 이상이 필요하며 macOS의 경우 pip를 사용한 설치가 안 될 수도 있다. 이 경우 아래 링크를 참조하여 수동 설치하도록 한다.

    macOS에서 AWS Command Line Interface 설치

AWS CLI 구성

터미널 또는 CMD 화면에서 아래 명령을 실행한다. 아래 명령은 기본 설정이 변경되지 않는 한 최초 1회만 필요하다.

1
2
3
4
5
aws configure
AWS Access Key ID [None]: [AWS로부터 발급 받은 액세스 키 입력]
AWS Secret Access Key [None]: [AWS로부터 발급 받은 시크릿 액세스 키 입력]
Default region name [None]: ap-northeast-2
Default output format [None]: json

AWS Access Key와 Secret Access Key에 대해서는 아래 링크를 참조한다.

Amazon ECR Docker Credential Helper 설치 및 구성

Amazon ECR Docker Credential Helper는 Docker 이미지를 Amazon Elastic Container Registry (이하 ECR)에 손쉽게 배포하기 위해 AWS에서 만든 툴로써 AWS 인증 처리와 이미지 배포를 담당한다.

https://github.com/awslabs/amazon-ecr-credential-helper

설치

설치를 위해서는 go 언어 1.6버전 이상이 시스템에 설치되어 있어야 하며, gitmake 모듈도 설치되어 있어야 한다.

위 환경이 갖추어진 상태라면 터미널 창에서 아래 명령어를 실행하여 모듈 소스코드를 다운로드한다.

1
go get -u github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login

다운로드를 완료 한 후 아래 경로로 이동하여 make 명령을 실행한다.

1
2
3
cd ~/go/src/github.com/awslabs/amazon-ecr-credential-helper
make docker TARGET_GOOS=darwin # for macOS
make docker TARGET_GOOS=windows # for Windows

위 명령은 macOS에서 실행한 경우이고 시스템 및 사용자 환경에 따라 상이할 수 있다.

빌드를 완료한 후 생성된 바이너리 파일의 경로를 시스템 환경변수의 PATH 설정에 추가하여 어느 경로에서도 실행 가능하도록 구성한다.

환경설정

Docker 환경설정 파일(~/.docker/config.json)에 아래 내용을 추가 후 Docker를 재기동한다.

1
2
3
4
5
6
{
"credsStore" : "ecr-login",
"credHelpers" : {
"{ECR 식별 번호}.dkr.ecr.ap-northeast-2.amazonaws.com": "ecr-login"
}
}
관련 참조문서

Private Docker Registry on Nexus

Maven Setting 파일 내 서버 인증정보 추가

NEXUS 서버를 이용해 구축한 Private Docker Registry의 경우 HTTPS를 지원하지 않고 있으므로 Maven 환경설정 파일(settings.xml)에 서버 인증정보를 아래와 같이 추가하여 플러그인 사용 시 인증정보를 사용할 수 있도록 설정한다.

1
2
3
4
5
6
7
8
9
10
11
<settings>
...
<servers>
...
<server>
<id>img.example.com:12000</id> <!-- 식별자는 서버 URL로 설정 -->
<username>admin</username> <!-- 로그인 아이디 -->
<password>test!@</password> <!-- 패스워드 -->
</server>
</servers>
</settings>

플러그인 메뉴얼 페이지에서는 적절한 docker credential helper가 없을 경우 사용하도록 권고하고 있으며, setting.xml 파일에 인증정보를 그대로 노출할 경우 보안에 취약할 수 있으므로 주의해야 한다.

Docker Daemon 설정에 insecure registry 정보 등록

macOS는 Docker 공식 설치 가이드 라인에 따라 설치한 경우 아래 링크에 첨부된 스크린샷을 참고하여 insecure registry 정보 등록을 완료한다.

다른 OS의 경우에는 아래 링크를 참고한다.

메이븐 커맨드 실행 시 HttpsOnly 옵션 비활성화

jib-maven-plugin 사용 시 대상 Docker Registry가 HTTPS를 지원하지 않을 경우, 플러그인 명령 실행 시 아래와 같이 sendCredentialsOverHttp 옵션을 true로 하여 실행해야 한다.

1
compile jib:build -DsendCredentialsOverHttp=true

POM 파일 내에 플러그인 설정 내용 추가

플러그인 사용을 위한 모든 환경 설정을 마친 후 Docker 이미지로 생성 및 배포할 프로젝트의 pom.xml 파일에 아래와 같이 플러그인 사용 설정을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.7</version>
<configuration>
<to>
<image>myimage</image>
</to>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>

배포 환경에 따라 위 내용 중 configuration 노드의 내용을 달리한다.

AWS
1
2
3
4
5
<configuration>
<to>
<image>{ECR 식별 번호}.dkr.ecr.ap-northeast-2.amazonaws.com/[Repo 명]:[태그명]</image>
</to>
</configuration>
Private Docker Registry
1
2
3
4
5
6
<configuration>
<to>
<image>img.example.com:12000/[이미지 명칭]:[태그명]</image>
</to>
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration>

Maven Profile 별 설정

배포 상황에 맞게 이미지 생성 및 배포를 쉽게 하기 위해서 Maven Profile을 아래와 같이 추가 후 플러그인 설정부 역시 변경한다.

Maven Profile 추가

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
<project>
...
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<docker.repository>img.example.com:12000/${project.artifactId}:${deploy.tag.name}</docker.repository>
<docker.allow.insecure>true</docker.allow.insecure>
</properties>
</profile>
<profile>
<id>local-dev</id>
<properties>
<docker.repository>img.example.com:12000/${project.artifactId}:${deploy.tag.name}</docker.repository>
<docker.allow.insecure>true</docker.allow.insecure>
</properties>
</profile>
<profile>
<id>aws</id>
<properties>
<docker.repository>{ECR 식별 번호}.dkr.ecr.ap-northeast-2.amazonaws.com/${project.artifactId}:${deploy.tag.name}</docker.repository>
<docker.allow.insecure>false</docker.allow.insecure>
</properties>
</profile>
</profiles>
...
</project>

위 내용중 ${deploy.tag.name}은 또 다른 메이븐 플러그인인 Git 플러그인으로 Git 레포지토리로 부터 tag명 및 커밋 메세지 등 다양한 정보를 취득할 수 있다. 관련 정보 및 사용법은 아래 링크를 참고한다.

플러그인 설정 수정

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<to>
<image>${docker.repository}</image>
</to>
<allowInsecureRegistries><configuration>
<to>
<image>img.example.com:12000/[이미지 명칭]:[태그명]</image>
</to>
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration</allowInsecureRegistries>
</configuration
공유하기