IT/프로젝트 개발 중 발생한 에러

도커컴포즈 + 스프링부트 + nginx + mysql connection refused

은세고화 2022. 9. 26. 23:52
반응형

상황

프론트에서 백으로 요청 시 400 에러가 발생했다. Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

에러와 함께 Connection refused에러도 함께 발생했다.

 

시도해본 방법

spring.datasource.url=jdbc:mysql://mysql_chu:3303/chuanione?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul

mysql_chu는 도커컴포즈의 컨테이너 이름이다. 로컬에서 테스트할 땐 mysql_chu대신 서버 도메인 주소를 넣었고 저 자리에 다양한 값들을 넣어보고 도커컴포즈의 설정값도 변경해봤다.

 

같은 에러가 발생한다면 우선 mysql_chu에 서버 url을 넣어서 작동하는지 확인부터 하자. 나같은 경우에는 서버url을 넣으면 작동했다. 다만 이렇게 한다면 요청을 두 번 하기 때문에 올바른 방법은 아니다.

 

도커 컴포즈 설정

version: "3.7"

services:
  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./frontend/build:/usr/share/nginx/html
      - /var/nginx/log:/log
    container_name: nginx_chu
    depends_on:
      - spring-boot

  react:
    image: node:12-alpine
    command: sh -c "npm ci && npm run build"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./frontend:/app
    container_name: react_chu

  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: master
      MYSQL_DATABASE: chuanione
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: 1234
      TZ: Asia/Seoul
    volumes:
      - "./db_data:/var/lib/mysql"
    ports:
      - "3303:3306"
    container_name: mysql_chu


  spring-boot:
    build:
      context: ./backend/chuanione
      dockerfile: Dockerfile
    image: boot_chu
    ports:
      - "8080:8080"
    container_name: boot_chu
    restart: always
    depends_on:
      - db

 

도커컴포즈에서 network설정도 추가해봤지만 소용없었다.

 

해결

application.properties의 포트를 3306으로 변경하면 해결된다.

도커 컴포즈에서 설정한 MySql 포트는 아래와 같다. ports 3303:3306 여기서 3303은 외부에서 들어올 때 사용하는 포트고 3306은 도커 내부에서 사용할 때 쓰는 포트다. Spring boot의 application.properties는 외부에서 DB에 접속해야 하니 3303 포트를 사용할 줄 알았는데 아니었다. DB와 백엔드 모두 도커 내부끼리 공유되는 상황이어서 도커 내부에서 사용하는 포트인 3306을 적어야 했다.

 

 

문제를 해결하는데 정보가 굉장히 없었다. 원인을 분석해보니 특별한 문제가 없다면 ports 3306:3306을 사용하기에 포트 설정에서 문제가 발생할 확률이 작았을 것이다.

반응형