[Docker]Java spring, Tomcat을 활용한 컨테이너 배포 | dasfef

2025.02.10

자사 서비스 테스트 서버 구축(RMS)


1. 테스트 서버 구축 동기 자사에서 서비스하고 있는 웹 애플리케이션에 대해 테스트 서버를 구축중에 있다. 테스트 서버를 구축하게 된 동기는 아래 링크를 통해 확인할 수 있다.

테스트 서버 구축 동기

웹 애플리케이션 서비스 중에 RMS(Raw-material Management System)이 있다. 원료를 중요시 하는 공정이기에 원료에 대한 갖가지 정보를 담아두는 공간이 필요했는데 그 시스템을 RMS에 녹여냈다.

해당 시스템의 히스토리는 19-20년도 즈음에 구축 되었고, 현재는 유지보수 업체를 통해 유지보수를 진행하고 있지만 서비스 자체에 크게 업데이트 되는 사항은 없고 오류가 발생하면 해당 오류에 대해 체크와 보수를 진행하고 있는것으로 파악중에 있다.




2. 버전 체크 RMS 시스템의 소스코드를 살펴보면 Java spring 프레임워크를 활용하여 MVC패턴을 이루고 있고, Apache Tomcat 애플리케이션 서버를 통해 Java를 웹 브라우저에서도 확인할 수 있는 구조로 되어 있었다.

Java의 경우 11 버전을 사용하고, Tomcat은 Tomcat-9.0.29 Spring은 Spring 5.2.1 버전을 사용하고 있다.




3. 도커 이미지 빌드

각 컴포넌트의 버전을 파악했으니 같은 OS인 CentOS7.9 OS에 도커 컨테이너를 올려보도록 하자.

FROM centos:centos7.9.2009 RUN cd /etc/yum.repos.d/ && sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* RUN yum update -y && yum install -y wget && yum install -y java-11 RUN cd /etc && wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.29/bin/apache-tomcat-9.0.29.tar.gz && tar -zxvf apache-tomcat-9.0.29.tar.gz

위와 같이 작성한 후 Dockerfile 이름으로 파일을 만들어준다. 위 명령어를 한 줄씩 파악해보면 다음과 같다.

FROM centos:centos7.9.2009
>> CentOS7.9 버전 이미지 활용

RUN cd /etc/yum.repos.d/ && sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
>> yum repo 경로 vault로 변경

RUN yum update -y && yum install -y wget && yum install -y java-11
>> yum update 및 wget 설치, java-11 버전 설치

RUN cd /etc && wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.29/bin/apache-tomcat-9.0.29.tar.gz && tar -zxvf apache-tomcat-9.0.29.tar.gz
>> /etc 폴더에 Tomcat 9.0.29버전 다운로드 및 압축 해제

이제 해당 경로 안에서 도커 빌드 명령어를 입력한다.

docker build –tag rms-app .

위 명령어가 정상적으로 작동했을 경우, docker images에서 태그로 지정한 “rms-app” 이미지가 확인된다. 그리고 해당 이미지로 컨테이너를 실행한 후 build 이미지에서 지정한 /etc 폴더를 가보면, tomcat-9.0.29 버전이 압축이 풀린 상태의 폴더와 java-11 버전이 설치된 것을 확인할 수 있다.




4. Tomcat 설정 이미지를 빌드할 때 tomcat을 wget으로 받아 /etc 폴더에 저장해 두었으니 /etc 폴더로 들어가 압축이 풀려있는 tomcat 파일을 확인한다.

tomcat은 bin 폴더의 리눅스라면 startup.sh, 윈도우라면 startup.bat 으로 서비스를 실행할 수 있다. ./startup.sh 명령어로 서비스를 올리면

위와 같이 Tomcat started. 라는 내용을 확인할 수 있고, 도커 컨테이너의 8080 포트로 진입해보면 Tomcat 시작 페이지를 확인할 수 있다.

필자의 경우 가상OS 위에 도커 컨테이너를 구상중이라 가상OS의 8989포트를 포트포워딩 진행시켜 두었다.



5. Spring 설정 현재 자사에서 사용중인 서비스의 경우, java를 통해 특정 폴더로의 리다이렉션을 진행중이다. 따라서 위 포트포워딩을 진행한 포트와 리다이렉션 폴더 경로를 지정해주면 서비스로 진입할 수 있다.

하지만 War 파일을 통째로 Tomcat에 넣어 해당 War 파일을 풀어 배포하고 있기 때문에 Spring Profile 설정이 진행되어 있지 않은 상태이다.

따라서 해당 리다이렉션 경로로 들어가고자 하면 아래와 같은 404 오류를 확인할 수 있다.


1) JVM에서 프로파일 바인딩 Tomcat 폴더의 setenv.sh 파일을 만들어 해당 파일 안에 다음과 같이 작성한다. JAVA_OPTS=”$JAVA_OPTS -Dspring.profiles.active=prod” export JAVA_OPTS

이후 Tomcat 서비스를 재실행하고 echo $JAVA_OPTS 를 해주면 내용을 확인할 수 있고, 혹은 logs 폴더에서 catalina.out 파일에서 spring.profiles.active 에 대해 어떤 프로파일이 설정되었는지 확인할 수 있다.
2) XML 파일에서 직접 바인딩 본인의 경우 어디서 프로파일 지정을 해주는지 추적하기 어려웠다. 또한 위와 같이 catalina.out 파일에서 JAVA_OPTS 경로 지정을 해주고 export 까지 해주었지만 프로파일 바인딩이 되지 않았다.

catalina.out 파일 내에서 스스로 JAVA_OPTS를 초기화 하고 있는 것인지, 정확한 원인 파악은 어려워 context.xml 파일을 수정하는 방식으로 진행했다.

직접 context param 내용에 프로파일을 지정하여 설정하는 것인데, web.xml 파일에 아래와 같이 작성하면 된다.

<context-param> <param-name>spring.profiles.active</param-name> <param-value>prod</param-value> </context-param>


3) setenv.sh 파일 생성 catalina.out 파일이 있는 bin 폴더에서 setenv.sh 파일을 생성한다. 그리고 해당 파일 안에 JAVA_OPTS 환경 변수 설정을 한다. 그렇게 되면 Tomcat은 시작할 때 setenv.sh 파일이 있으면 해당 파일의 설정을 불러오기 때문에 JAVA_OPTS 환경 변수를 설정해줄 수 있다.

#!/bin/bash
export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"

위의 명령어를 실행하면서 JVM 영역에서 Spring의 프로파일을 설정해주고, 그 값을 prod(혹은 시스템 설정마다 다름)로 지정하면서 해당 프로파일로 spring을 실행시킨다.

그리고 아까 포트포워딩 한 경로로 들어가보면

위와 같이 로그인 페이지로 이동하는 것을 볼 수 있다. 여기에 DB를 구축하고, 구축한 DB와 연결해주면 로그인까지 되는 웹 애플리케이션을 구성할 수 있다.


이전 페이지로 이동