개발하는 두부

docker-compose로 MongoDB 설치하기

by 뚜부니

docker-compose를 사용해서 MongoDB 를 설치해도 보려고 해요! 프로젝트 진행 중에 약간의 어려움을 겪어서.. 다른 분들은 겪지 않았으면 하는 마음에 정리하는 것도 있어요.

 

MongoDB 설치

docker-compose.yml을 다음과 같이 작성해주세요. 최신 버전의 이미지를 받아와서 설정을 하는 것이고, environment에는 DB 생성할 때 사용할 root 계정에 대한 설정이에요.

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: master
      MONGO_INITDB_ROOT_PASSWORD: master
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:
    driver: local

그다음 아래 명령어를 통해 docker-compose를 실행합니다.

docekr-compose up -d

그러면 다음과 같이 설치 및 실행된 모습을 확인할 수 있어요.

image

정상적으로 띄워진 상태인지 확인하려면 다음 명령어를 사용하시면 돼요.

docker-compose ps

image

정상적으로 띄워졌으니 docker 터미널에 접속하기 위해 다음 명령어를 실행해 보면?!
아마 접속이 안되실거예요... 😂

docker exec -it mongodb mongo -u master -p master --authenticationDatabase admin

저는 접속이 안되고 아래와 같은 문구만 뜨더라고요.

OCI runtime exec failed: exec failed: unable to start container process: exec: "mongo": executable file not found in $PATH: unknown

알아보니 이 문제는 MongoDB 4.2 버전부터는 mongosh를 사용하여 shell에 접근해야 하는데 그렇게 접근하지 않아서 발생하는 거에요. 명령어를 다음과 같이 바꿔주면 바로 접속하실 수 있으실 거에요.

docker exec -it mongodb mongosh -u master -p master --authenticationDatabase admin

image

사실 초기화를 할 때는 docker exec -it mongodb mongosh라고 입력해도 무관하다고 하는데, 전 확실하게 username, password, 계정이 있는 db 설정하고 싶어서 다 입력했어요.

mongo shell에 접속되었으니, db 설정을 해야 합니다. 계정 정보는 모두 admin db에 저장하기 위해 db를 변경해 주었어요.

use admin

현재 master 계정의 설정은 다음 명령어를 통해 확인할 수 있어요.

db.getUser('master')

실제로 실행해 보면 다음과 유사하게 뜨실 거예요.

image

init 계정이기에 자동으로 root 권한을 부여받았으나, admin db에 대한 권한만 정의된 상태예요. 이 상태인 계정을 spring 프로젝트에 연동하고 Create API를 만들어 실행하면 다음과 같은 에러를 만나실 거예요 😂

2024-11-16T13:44:02.163+09:00 ERROR 94169 --- [fan-signal-api] [      Thread-11] b.f.exception.GlobalExceptionHandler     : Exception occurred: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='master', source='fan-signal', password=<hidden>, mechanismProperties=<hidden>}

사용하려는 DB인 fan-signal에 대한 권한을 주지 않아서 발생한 문제이고, 권한만 부여하면 정상적으로 동작할 거예요! 이때, db에 실제로 사용하려는 db를 입력해 주시면 됩니다.

db.grantRolesToUser("master", [{ role: "readWrite", db: "fan-singal" }])

그다음 조회해 보면 다음과 같이 fan-signal db에 대한 권한이 생긴 것을 확인할 수 있어요.

image

 

만약 이렇게 해도 안된다면..?!! 프로젝트에서 설정할 때 계정 정보를 admin db에서 가져오고 있는지 확인해 보세요. 😊

참고

'DB > MongoDB' 카테고리의 다른 글

MongoDB 특징  (0) 2024.11.16

블로그의 정보

개발하는 두부

뚜부니

활동하기