관리 메뉴

솜씨좋은장씨

[Docker] Apache Tomcat 8.5 에서 java war 파일 배포하는 방법! 본문

Programming/Docker

[Docker] Apache Tomcat 8.5 에서 java war 파일 배포하는 방법!

솜씨좋은장씨 2022. 9. 16. 00:03
728x90
반응형

최근 업무를 하면서 협력사가 java로 개발한 war 파일을 Docker 환경에서 배포 해야할 일이 있었습니다.

 

평소에 Python 을 사용하여 개발하고

Docker linux 환경에 Python 으로 개발한 API 를 배포하는 식으로 만 개발을 해왔다보니

초반에 삽질을 많이 하였지만 끝까지 해보고나니 

 

생각보다 아주아주아주 쉬웠습니다.

 

배포 방법을 테스트하는데에는

인터넷에서 다운로드 받은 SampleWebApp.war 파일을 활용하여 테스트를 진행하였습니다.

🧐 Dockerfile 작성

$ vi Dockerfile

Dockerfile

FROM tomcat:8.5.46-jdk8-openjdk

RUN apt-get update
RUN apt-get install -y tzdata
ENV TZ=Asia/Seoul


CMD ["catalina.sh", "run"]

빈 디렉토리에 위 내용을 담은 Dockerfile을 작성합니다.

esc + :wq

🧐 Docker 이미지 빌드하기

$ docker build -t {{이미지명}}:{{태그}} .

Dockerfile 파일이 있는 위치에서 위의 명령어로 Docker 이미지를 빌드합니다.

 

만약 

이미지명을 test_war 로 하고 태그명을 ver-0.01 로 정했다고 한다면

$ docker build -t test_war:ver-0.01 .

위와 같이 명령어를 입력해야합니다.

🧐 Docker 이미지가 잘 build 되었는지 확인하기

$ docker images

docker images 명령어를 활용하여 방금 빌드한 이미지가 제대로 만들어졌는지 확인합니다.

REPOSITORY     TAG                   IMAGE ID       CREATED         SIZE
test_war       ver-0.01              ba23cb04fae2   3 seconds ago   512MB

잘 만들어졌다면 위와 같이 출력됩니다.

 

여기까지 하면 Apache Tomcat 8.5 기반 베이스 이미지가 완성됩니다.

🧐 war 파일을 모아 둘 webapp 디렉토리 만들기 

$ mkdir webapp

Apache Tomcat 8.5 기반 베이스 이미지를 만들었다면 배포할 war 파일을 담아 둘 webapp 디렉토리를 만들어 둡니다.

🧐 docker-compose.yml 파일 작성하기

- war 파일을 볼륨 마운트로 관리한다는 것을 가정으로 함

$ vi docker-compose.yml
version: '3.4'

services:
  서비스명:
    container_name: 컨테이너명
    image: 이미지명:태그
    environment: # 환경 변수 값
      - TZ=Asia/Seoul
    volumes: # 볼륨 마운트
      - war 경로/{{war 파일 명}}.war:/usr/local/tomcat/webapps/{{war 파일 명}}.war
    ports:
      - "외부 접근 포트:8080"

Example )

구분 구분
서비스명 test_war_release_test 컨테이너명 test-war-release
이미지명 test_war 태그명 ver-0.01
war 경로 /app/test/war_release/webapp war 파일 명 SampleWebApp
외부 접근 포트 18081    
version: '3.4'

services:
  test_war_release_test:
    container_name: test-war-release
    image: test_war:ver-0.01
    environment:
      - TZ=Asia/Seoul
    volumes:
      - /app/test/war_release/webapp/SampleWebApp.war:/usr/local/tomcat/webapps/SampleWebApp.war
    network_mode: "host"

각 값을 알맞은 위치에 넣어 작성한 뒤 저장합니다.

🚀 작성 시 신경 써주어야 할 사항 - volume 마운트 )

