일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 편스토랑
- hackerrank
- 백준
- gs25
- 캐치카페
- 프로그래머스 파이썬
- AI 경진대회
- Baekjoon
- Real or Not? NLP with Disaster Tweets
- 프로그래머스
- programmers
- 우분투
- 데이콘
- Git
- 맥북
- 코로나19
- 금융문자분석경진대회
- PYTHON
- 자연어처리
- Docker
- SW Expert Academy
- Kaggle
- 편스토랑 우승상품
- ChatGPT
- leetcode
- 파이썬
- dacon
- 더현대서울 맛집
- github
- ubuntu
- Today
- Total
솜씨좋은장씨
[Docker] Apache Tomcat 8.5 에서 java war 파일 배포하는 방법! 본문
최근 업무를 하면서 협력사가 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
다시 올려주면 됩니다.
읽어주셔서 감사합니다.