기존에 돌아가고있는 톰캣 서버가 있는데 jar 파일도 여러개있고 이것저것 함수 쓰이는게 많아서
환경을 어떻게 구성해줘야하나 .. 고민하다가 결국 성공했는데 핵심은 jar 파일이었다.
jar파일 그대로 옮겨주고 context.xml 에 DB 정보 수정해주고, 에러는 톰캣컨테이너 로그를 찍어보면서 해결했다.
뭐.. 말이 쉽지 맨땅에 헤딩하기가 좀 힘들긴했다 --;
기존에 Docker 환경에서 구성한 톰캣에서는 vi /etc/source 환경설정도 수정하고 jdk 파일도 옮겨서 하고 뭐 그랫었는데 이번에는 굳이 그렇게까진 안했고 기존 톰캣 도커이미지에서 기본으로 세팅되어있는 openJdk-11 을 이용하였다.
그리고 그땐 docker cp 하면서 노가다를 좀 많이 뛰었는데 그럴 필요없이 그냥 도커 마운트만 지정 잘해주면 굳이 그렇게까지 할 필요도없었다.
여튼 기존 톰캣 서버의 버전이 5에다가 , mariadb 버전도 5 였고
도커 톰캣 버전은 최신에다가 , maraidb 버전은 10 점대여서 문제가 될수있는게 있지않을까 했는데
톰캣의 버전다름 이슈는 docker log 를 찍어보니 javax.naming.NamingException: Could not load resource factory class 라는 에러가 떠서 찾아보고,
context.xml 에서 factory 부분에 tomcat.dbcp.dbcp2 라고 붙여주니 해결되었고 db는 별다른 문제는 없었다.
로컬 디렉토리 구성은 아래와같고 주요폴더만 정리하자면
.vscode = sftp remote 설정
db 폴더 (마운트)
- db 컨테이너 생성시 실행될 쿼리문 혹은 dump 파일 보관
- /db/data 폴더를 DB컨테이너의 /var/lib/mysql 로 마운트
- /db/dump 폴더를 DB컨테이너의 /disk 로 마운트
- /db/initdb.d 안에 sql 파일을 놓으면 알아서 실행된다.
lib 폴더 (마운트)
- 톰캣 컨테이너에서 사용할 jar 파일들
tomcat/webapps_crm/ROOT
- 웹페이지 파일 보관
jdk-8u281 은 혹시 몰라서 보관했는데 톰캣 컨테이너 가동시 같이 들어있는 openjdk-11 버전을 사용해서 이번엔 필요가없었다.
mysql-connector-java-8.0.24.jar 도 혹시 필요할까 싶어서 그냥 냅뒀는데 추후에 docker cp 로 옮겨서 웹페이지단 WEB-INF 와 톰캣 lib 에 옮겨주니 DB연동이 잘되었다
docker-compose.yml
version: "3.7"
services:
db:
image: mariadb:10
volumes:
#마운트 작업 로컬 <-> 도커 컨테이너
- "./db/data:/var/lib/mysql"
- "./db/dump:/disk"
- "./db/initdb.d:/docker-entrypoint-initdb.d"
environment:
TZ: Asia/Seoul
MYSQL_ROOT_PASSWORD: Root 비밀번호 설정
MYSQL_DATABASE: 생성하고싶은 DB명
ports:
#포트포워딩 할 포트 설정
- "3308:3306"
restart: always
tomcat:
image: tomcat:latest
environment:
- "JAVA_OPTS=-Dspring.profiles.active=dev"
build:
context: .
#참조할 도커파일 명시
dockerfile: Dockerfile-tomcat
ports:
#포트포워딩 할 포트 설정
- "83:8080"
volumes:
#마운트 작업 로컬 <-> 도커 컨테이너
- ./lib/tomcat.shared.lib/:/usr/local/tomcat/shared/lib/
- ./lib/tomcat.server.lib/:/usr/local/tomcat/server/lib/
- ./lib/tomcat.webapps_crm.WEB-INF.lib/:/usr/local/tomcat/webapps_crm/ROOT/WEB-INF/lib/
- ./tomcat/webapps_crm/ROOT/:/usr/local/tomcat/webapps_crm/ROOT/
links:
- db
restart: always
Dockerfile-tomcat
FROM tomcat:latest
RUN apt-get update && apt-get -y install vim
# docker-compose 에서 톰캣 부분이 실행될때 아래 경로를 미리 만들어준다.
RUN mkdir -p /usr/local/tomcat/shared/lib
RUN mkdir -p /usr/local/tomcat/server/lib
터미널에서 로컬 디렉토리 접근 후
docker-compose 실행 (백그라운드)
docker-compose up -d
docker 버전과 docker-compose 의 버전이 이상이없다면 정상적으로 실행된다.
여튼 실행하게되면 마운트도 정상적으로 되었고 톰캣 컨테이너에서도 jar 파일을 정상적으로 쓸수있는걸 확인하는데
이걸 그냥 옮겨줬다고 다 되는게 아니라 경로 설정을 해줘야했다.
vi /usr/local/tomcat/conf/catalina.properties
#내용 추가
server.loader=${catalina.home}/server/classes,${catalina.home}/server/lib/*.jar
#내용 추가
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
그리고 기본으로 webapps 를 향하고있는데 해당 부분도 webapps_crm 으로 조정
vi /usr/local/tomcat/conf/server.xml
# webapps -> webapps_crm
그리고 context.xml 에 DB 접속정보 선언
* 위에서도 언급했지만 톰캣 버전이 8 이후부터는 factory 부분이 dbcp 가 아니라 dbcp2 라고 한다.
vi /usr/local/tomcat/conf/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Resource name="jdbc/sms_db"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
url="jdbc:mysql://DB컨테이너 IP 주소:3306/DB명"
username="DB유저명"
password="비밀번호"
maxActive="20"
maxIdle="3"
maxWait="-1"
removeAbandoned="true"/>
</Context>
이렇게 세팅해주고나서도 DB 연결이 안되는 문제가 있어서 에러확인은 도커 로그 실시간으로 찍어보면 다나온다
docker logs -f 컨테이너명
docker cp /로컬/mysql-connector-java-8.0.24.jar 파일복사해서 가져가고싶은 컨테이너명:/usr/local/openjdk-11/lib/mysql-connector-java-8.0.24.jar
파일을 각각 옮겨주고 톰캣 컨테이너 재시작 해주니 정상적으로 가동되었다.
우선 톰캣 컨테이너에서만 이렇게 세팅을 해줬고 나머지 DB 컨테이너에서도 당연히 마운트해서 가져온 dump 파일을
DB에 불러오기를 해야했었고 (불러올때 table *** read only 라는 문제가 있어서 그냥 DB 컨테이너 재시작하니까 문제는 사라졌다), 사용자 생성 및 grant 옵션 부여 등 기본 작업을 해주었다.
기존 톰캣 서버를 내가 세팅한것도 아니고 입사하기도 전 부터 있던 jsp 톰캣 서버라서 DB 연결부터 쿼리사용까지 다 함수로 짜져있어서 jar 파일에 들어가있던데 그 부분을 분석하면서 새로운 도커 환경에서 돌아가게끔 조정하는게 조금 골때렸으나 결국 성공해서 다행이다.
jar 파일을 그대로 옮겨주는게 핵심이었고, 사실 이 포스팅이 내 기억하기쉽게 너무 횡설수설 한 면도 없지않아있어 다른분들에겐 도움되긴 힘들수도 있겟지만 여튼 기록해둔다 -_-; ㅋㅋ
docker-compose 와 톰캣세팅 에 대해 한층 더 이해를 할수있게된 계기가 되었다.
'IT > Docker' 카테고리의 다른 글
[Docker] 윈도우10 에서 도커 설치하기 (BIOS Setting , Hyper-V) (0) | 2022.05.01 |
---|---|
[Docker] Docker-compose 에서 .env 파일 사용 (0) | 2021.09.03 |
[Docker] docker-compose 에러 Version in "./docker-compose.yml" is unsupported (0) | 2021.07.02 |
[Docker] Docker-compose 실행시 build 오류 (2) | 2021.06.09 |
[Docker] 도커 이용 mariadb 세팅 관련 메모 (0) | 2021.06.09 |