docker-compose-with-mongo

docker-compose-with-mongo

카테고리
Docker
날짜
2024년 06월 12일
작성자
JeongjungsikJeongjungsik
태그

도커 두개 설치

도커 컨테이너 안에서 몽고DB를 설치해서 작업이 가능하다.
그러기 위해선 도커를 두캐 실행해야 한다.
 
  • 하나는 express 도커 컨테이너
(경로 backend/Dockerfile)
FROM node:14 COPY ./package.json /myfolder/ COPY ./yarn.lock /myfolder/ # 커서 위치 /myfolder 뒤로 변경 WORKDIR /myfolder/ RUN yarn install COPY . /myfolder/ CMD yarn dev
 
  • 또 하나는 mongo를 실행시켜주는 도커 컨테이너
(경로 backend/Dockerfile.mongo)
# 몽고디비 5버전 다운, 자동으로 실행 명령어가있어서 자동으로 실행됌 FROM mongo:5
 

두개의 도커 컨테이너를 한번에 실행하기

터미널 하나당 다음 명령어를 입력해주면 도커 컨테이너 두개를 실행 할 수 있다.
docker build . docker run 이미지ID
한번의 명령어로 도커 컨테이너 두개 이상 실행하는 방법을 알아보자.
 
 

도커 그륩화 (compose)

docker-compose.yaml 파일에 다음을 적어주자
version: "3.7" # 컴퓨터들 services: # 컴퓨터 이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터 이름 my-database: build: context: . dockerfile: Dockerfile.mongo ports: - 27017:27017

참고사항

  • 버전은 보통 3.7 혹은 3.9를 많이 사용한다.
  • context 는 경로를 의미함
    • . 이라고 작성해줬으니 현재 docker-compose.yaml 이 작성된 현재 경로에서 Dockerfile이라는 파일명을 찾는다는 뜻임
  • ports는 포트포워딩
 
💡
중요포인트: 들여쓰기를 잘할 것 들여쓰기로 부모/자식 관계를 나타내기 때문에 들여쓰기를 잘해야됌

들여쓰기를 잘해야하는 이유

들여쓰기에 따라서 에러가 발생 할 수 있다.
 
  • ❌ 들여쓰기를 잘못한 올바르지 못한 예시
build: context: . dockerfile: Dockerfile ports: - 4000:4000
 
  • ⭕ 들여쓰기를 잘한 올바른 예시 /
version: "3.7" # 컴퓨터들 services: # 컴퓨터 이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터 이름 my-database: build: context: . dockerfile: Dockerfile.mongo ports: - 27017:27017
 

도커 컨테이너에 mongoose 연결하기

에러

  • index.js 경로에 다음과 같이 몽구 연결 코드를 작성하고,
mongoose .connect("mongodb://localhost:27017/mydocker") .then(() => { console.log("DB 연결 성공"); }) .catch((err) => console.log("DB 연결 실패", err)); app.listen(4000);
  • 다음 명령어를 통해서 도커 최신화 후 도커 컨테이너들을 실행 시키면
docker-compose build docker-compose up
도커 컨테이너가 localhost:27017 로 연결을 못해서 에러가 나게 된다.
이것은, 첫번째 도커인 express 도커 컨테이너안의 index.js에서 mongoose가 localhost:27017로 연결하려고 찾지만,
두번째 도커 컨테이너의 pc 포트번호는 27017이 아니라서 첫번째 도커가 두번째 도커 포트에 연결을 못해서 발생하는 에러다.
 
이것은 네임리졸루션으로 해결이 가능하다.

네임리졸루션

💡
네임리졸루션이란? 도커 컴포즈로 실행시킨 도커 컨테이너들끼리의 포트번호를 연결해주는것
 
앞전에 설정한 mongo도커 컨테이너의 이름을 적어주면 된다.
mongoose // .connect("mongodb://localhost:27017/mydocker") .connect("mongodb://my-database:27017/mydocker") .then(() => { console.log("DB 연결 성공"); }) .catch((err) => console.log("DB 연결 실패", err));

테스트

  • 작성한 docker-compose.yaml 파일을 빌드시켜주고 (이미지를 저장해준다고 표현함)
docker-compose build
 
 
  • 저장된 이미지를 실행 시킨다.
docker-compose up
 
  • 다음 명령어를 입력하면
docker ps
 
사진처럼 나오는데, 포트포워딩도 잘 되어있는것을 확인 할 수 있다.
notion image
 

컨테이너 몽고 db접속 확인법

  • 해당 명령어를 통해, 도커 컨테이너에 들어갈 수 있다.
docker exec -it ‘db컨테이너ID’ /bin/bash
  • 이후 mongo 를 입력하면 몽고 db가 접속되어있는걸 확인 할 수 있다.
  • 해당 도커에서 나오는 방법은 exit를 입력하면 된다.
 

종료

실행되어있는 터미널에서 컨트롤 + c 를 누르면 종료됨
꺼져있는지 확인하려면? → docker ps
 
만약 실행은 한 상태지만, 실행되어있는 터미널이 사라져있고, docker ps를 통해 확인한 결과 도커가 실행중인 상태에서 종료하는 방법 → docker-compose stop
 

리팩토링

(Dockerfile.mongo)
# 몽고디비 5버전 다운, 자동으로 실행 명령어가있어서 자동으로 실행됌 FROM mongo:5
  • 위의 Dockerfile.mongo 파일처럼 한줄만 적혀있을 때 할 수 있는 리팩토링 방법
    • Dockerfile.mongo 이 파일을 삭제하고
 
(docker-compose.yaml)
version: "3.7" # 컴퓨터들 services: # 컴퓨터이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터이름 my-database: image: mongo:5 ports: - 27017:27017
  • docker-compose.yaml 파일에 image: mongo:5 을 추가해주면 됨

결론

도커 컨테이너가 하나일때도 docker-compose up을 통해 실행하는게 끄고 켜고 하는게 간편하다.
 
docker-compose.yaml 파일만 수정해줬을 경우 docker-compose build 를 다시 할 필요없고,
docker-compose up 명령어만 쳐줘도 된다.

댓글

guest