IT/Docker

[Docker] Docker-Compose : LINUX + TOMCAT + JSP + MYSQL 세팅하기

월공 2021. 4. 27. 10:44
728x90
300x250

기나긴 삽질끝에 드디어 성공해서 올린다

그냥 php 처럼 편하게 , 장고처럼 편하게, 이미지 몇개 굴리고 compose 굴리면 가동될줄 알았던게

내 크나큰 착각이었다.

 

아무리 찾아봐도 내게 속시원하게 해결되는 포스팅은 몇없었고 ..

하다하다 못해 도커 때려치우고 윈도우에도 깔아보고, 리눅스에도 쌩으로 톰캣 서버 세팅하면서 우선 개념 정리를 좀했다 그러고나서 작동이 잘되는걸 확인한 후에 도커에도 똑같이 적용해보았더니 잘됐다

 

프로젝트 폴더 하나를 생성하고 거기 안에 구성은

docker-compose.yml

Dockerfile-tomcat

jdk-8u281-linux-x64.tar.gz

mysql-connector-java-8.0.24.jar

 

4개 파일이 있다

 

jdk-8u281-linux-x64.tar.gz 파일은 아래 링크에서 오라클 로그인 하고 받을수 있다

www.oracle.com/kr/java/technologies/javase/javase8u211-later-archive-downloads.html

mysql-connector-java-8.0.24.jar 파일은 용량 얼마 안하니 그냥 첨부한다

mysql-connector-java-8.0.24.jar
2.32MB

 

 

docker-compose.yml

version: "3.7"
services:
  db:
    image: mysql
    volumes:
    	#경로 마운트 로컬 <-> 도커
      - "./db/data:/var/lib/mysql"
    restart: always
    command: mysqld --default-authentication-plugin=mysql_native_password
    environment:
    #testDB 라는 데이터베이스를 만들고 root 비밀번호는 test
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: testDB
    ports:
    #포트포워딩 3307로 별도 생성
      - "3307:3307"
  tomcat:
    image: tomcat:latest
    environment:
      - "JAVA_OPTS=-Dspring.profiles.active=dev"
    build:
      context: .
      dockerfile: Dockerfile-tomcat
    ports:
      - "88:8080"
    volumes:
      #톰캣 마운트 로컬 <-> 도커
      - ./tomcat/webapps:/usr/local/tomcat/webapps
	#이 부분도 compose 한 파일에서 실행시키면 자동연결이 된다해서 굳이 필요없을거같은데 우선 같이 실행함
    links:
      - db
    restart: always

 

 

Dockerfile-tomcat

FROM tomcat:latest

RUN apt-get update && apt-get -y install \
    vim
    
RUN mkdir -p /usr/local/tomcat/webapps/ROOT/WEB-INF/lib

RUN touch /usr/local/tomcat/webapps/ROOT/index.html

사실 밑에 RUN 두줄은 별 의미없다 그냥 테스트삼아서 만든거라 .. 굳이 추가 안해도된다

vim 은 톰캣 컨테이너에서 수정할게 몇개 있어서 미리 깔아두게끔 조정했다.

 

docker exec -it db컨테이너 /bin/bash

######## DB 정상작동 확인시 ##########

# mysql -uroot -p
# test

접속 잘되면 끝
show databases;

를 치면 내역에 testDB 도 있는걸 확인할수있다.

 

정상적으로 컨테이너들이 생성되고나면

docker exec -it 톰캣컨테이너 /bin/bash

우선 진입해서  mkdir /usr/local/java 폴더를 만들고 컨테이너에서 나오고

 

로컬에 있는 jdk 파일을 방금 들어갔다 나온 톰캣컨테이너로 복사해준다

docker cp /var/www/html/프로젝트폴더/jdk-8u281-linux-x64.tar.gz 톰캣컨테이너:/usr/local/java/jdk-8u281-linux-x64.tar.gz

 

그러고 다시 진입해서 압축을 풀어준다

tar zxvf jdk-8u281-linux-x64.tar.gz

#혹시 압축이 정상적으로 풀리지않고 오류가 날경우 파일이 정말 정상적인 압축파일인지 확인할 필요가있다
#file 파일명 을 이용하면 해당 파일유형이 무엇인지 확인할수있다.
#내 경우에는 처음에 jdk 파일을 wget 으로 다운받아왔었는데
#gzip: stdin: not in gzip format
#tar: Child returned status 1
#위와 같은 오류가 지속적으로 발생했었다
#file (apt-get install -y file 설치 후) 로 확인을 해보니 html 파일로 들어가있어서 ㅡㅡ;
#오라클 사이트에 로그인 해야만 받을수있게끔 변환되서 정상적으로 파일을 다운 못받은거같다

이러고나면 다시 컨테이너에서 나와서 jar 파일도 옮겨준다

docker cp /var/www/html/프로젝트폴더/mysql-connector-java-8.0.24.jar 톰캣컨테이너:/usr/local/java/jdk1.8.0_281/lib/mysql-connector-java-8.0.24.jar

이러고 다시 톰캣 컨테이너로 진입해서 환경설정 부분을 아래와 같이 조정해준다.

#환경설정

vi /etc/profile


################################################

JAVA_HOME=/usr/local/java/jdk1.8.0_281
JRE_HOME=$JAVA_HOME/jre
CATALINA_HOME=/usr/local/tomcat
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar:%JAVA_HOME%/lib/mysql-connector-java-8.0.24.jar
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH CATALINA_HOME

#################################################


source /etc/profile

 

echo 찍었을때 위와같이 잘 나오면 정상적으로 세팅이 완료된거다

 

세팅 마지막으로 jar 파일 /usr/local/java/jdk1.8.0_281/lib/mysql-connector-java-8.0.24.jar

에 들어가있는 파일을 "/usr/local/tomcat/lib" 파일에도 옮겨줘야한다

cp /usr/local/java/jdk1.8.0_281/lib/mysql-connector-java-8.0.24.jar /usr/local/tomcat/lib/mysql-connector-java-8.0.24.jar

 

이러고나서 이제 드디어 DB 연동 테스트를 해보면

"/usr/local/tomcat/webapps/ROOT" 경로에 index.jsp 파일을 하나 만들어서

 

아래와 같이 쳐주고 실행해보면 끝

<%@ page import="java.sql.*" contentType="text/html;charset=utf-8"%>
<%

        String DB_URL = "jdbc:mysql://172.23.0.3/testDB";
        String DB_USER = "root";
        String DB_PASSWORD= "test";

        ResultSet rs = null;
        Connection conn;
        Statement stmt;

         try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
            stmt = conn.createStatement();

            // conn.close();

            out.println("MySQL Connection Success!");   
            
         }catch(Exception e){
              out.println(e);
         }
%>

 

 

 

ClassNotFound 뭐시기 에러 뜨는건 jar 파일이 정상적으로 톰캣과 jdk 폴더에 제대로 안들어가있어서 나오는 에러이니 잘 확인해보시기 바란다

 

중간에 컨테이너 왔다갔다 하는 부분은 dockerfile 이나 compose 에서 자동화 시킬수있는 부분인거같아 조금더 이런저런 실험을 해보려고한다

여튼 연동은 이상없이 됐으니 어우 .. jsp 세팅 토나온다

728x90
300x250