[TIL_2023.12 .20] Nest.JS - 도커 사용하면서 오류 해결내용

김효진·2023년 12월 21일
0

<오류 상황>

vscode에서 docker-compose build -> docker-compose up 명령어를 순서대로 입력하고 실행을 했는데 위와같이 db 연결이 지연되며 db 연결이 안되는 오류가 계속 되었다

<해결 과정>
1. 일단 docker-compose.yaml 파일에 빠진 내용이 있는지 확인을 해보았다.
보니까 env.docker 파일을 작성해놓고 연결을 안해놓은걸 확인하여 아래 코드를 입력하였다.
하지만 이 이유는 아닌듯 했다.

    env_file:
      - ./.env.docker
  1. 아래 메세지가 계속 빨갛게 나오길래 구글검색을 해보니 포트를 3307로 바꿔서 해봐라,
    host를 localhost가 아닌 DB_HOST=host.docker.internal 또는
    #172.17.0.1로 바꿨더니 해결되었다 등의 글이 있어서 다 시도해보았는데 오류는 똑같았다.

    my-database-1 | 2023-12-21T10:57:21.515635Z 1 [System][MY-013577] [InnoDB] InnoDB initialization has ended.
    ‹my-backend-1 | [Nest] 42 - 12/21/2023, 10:57:23 AM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (3)...
    my-backend-1 | Error: connect ECONNREFUSED 172.20.0.2:3306

  2. 그런 과정에서 mysql을 잘못 건드려 삭제하고 재설치...

  3. 혹시 몰라 로컬이 아닌 aws rds로 디비를 연결해보았는데 이건 잘 작동을 하였다.
    그럼 도커 파일 설정 등의 문제는 아닌건데!

  4. 무슨일이 일어나고 있는건지 도커 로그를 확인해보았다 ($docker logs 컨테이너아이디)
    근데 중간에 디비가 생성되었다는 로그가 확인되었다.
    2023-12-21 10:58:04+00:00 [Note][Entrypoint]: Creating database nestProject-docker
    그리고 아래에 보면 서버도 연결이 되었다는 로그가 확인된다
    /usr/sbin/mysqld: ready for connections. Version: '8.2.0' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
    뭐지???? 결국에 경험 많으신 개발자분의 도움을 얻어 해결하게 되었는데
    원인은 도커가 실행되면서 디비가 설치되는 시간과 서버가 실행되는 순서가 맞지 않아 디비가 정상적으로 연결되지 못했다는 내용이었다.

-> 즉, 도커로 실행할 백엔드 서비스가 데이터베이스가 먼저 실행되어야 정상적으로 작동할 수가 있는데 지금의 경우 백엔드 서비스가 먼저 실행되면서 정상작동이 안되어 서버가 제대로 구동하지 않고 그 결과로 데이터베이스 연결도 제대로 되지 않았던 것이다.

  1. 그래서 docker depends_on 이라는 옵션을 사용하여 데이터베이스가 먼저 실행된 후에 백엔드서비스가 실행되도록 설정을 해주었더니 로그도 정상적으로 잘 뜨고 데이터베이스도 연결된 것이 잘 확인되었다.

-> 아래는 기존 yaml 파일

// docker-compose.yaml
version: '3.7'

services:
  my-backend:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./src:/myfolder/src
    ports:
      - 3000:3000
    env_file:
      - ./.env.docker

  my-database:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: 'nestProject-docker'
      MYSQL_ROOT_PASSWORD: '@gywls4646'
    ports:
      - 3306:3306

-> 아래는 데이터베이스와 백엔드서비스의 종속성을 설정한 yaml 파일

version: '3.7'

services:
  # 컴퓨터이름
  my-backend:
    depends_on: // 추가한 부분
      - my-database // 추가한 부분
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./src:/myfolder/src
    # 포트포워딩
    ports:
      - 3000:3000
    env_file:
      - ./.env.docker

  # 컴퓨터이름
  my-database:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: 'nestProject-docker'
      MYSQL_ROOT_PASSWORD: '@gywls4646'
    ports:
      - 3306:3306

이 오류를 통해 도커를 실행할 때 각 서비스들의 시작 순서를 잘 고려해야한다는 것을 배웠다.
해결하는 과정은 힘들었지만 이 경험으로서 더 많은 상황을 고려할 수 있는 개발자가 될 수 있겠다는 생각에 뿌듯했다.

profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!

0개의 댓글