Docker 기반 Tomcat 애플리케이션 배포 상세 가이드

1. 온라인 배포

1.1 Tomcat 이미지 검색 및 다운로드

공식 이미지 저장소: https://hub.docker.com

# Tomcat 이미지 검색
docker search tomcat

# Tomcat 이미지 다운로드 (특정 버전 예시)
docker pull tomcat:8.5.47-jdk8-openjdk

1.2 컨테이너 생성 및 포트/디렉토리 매핑

1.2.1 방법 1: 호스트 네트워크 모드 사용

호스트 네트워크 모드를 사용하여 컨테이너를 생성하고, WAR 파일을 컨테이너 내부로 복사합니다.

# 호스트 네트워크 모드로 Tomcat 컨테이너 실행
docker run -di --net="host" --name=mytomcat -p 8080:8080 tomcat

# WAR 파일을 컨테이너의 webapps 디렉토리로 복사
docker cp test.war mytomcat:/usr/local/tomcat/webapps/

1.2.2 방법 2: 디렉토리 마운트 (Volume) 사용

디렉토리 마운트는 호스트와 컨테이너 간 파일을 동기화하는 방법입니다. 컨테이너 생성 시 -v 또는 --mount 옵션을 사용합니다.

# --mount 옵션을 사용한 디렉토리 마운트
docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

# -v 옵션을 사용한 디렉토리 마운트 (동일 기능)
docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

컨테이너 정보 확인:

docker inspect [컨테이너명|컨테이너ID]
# 예시: docker inspect tomcat
마운트 방식 상세 설명
  • 데이터 볼륨 모드: 호스트 디렉토리 → 데이터 볼륨 → 컨테이너 내부 디렉토리 (경로를 정확히 알 필요 없음)
  • 직접 마운트 모드: 호스트 디렉토리 → 컨테이너 내부 디렉토리 (사용자가 직접 경로를 지정하여 관리 용이)
# 1. 데이터 볼륨 생성
docker volume create mytomcat-vol

# 2. 볼륨 목록 확인 (모든 볼륨은 /var/lib/docker/volumes 아래 위치)
docker volume ls

# 3. 볼륨 상세 정보 확인
docker volume inspect mytomcat-vol

# 4. Tomcat 컨테이너 생성 및 webapps 디렉토리 마운트 (방법 A)
docker run -d -it --name mytomcat \
  --mount src=mytomcat-vol,dst=/usr/local/tomcat/webapps/ROOT \
  -p 8080:8080 tomcat:8.5.82-jdk11-openjdk

# Tomcat 컨테이너 생성 및 디렉토리 마운트 (방법 B)
mkdir ~/tomcat && cd ~/tomcat
docker run -di --name=tomcat -p 8080:8080 \
  --restart=always \
  -v /root/mydata/tomcat/webapps:/usr/local/tomcat/webapps \
  tomcat:8.5.82-jdk11-openjdk

# Tomcat 컨테이너 생성 및 현재 디렉토리 마운트 (방법 C)
docker run -di --name=mytomcat -p 8080:8080 \
  -v $PWD:/root/tomcat/webapps \
  tomcat:8.5.82-jdk11-openjdk

# 외부 파일을 마운트한 Tomcat 컨테이너 실행 (방법 D)
docker run -dit --name tomcat --restart=always \
  -p 8080:8080 \
  -e TZ=Asia/Seoul \
  --network=my-network \
  -v /usr/local/dockerdata/tomcat/webapps:/usr/local/tomcat/webapps \
  -v /usr/local/dockerdata/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml \
  -v /home/dockerdata/bjgmkdata:/home/dockerdata/bjgmkdata \
  tomcat:10.0.75

매개변수 설명:

  • -p 8080:8080: 포트 매핑 (호스트 포트:컨테이너 포트)
  • -v: 디렉토리 매핑 (호스트 디렉토리:컨테이너 디렉토리)
  • -v /etc/localtime:/etc/localtime:ro: 호스트와 컨테이너 시간 동기화 (읽기 전용)
  • --restart=always: 컨테이너 자동 재시작 설정

참고: WARNING: IPv4 forwarding is disabled. Networking will not work. 오류 발생 시 다음 단계를 수행합니다.

# 1. sysctl.conf 파일 편집
vi /etc/sysctl.conf

# 2. 파일에 다음 내용 추가
net.ipv4.ip_forward=1

# 3. 네트워크 재시작
systemctl restart network
5. 마운트 확인

호스트의 볼륨 데이터 디렉토리에서 파일을 생성하고 컨테이너에서 확인합니다.

# 호스트에서 볼륨 데이터 디렉토리 접근
cd /var/lib/docker/volumes/mytomcat-vol/_data

# index.html 파일 생성
echo "hello world" > index.html

# 컨테이너에 접속하여 마운트 확인
docker exec -it mytomcat /bin/bash
cd webapp/ROOT
ls  # index.html 파일 확인

호스트에서 파일을 수정하면 컨테이너에 반영되며, 반대로 컨테이너에서 파일을 삭제하면 호스트에서도 삭제됩니다.

1.3 로그 확인

docker logs -f mytomcat

1.4 404 오류 해결 방법

Tomcat 컨테이너 내부에는 일반적으로 webapps (빈 폴더)와 webapps.dist (실제 파일 포함) 두 개의 폴더가 있습니다. 404 오류는 webapps 폴더에 파일이 없기 때문에 발생합니다.

임시 해결 방법:

# 컨테이너 내부 접속
docker exec -it 53724a20a48c /bin/bash

# webapps.dist의 파일을 webapps로 복사하고 webapps.dist 삭제
cp -r webapps.dist/* ./webapps
rm -rf webapps.dist

1.4.1 영구 해결 방법: 새로운 이미지 생성

위의 수정 사항을 포함한 새로운 이미지를 생성하여 이후에도 동일한 문제가 발생하지 않도록 합니다.

# docker commit 명령어로 새 이미지 생성
docker commit -m="404 오류 수정" -a="작성자" c7d6e86c9b8e mytomcat:8.5.82-jdk11-openjdk

참고 - 서버 시간 문제: 컨테이너의 시간대가 0시(UTC)로 설정되어 있어 동기화가 필요합니다.

# 컨테이너의 timezone 파일을 호스트로 복사
docker cp mytomcat:/etc/timezone /timezone

# timezone 파일 수정 (UTC를 UTC+8 또는 Asia/Seoul 등으로 변경)
# docker cp /timezone mytomcat:/etc/timezone
# docker restart mytomcat

2. 오프라인 배포

오프라인 환경에서는 미리 다운로드한 Docker 이미지를 tar 파일로 저장하여 사용합니다.

# 이미지를 tar 파일로 저장
docker save -o tomcat_image.tar tomcat:8.5.82-jdk11-openjdk

# tar 파일에서 이미지 로드
docker load -i tomcat_image.tar

태그: docker Tomcat 컨테이너 배포 WAR

7월 20일 23:35에 게시됨