Docker 설정하기 [Spring(Tomcat) + React + MySQL]

5tr1ker·2022년 10월 5일

Docker-compose 로 설정하기

war 패키지이기 때문에 mvn package를 통해 빌드하면 문제가 생깁니다.
하단에 방법을 통해 war 패키지를 빌드합니다.

프로젝트 우클릭 -> Export -> War File -> 옵션 선택 Export source file / Overwrite existing file -> Finish

이미지 파일 만들기

docker pull tomcat:9.0.64

위의 명령어로 톰켓 이미지를 생성합니다.

docker pull mysql:8.0.29

mysql의 이미지 파일을 만듭니다.
버전을 다르게 하고 싶으면 뒤에 버전을 수정하면 됩니다.

docker-compose.yml 파일

version: "3.7"
services:
    db:
      container_name: myStoryMysql
      image: mysql:8.0.29
      restart: always
      command: mysqld --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: myStory
      ports:
        - '3306:3306'
    web:
      container_name: tomcatServer
      restart: always
      environment:
      - "JAVA_OPTS=--add-opens java.base/java.lang.invoke=ALL-UNNAMED"
      # environment를 통해 ALL-UNNAMED 오류를 해결
      links:
        - db
        # DB와 연동
      image: tomcat:9.0.64
      volumes:
        - ./ROOT.war:/usr/local/tomcat/webapps/ROOT.war
        # war 로 배포한 파일을 webapps/ 폴더에 삽입
        - ./tomcat/webapps:/usr/local/tomcat/webapps
      ports:
        - '8080:8080'
    client:
      restart: always
      container_name: client
      links:
        - web
      build:
        context: .
        dockerfile: Dockerfile
      volumes:
        - ".:/app"
        - "/app/node_modules"
      ports:
        - "3000:3000"
      environment:
        - NODE_ENV=development
      stdin_open: true
      tty: true 

React Dockerfile 설정

React 어플리케이션이기에 따로 설정이 필요하여 Dockerfile로 설정했습니다.

Dockerfile 파일

FROM node:16.14.0 
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json /app/package.json
RUN npm install -g npm@8.19.2 
RUN npm i react react-dom --legacy-peer-deps
RUN npm install react-scripts@5.0.1 -g npm@8.19.2
RUN npm install axios --legacy-peer-deps
CMD ["npm", "start"]

FROM node:16.14.0 // 컨테이너에 설치할 환경을 설정합니다.
WORKDIR /app // 컨테이너에 작업할 공간을 설정합니다.
ENV PATH /app/node_modules/.bin:$PATH // 환경설정 파일을 설정합니다.
COPY package.json /app/package.json // 해당 json 파일을 복사해 넣습니다.
RUN ... // 컨테이너에 추가로 설치할 파일을 설정합니다.
CMD ["npm", "start"] // 해당 명령어를 통해 서비스를 시작합니다.

최종 컴파일

설정이 완료됐으면 docker-compose up -d --build 명령어를 통해서 이미지파일을 빌드하고 동시에 컨테이너에 등록합니다.

MySQL 접근

docker exec -it mysql-container bash

해당 명령어를 사용하고 나서 밑의 코드를 작성하세요.

mysql -u root -p // password 입력

주의사항

작성된 코드를 그대로 가져다 쓰면 연동이 되지 않을 수 있습니다.
이때 Spring에서 서버 DB 주소 -> dbcontainer 이름으로 설정하고
React 의 package.jsproxy 항목은 -> 서버 주소 ( docker inspect 톰캣서버 로 ip address 추출 ) 로 설정해줘야 합니다.

Docker 설정시 마주친 오류

Mysql 오류

SELECT list is not in GROUP BY clause and contains nonaggregated column 'testdevnew.f.created_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

전체 오류내용은 이렇습니다. Mysql이 5.7 버전이 넘어가면서 발생한 오류로 일시적으로 해결하려면 SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; sql 문을 사용하거나
영구적으로 해결하려면 Docker 파일내의 /etc/my.cnf 파일 하단부에 있는 [mysqld] 태그 밑에 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 문장을 추가해 주면 됩니다.

Spring 오류

POST 요청 시 403 forbidden

POST /주소/ forbidden 403

react package.js 의 proxy 항목을 ( docker inspect 에서 ip 로 ) 설정해주셔야합니다.

java.net.ConnectException: Connection refused

Spring 서버에 mysql connection 주소 부분이 잘못됐을 때 나타납니다.
이때 서버에 mysql ip가 잘 연결되어 있는지 ( 이때 ip는 mysql 컨테이너 이름 ) 확인해 주세요. 잘 연결되어 있다면 컨테이너 삭제후 docker-compose.yml 파일을 다시 실행시켜주세요.

profile
https://github.com/5tr1ker

0개의 댓글