-
[docker] docker compose로 nestJS, postgresql, redis 서버 띄우기docker 2024. 12. 7. 21:09
docker compose로 nestJS, postgresql, redis 서버 띄우기
.dockerignore
/dist /node_modules /build .env
dockerfile
FROM node WORKDIR /app COPY . . RUN npm ci RUN npm run build EXPOSE 3000 ENTRYPOINT ["node","dist/src/main.js"]
compose.yml
services: backend-server: build: . ports: - 3000:3000 postgres-db: image: postgres environment: POSTGRES_PASSWORD: password123 volumes: - /Users/kiju/dev/study_data/docker-volume/postgres_data:/var/lib/postgresql/data ports: - 5432:5432 redis: image: redis ports: - 6379:6379
build : 빌드해서 이미지를 만들 도커파일의 위치. (compose파일 기준 현재위치이므로 .)
도커컴포즈 실행docker compose up -d --build
을 해보면 컨테이너들이 정상적으로 실행되지않는다.
도커 컴포즈로 컨테이너들이 정상적으로 실행되지 않는 이유
nestJS서버는 켜지면서 db연결이 시행되기때문에 psql과 redis의 db서버가 먼저 실행되고 난뒤에야 실행되어야한다.
만약 db서버보다 nestJS서버가 먼저 켜진다면 db연결과정에서 에러가나고 nestJS 서버 컨테이너는 실행되지않는다.따라서 compose.yml 파일을 수정하여 db서버가 먼저 실행되고 nestJS서버가 실행되도록 설정해야한다.
compose파일을 수정해서 db서버가 실행되고 nestJS서버가 실행되도록 설정하기
compose.yml
services: backend-server: build: . ports: - 3000:3000 depends_on: postgres-db: // 이 서비스가 필요함 condition: service_healthy // 이 서비스가 건강상태일때 시작 redis: condition: service_healthy postgres-db: image: postgres environment: POSTGRES_PASSWORD: password123 volumes: - /Users/kiju/dev/study_data/docker-volume/postgres_data:/var/lib/postgresql/data ports: - 5432:5432 healthcheck: test: ['CMD', 'pg_isready'] // 데이터베이스 있는지 확인하는 명령어 interval: 5s // 체크주기 retries: 10 // 실패 시 재시도 횟수 redis: image: redis ports: - 6379:6379 healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 5s retries: 10
추가된 부분
depends_on: postgres-db: // 이 서비스가 필요함 condition: service_healthy // 이 서비스가 건강상태일때 시작 redis: condition: service_healthy healthcheck: test: ['CMD', 'pg_isready'] // psql db가 healthy한지 확인할 수 있는 명령어 interval: 5s // 체크주기 retries: 10 // 실패 시 재시도 횟수 healthcheck: test: ['CMD', 'redis-cli', 'ping'] // redis db가 healthy한지 확인할 수 있는 명령어 interval: 5s retries: 10
compose.yml을 수정한 결과 DB 컨테이너가 먼저 실행되고 nestJS 서버 컨테이너가 실행될 수 있게 되었다.
하지만 이렇게 해도 도커 컴포즈를 실행하면 아직도 db에 연결되지 않아 에러가 발생한다.
도커 컴포즈에서 컨테이너 의존성 문제를 해결해도 컨테이너들이 정상적으로 실행되지 않는 이유
-> 별도의 분리된 컨테이너 환경에서 실행됨으로써 기존의 db연결 주소가 부정확해졌기 때문이다.
각각의 컨테이너는 별도의 IP와 port번호를 가지고 있다. 호스트 컴퓨터에서의 localhost는 호스트 컴퓨터를 가리키지만, nestJS 컨테이너에서의 localhost는 nestJS 컨테이너를 가리킨다. 따라서 nestJS 컨테이너의 5432번 포트에는 아무것도 실행되지 않고 있기 때문에 db서버와 연결이 되지 않는다. 호스트 컴퓨터로 돌아가 5432 포트에서 실행되는 프로그램을 찾아야한다.
어떻게 nestJS 컨테이너에서 다른 컨테이너인 postgres 서버를 찾을까?
-> docker compose에서 정의한 서비스 이름으로 서로 통신할 수 있다.
기존의 compose.yml에서 postgre와 redis 서비스명을 각각 postgres-db, redis로 지정해주었다.
이를 localhost에서 postgres-db, redis로 각각 바꿔주면 된다.
.env파일 (postgres db 설정)
변경전
DATABASE_URL=postgres://kiju:1234@localhost:5432/today_review
변경후
DATABASE_URL=postgres://kiju:1234@postgres-db:5432/today_review
nestJS app.module (redis 설정)
변경전
변경후
결과
도커 컴포즈를 통해 nestJS, postgresDB, redis를 각각 컨테이너로 띄우기 위해서
- DB서버 컨테이너들을 먼저 먼저 실행한뒤에 nestJS 컨테이너를 실행해주었고,
- nestJS 컨테이너에서 DB연결시 nestJS 컨테이너 주소가 아닌 db 컨테이너주소로 연결해주었다.
그 결과 성공적으로 프로젝트를 각각의 독립된 컨테이너 환경에서 실행할 수 있었다.
'docker' 카테고리의 다른 글
[AWS] AWS ECR을 활용해서 EC2에서 도커로 배포하기-1 (1) 2024.12.08 [docker] docker compose 로 mysql 서버 띄우기 (0) 2024.12.07 [docker] docker로 nestJS 서버띄워보기 (0) 2024.12.07 [docker] 도커파일 만들기1 (0) 2024.12.07 [docker] docker volume으로 mysql 서버띄우기 (0) 2024.12.06