여기서 신경써야할 부분은 webapp 디렉토리에 여러개의 war 파일이 있다고 해서

volumes 부분에 webapp 을 한번에 마운트 하면 안된다는 점입니다.

 

webapp 부분을 한번에 마운트하게 되면

기존에 Docker 내부 /usr/local/tomcat/webapps 안에 있던 파일들이 사라지게 되고 제대로 동작을 하지 않았습니다.

volumes:
  - {{경로}}/webapp/{{war파일1}}.war:/usr/local/tomcat/webapps/{{war파일1}}.war
  - {{경로}}/webapp/{{war파일2}}.war:/usr/local/tomcat/webapps/{{war파일2}}.war
  - {{경로}}/webapp/{{war파일3}}.war:/usr/local/tomcat/webapps/{{war파일3}}.war

따라서 배포해야하는 war 파일이 여러개 존재한다고하면 조금 번거롭더라도 위와 같이 작성해주셔야합니다.

🧐 Docker 컨테이너 실행

$ docker-compose up -d

위 명령어로 실행 해주면 됩니다.

$ docker-compose logs -f

위 명령어로 실행 했을때 별다른 에러 로그가 없는지 확인합니다.

🚀 사용 port 번호 변경

위와 같이 올리게 되면

tomcat 기본 이미지를 사용하였기 때문에 내부 포트 / 외부 접근 포트 모두 8080번 포트로 설정됩니다.

이를 내가 원하는 포트 ( 18081번 포트 ) 로 변경하고자 한다면 

/usr/local/tomcat/conf 위치의 server.xml 을 수정해야합니다.

 

저는 docker cp 로 파일을 먼저 docker 밖으로 꺼내어 수정하고

수정한 파일을 적용하기위하여 이를 docker volume 에 설정하는 식으로 적용하였습니다.

$ docker cp test-war-release:/usr/local/tomcat/conf/server.xml .

위 명령어를 활용하여 docker 컨테이너 내부에서 server.xml 을 로컬로 복사해왔습니다.

$ vi server.xml

vi 로 server.xml 을 연뒤

# 기존
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

# 변경
<Connector port="18081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

위와 같이 변경하면 됩니다.

esc + :wq

맞추어 잘 작성하였다면 저장합니다.

🚀 docker-compose volume 마운트 설정 추가

변경한 server.xml 파일을 적용하기 위해서 server.xml 파일을 마운트 해줍니다.

volumes:
  - {{경로}}/webapp/{{war파일1}}.war:/usr/local/tomcat/webapps/{{war파일1}}.war
  - {{경로}}/webapp/{{war파일2}}.war:/usr/local/tomcat/webapps/{{war파일2}}.war
  - {{경로}}/webapp/{{war파일3}}.war:/usr/local/tomcat/webapps/{{war파일3}}.war
  - {{경로}}/conf/server.xml:/usr/local/tomcat/conf/server.xml # 추가
esc + :wq

맞추어 잘 작성하였다면 저장합니다.

🧐 Docker 컨테이너 재실행

$ docker-compose down
$ docker-compose up -d

위 명령어로 재실행 해주면 됩니다.

$ docker-compose logs -f

위 명령어로 실행 했을때 별다른 에러 로그가 없는지 확인합니다.

🧐 제대로 올라갔는지 확인하기

http://{{ip주소}}:18081/SampleWebApp

크롬 브라우저를 열고 위 URL 을 입력하였을때

위와 같이 나온다고 하면 정상적으로 배포가 된 것 입니다.

🧐 war 파일을 수정하고 다시 올리기

만약 war 를 교체하고 싶다고 한다면 

$ docker-compose down

위 명령어로 Container를 내려준 다음

 

war 파일을 교체하고 만약 이름이 바뀌었다면 docker-compose.yml 에서도 volumes 부분도 수정 한 뒤

$ docker-compose up -d

다시 올려주면 됩니다.

 

읽어주셔서 감사합니다.

 

 

Comments