IT/Docker

[Docker] docker-compose 이용한 mariadb + tomcat 서버 세팅 추가정리

월공 2021. 7. 14. 11:11
728x90
300x250

기존에 돌아가고있는 톰캣 서버가 있는데 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 와 톰캣세팅 에 대해 한층 더 이해를 할수있게된 계기가 되었다.

728x90
300x250