Docker로 Java App를 배포를 할 때마다 매번 JDK 설정과 파일을 복사하는 것이 낭비인 것 같아서 별도로 이미지로 만들기로 했다.
기본 JDK와 설정만 되어 있는 이미지를 만들어 놓으면, 차후 배포용 앱 이미지를 만들때 반복 작업을 하지 않아도 된다. 추가로 이미지 생성에서 발생할 수 있는 실수도 줄어 들것이다.

작성자는 도커에 대해서 깊이 알지 못한다. 아래 내용은 정확하지 않을 수 있다.

Base OS 선택


JDK용 Docker 이미지는 보통 알파인 리눅스(Alpine Linux)를 사용하더라.
가볍고 간단하고 보안성이 높아서 그런지 많이 사용하더라. 도커(docker)용 이미지로 5M 크기의 리눅스 이미지도 만들어진다니 작긴 작다.
마이크로소프트 공식 Azure 홈페이지에서도 Azure용 JDK Docker 이미지도 알파인 리눅스(Alpine Linux)를 사용하더라.
그래서 본인도 대세를 따르기로 했다. 많이 쓰면 많이 쓰는 이유가 있을 것이고, 레퍼런스도 많을 테니 이슈처리도 문제없을 것이다.

Dockerfile 작성

docker-library에 가면 미리 만들어 놓은 JDK용 Dockerfile이 많이 올라와 있다. 그냥 버전별로 골라 잡아 사용해도 무난할 것 같다.
하지만 서비스용으로 몇가지 설정이 필요한 관계로 직접 만들기로 했다.

변경 내용.

  • 알파인 리눅스는 용량을 줄이기 위해서 경량 표준 C 라이브러기가 포함되어 있다. 하지만 리눅스용 JDK는 GLibc가 있어야 한다. 이미 Vlad Frolov라는 사람이 만들어 놓았다. 그걸 사용하자.
  • [옵션]추가적으로 시간설정을 위해서 tzdata를 추가를 추가했다.
  • [옵션]서비스 데몬이 정상적으로 로딩되었는지 체크를 위해서 procps를 추가했다.

알파인 리눅스를 잘몰라서 기본 Linux 설정 방법으로 진행하다 보니 추가 패키지를 설치했다.

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Dockerfile

FROM frolvlad/alpine-glibc
MAINTAINER walker@signal9.co.kr

ENV LANG ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
ENV JAVA_HOME /usr/local/jre8

RUN apk --no-cache add tzdata && \
apk --no-cache add procps && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Asia/Seoul" > /etc/timezone && \
date

COPY ./adoptopenjdk-8.jdk $JAVA_HOME
#RUN $JAVA_HOME/bin/java -version

빌드

1
$ docker build -t igaworks/apline-glic-jre8 .

서비스 이미지 만들기

1
2
3
4
5
# Dockerfile

FROM igaworks/apline-glic-jre8
MAINTAINER walker@signal9.co.kr
...