Skip to content

Latest commit

 

History

History
110 lines (74 loc) · 3.87 KB

002.install_mongodb_with_docker-compose.md

File metadata and controls

110 lines (74 loc) · 3.87 KB

002. docker-compose로 mongodb 설치하기

MongoDB 설치

docker-compose.yml을 다음과 같이 작성합니다.

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를 실행합니다.

docker-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.grantRolesToUser("master", [{ role: "readWrite", db: "fan-singal" }])

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

image

참고