<오류 상황>
vscode에서 docker-compose build -> docker-compose up 명령어를 순서대로 입력하고 실행을 했는데 위와같이 db 연결이 지연되며 db 연결이 안되는 오류가 계속 되었다
<해결 과정>
1. 일단 docker-compose.yaml 파일에 빠진 내용이 있는지 확인을 해보았다.
보니까 env.docker 파일을 작성해놓고 연결을 안해놓은걸 확인하여 아래 코드를 입력하였다.
하지만 이 이유는 아닌듯 했다.
env_file:
- ./.env.docker
아래 메세지가 계속 빨갛게 나오길래 구글검색을 해보니 포트를 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
그런 과정에서 mysql을 잘못 건드려 삭제하고 재설치...
혹시 몰라 로컬이 아닌 aws rds로 디비를 연결해보았는데 이건 잘 작동을 하였다.
그럼 도커 파일 설정 등의 문제는 아닌건데!
무슨일이 일어나고 있는건지 도커 로그를 확인해보았다 ($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.
뭐지???? 결국에 경험 많으신 개발자분의 도움을 얻어 해결하게 되었는데
원인은 도커가 실행되면서 디비가 설치되는 시간과 서버가 실행되는 순서가 맞지 않아 디비가 정상적으로 연결되지 못했다는 내용이었다.
-> 즉, 도커로 실행할 백엔드 서비스가 데이터베이스가 먼저 실행되어야 정상적으로 작동할 수가 있는데 지금의 경우 백엔드 서비스가 먼저 실행되면서 정상작동이 안되어 서버가 제대로 구동하지 않고 그 결과로 데이터베이스 연결도 제대로 되지 않았던 것이다.
-> 아래는 기존 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
이 오류를 통해 도커를 실행할 때 각 서비스들의 시작 순서를 잘 고려해야한다는 것을 배웠다.
해결하는 과정은 힘들었지만 이 경험으로서 더 많은 상황을 고려할 수 있는 개발자가 될 수 있겠다는 생각에 뿌듯했다.