
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의 이미지 파일을 만듭니다.
버전을 다르게 하고 싶으면 뒤에 버전을 수정하면 됩니다.
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로 설정했습니다.
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 명령어를 통해서 이미지파일을 빌드하고 동시에 컨테이너에 등록합니다.
docker exec -it mysql-container bash
해당 명령어를 사용하고 나서 밑의 코드를 작성하세요.
mysql -u root -p // password 입력
작성된 코드를 그대로 가져다 쓰면 연동이 되지 않을 수 있습니다.
이때 Spring에서 서버 DB 주소 -> dbcontainer 이름으로 설정하고
React 의 package.js 의 proxy 항목은 -> 서버 주소 ( docker inspect 톰캣서버 로 ip address 추출 ) 로 설정해줘야 합니다.
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 문장을 추가해 주면 됩니다.
POST /주소/ forbidden 403
react package.js 의 proxy 항목을 ( docker inspect 에서 ip 로 ) 설정해주셔야합니다.
Spring 서버에 mysql connection 주소 부분이 잘못됐을 때 나타납니다.
이때 서버에 mysql ip가 잘 연결되어 있는지 ( 이때 ip는 mysql 컨테이너 이름 ) 확인해 주세요. 잘 연결되어 있다면 컨테이너 삭제후 docker-compose.yml 파일을 다시 실행시켜주세요.