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