Alpine 기반 OpenJDK 8 및 Tomcat 9 Docker 이미지 구축 가이드

1. 사용자 정의 Alpine 기반 OpenJDK 8 베이스 이미지 생성

먼저 Docker Hub에서 Maven 이미지(maven:3.5.0-jdk-8-alpine)를 참고하여 OpenJDK 8 베이스 이미지를 제작합니다. 이 이미지는 공식 alpine-3.18.0:v1 이미지를 기반으로 합니다.

OpenJDK 8 바이너리는 AdoptOpenJDK에서 다운로드합니다. (예: OpenJDK8U-jdk_x64_alpine-linux_hotspot_8u432b06.tar.gz)

참고: Docker 컨테이너는 기본적으로 /etc/profile을 자동으로 로드하지 않습니다. 따라서 환경 변수는 Dockerfile에서 직접 ENV 명령어로 설정하거나, 컨테이너 시작 시 bash -l을 사용해야 합니다.

파일 구조:

~/system/openjdk/
├── Dockerfile
├── OpenJDK8U-jdk_x64_alpine-linux_hotspot_8u432b06.tar.gz
└── profile

profile 파일 (~/system/openjdk/profile):

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
export PAGER=less
umask 022

# PS1 설정
if [ -n "$BASH_VERSION" -o "$BB_ASH_VERSION" ]; then
	PS1='\h:\w\$ '
elif [ -n "$ZSH_VERSION" ]; then
	PS1='%m:%~%# '
else
	: "${HOSTNAME:=$(hostname)}"
	PS1='${HOSTNAME%%.*}:$PWD'
	[ "$(id -u)" -eq 0 ] && PS1="${PS1}# " || PS1="${PS1}$ "
fi

if [ -n "$BASH_VERSION" ] && [ "$BASH" != "/bin/sh" ]; then
	. /etc/bash/bashrc
fi

for script in /etc/profile.d/*.sh ; do
	if [ -r "$script" ] ; then
		. "$script"
	fi
done
unset script

# JDK 환경 변수
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$JAVA_HOME/lib/tools.jar

Dockerfile (~/system/openjdk/Dockerfile):

FROM registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0:v1
LABEL Image="Openjdk base"

# JDK 압축 해제 및 심볼릭 링크 생성
ADD OpenJDK8U-jdk_x64_alpine-linux_hotspot_8u432b06.tar.gz /usr/local/src/
RUN ln -s /usr/local/src/jdk8u432-b06 /usr/local/jdk

# profile 파일 복사 및 환경 변수 설정
ADD profile /etc/profile
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$JAVA_HOME/lib/tools.jar

빌드 및 푸시:

docker build -t registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06:v1 .
docker push registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06:v1

테스트:

docker run -ti --rm registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06:v1 sh

/ # java -version
openjdk version "1.8.0_432"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_432-b06)
OpenJDK 64-Bit Server VM (Temurin)(build 25.432-b06, mixed mode)

/ # env | grep JAVA
JRE_HOME=/usr/local/jdk/jre
JAVA_HOME=/usr/local/jdk

이미지 내에 www 사용자가 (uid 2024) 생성되어 있습니다.

2. OpenJDK 8 이미지를 기반으로 한 Tomcat 9 베이스 이미지 생성

이 단계에서는 위에서 만든 OpenJDK 8 이미지를 기반으로 Tomcat 9이 설치된 범용 베이스 이미지를 만듭니다. 이 이미지는 여러 애플리케이션에서 공통으로 사용됩니다.

Tomcat 버전과 JDK 버전 호환성은 공식 문서를 참고하세요. Tomcat 8은 더 이상 유지보수되지 않으므로 Tomcat 9을 사용합니다.

Tomcat 9 다운로드:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.97/bin/apache-tomcat-9.0.97.tar.gz

Dockerfile:

FROM registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06:v1

# 기본 환경 변수
ENV TZ="Asia/Shanghai"
ENV LANG=en_US.UTF-8
ENV TERM=xterm
ENV TOMCAT_MAJOR_VERSION=9
ENV TOMCAT_MINOR_VERSION=9.0.97
ENV CATALINA_HOME=/apps/tomcat
ENV APP_DIR=${CATALINA_HOME}/webapps

# Tomcat 설치 디렉토리 및 전용 사용자 생성
RUN mkdir /apps && \
    addgroup -g 2025 -S tomcat && \
    adduser -u 2025 -G tomcat -D -S -s /bin/sh tomcat

# Tomcat 압축 해제 및 심볼릭 링크
ADD apache-tomcat-9.0.97.tar.gz /apps
RUN ln -s /apps/apache-tomcat-9.0.97 /apps/tomcat

빌드 및 푸시:

docker build -t registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97:v1 .
docker push registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97:v1

테스트:

docker run -it --rm -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97:v1 sh

/ # /apps/tomcat/bin/catalina.sh start
Tomcat started.

/ # netstat -ntulp | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      14/java

/ # env | grep TOMCAT
TOMCAT_MINOR_VERSION=9.0.97
CATALINA_HOME=/apps/tomcat
TOMCAT_MAJOR_VERSION=9
APP_DIR=/apps/tomcat/webapps

3. Tomcat 9 베이스 이미지를 기반으로 한 애플리케이션 이미지 생성

이제 위에서 만든 Tomcat 9 베이스 이미지를 사용하여 실제 애플리케이션(app1)을 배포하는 이미지를 만듭니다.

준비 작업:

mkdir -p ~/web/tomcat/tomcat-app{1,2}
cd ~/web/tomcat/tomcat-app1

# Tomcat 설정 파일 복사 및 수정
tar xzvf ../apache-tomcat-9.0.97.tar.gz
cp apache-tomcat-9.0.97/conf/server.xml .

# server.xml 에서 appBase 경로 수정
# <Host name="localhost" appBase="/data/tomcat/webapps" ... >

애플리케이션 파일 준비:

mkdir app
echo "Tomcat Page in app1" > app/index.jsp
tar zcf app.tar.gz app

컨테이너 시작 스크립트 (run_tomcat.sh):

#!/bin/bash
echo "nameserver 192.168.31.1" > /etc/resolv.conf
su - tomcat -c "/apps/tomcat/bin/catalina.sh start"
su - tomcat -c "tail -f /etc/hosts"
chmod a+x run_tomcat.sh

Dockerfile (~/web/tomcat/tomcat-app1/Dockerfile):

FROM registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97:v1

# 설정 파일 및 애플리케이션 추가
ADD server.xml /apps/tomcat/conf/server.xml
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD app.tar.gz /data/tomcat/webapps/

# 소유권 변경
RUN chown -R tomcat.tomcat /apps/ /data/tomcat/

EXPOSE 8080
CMD ["/apps/tomcat/bin/run_tomcat.sh"]

빌드 및 실행:

docker build -t registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97-v1-app1:v1 .
docker push registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97-v1-app1:v1

docker run -ti --rm -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-openjdk-8u432b06-v1-tomcat-9.0.97-v1-app1:v1

컨테이너가 시작되면 http://localhost:8080/app에서 "Tomcat Page in app1"을 확인할 수 있습니다.

태그: docker OpenJDK Tomcat Alpine Linux Containerization

6월 13일 23:42에 게시됨