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"을 확인할 수 있습니다.