mongoDB with docker-compose

스윗포테이토·2022년 10월 22일
2

지난 글에서 mongoose를 이용해서 몽고디비를 사용하는 법에 대해 간단하게 다루었는데, 이번엔 docker-compose를 활용한 도커 컨테이너 구축에 대해 작성해보려고 한다.

docker compose?

docker compose는 여러 컨테이너의 구축과 실행을 자동화하기 위해 사용하며, docker-compose.yml 파일에 컨테이너의 이미지, 실행 명령어 등을 정의해두고

docker compose up

이라는 명령어로 간단하게 실행할 수 있다.
docker, Dockerfile, docker compose 등에 대해서는 나중에 정리한 글을 한번 올릴 예정이다!

initialize database

MongoDB는 NoSQL로 스키마 없이 사용할 수 있지만, 그렇다해도 데이터베이스의 초기 설정은 필요하다. 우선 루트 유저 생성은 환경변수를 통해서 할 수 있다. docker-compose.yml에 직접 작성할 수도 있지만 그렇게 되면 깃허브에 바로 업로드 되기 때문에 패스워드 노출 위험이 있다. 따라서 env_file로 환경변수를 넘겨주고, .env파일은 .gitignore에 추가하여 업로드를 막았다.

  • .env
    MONGO_INITDB_ROOT_USERNAME=rootName
    MONGO_INITDB_ROOT_PASSWORD=rootPassword
    MONGO_INITDB_DATABASE=dbName
    MONGO_PORT=27017
    MONGO_URI=mongodb://rootName:rootPassword@mongodb:27017/dbName
    이렇게 환경 변수 설정을 통해 기본적인 세팅을 할 수 있다.

그러나 그 외 추가적인 유저 생성이 필요하거나, 초기 데이터를 삽입하는 등의 설정이 필요할 때도 있다. 컨테이너를 생성한 뒤 명령어를 통해 할 수 있지만, 그렇게 하는 경우 개발상 문제가 생겨 컨테이너를 삭제하고 다시 올릴 때마다 새로 입력해야 해서 효율이 떨어진다.

이럴 때 entrypoint를 사용한다. 도커파일의 ENTRYPOINT와는 조금 다르니까 헷갈리지 말자!

도커 mongoDB 공식 이미지를 사용하면, 기본적으로 docker-entrypoint-initdb 이하에 있는 js파일이나 쉘 스크립트가 컨테이너가 처음 올라갈 때 실행된다. (data 폴더가 없을 때)

mongoose에서 루트 권한으로 접속하는 것이 찝찝해 이걸 위해 조회, 작성 권한이 있는 새로운 계정을 만들어주었다.

  • database/monogDB/initdb.d/mongo-init.js
db.createUser({
  user: "user1",
  pwd: "password", 
  roles: [
    {
      role: "readWrite",
      db: "DATABASE_NAME",
    },
  ],
});

마지막으로 docker-compose.yml파일은 다음과 같이 작성하였다.

  • docker-compose.yml
version: "3"

services:
  frontend:
    ...
    
  backend:
    container_name: backend
    ...
    depends_on:
      - mongodb

  mongodb:
    container_name: mongodb
    image: mongo:5.0.9
    ports:
      - 27017:27017
    env_file: .env
    volumes:
      - ./database/mongoDB/data:/data/db
      - ./database/mongoDB/initdb.d:/docker-entrypoint-initdb.d:ro
    networks:
      - app-tier
    restart: always
    command: mongod -quiet

networks:
  app-tier:
    driver: bridge

특이사항

  1. 몽고디비 컨테이너가 올라가기 전, 백엔드 컨테이너가 먼저 올라간 경우 몽고디비에 접속을 실패해서 에러가 났다. 물론 몽고디비가 완전히 올라간 후 다시 시작하면 되는 일이지만 굳이 그럴 필요 없이
        depends_on:
          - mongodb

이렇게 옵션을 주면 몽고디비가 완전히 올라간 후에 백엔드를 올리므로 해당 에러를 피할 수 있다.

  1. 몽고디비만 올라가면 수 많은 로그가 실시간으로 떴다.
    checkpoint 어쩌고 하면서 계속 올라가는데, 다른 로그를 보기에도 불편하고 죽이고 싶어서 구글링을 해봤다.
    명확한 답을 얻지 못하고 command: mongod -quiet를 추가해봤으나 별 다른 효과는 없었다...
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글