::: IT인터넷 :::

Docker로 MongoDB 설정하기

곰탱이푸우 2022. 3. 24. 08:20

MongoDB는 대표적인 NoSQL 데이터베이스 서비스이다.

NoSQL은 기존 RDBMS의 단점을 극복하고, 보다 유연한 데이터 저장과 처리를 위해 제안되었다.
  • 기존 RDBMS는 불가능한 스키마 (Schema)의 수평적 확장 가능
  • 기본적으로 Key-Value 형태의 데이터 구조
  • 데이터 형태에 따라 와이드 컬럼 (유연한 스키마), 그래프, 도큐먼트 등의 형태로 구분
 
이러한 특징은 기존 RDBMS에서 자료 구조의 변경이 빈번하거나, 처리하기 어려운 데이터를 처리하는데 장점으로 작용한다.
RDBMS에 비해 Join 연산이 빠른 장점이 있지만, 데이터의 일관성은 RDBMS에 비해 떨어진다.
따라서 데이터의 일관성 유지가 중요한 데이터에는 사용하기 어렵다.
 
MongoDB는 Document 형태의 데이터를 사용하는 NoSQL 데이터베이스이다.
JSON 형태의 동적 스키마형 문서 (BSON)를 사용하며, Document와 Collection이라는 용어를 사용한다.
  • Document - RDBMS의 Row와 동일한 개념
  • Collection - RDBMS의 Table과 동일한 개념
 
 
MongoDB.com에서 오픈소스로 제공하며, GitHub과 DockerHub 사이트는 다음과 같다.
 
오픈소스 사용할때 중요한 라이선스가 중요하므로 간략하게 살펴보면 다음과 같다.
  • AGPL (Affero General Public License) - 2018년까지 적용
  • SSPL (Server Side Public License) - 2018년 이후부터 적용
 
SSPL 라이선스는 AGPL과 거의 동일하다.
다른 점은 SaaS (Software-as-a-Service)로 제공되는 경우 연동 된 프로그램들을 모두 코드 공개를 해야 한다는 점이다.
물론 MongoDB의 소스 코드를 수정하여 사용하는 경우에 해당한다.
단순히 데이터를 저장하고 검색하는 단순한 사용의 경우 적용되지 않는다.
 

docker와 docker-compose 설치

docker 설치는 다음 포스팅을 참고한다.
docker-compose의 경우 우분투에서는 아래 명령어로 설치한다.
$ sudo apt install docker-compose

 

2022-02-08 현재 제공되는 버전은 1.25.0 버전이다.
그 이상의 버전을 사용하고자 하는 경우 아래 포스팅을 참고한다.

MongoDB의 Docker 이미지 최신 버전 확인

docker 이미지를 Pull 할때 버전을 latest로 지정하면 가장 최근에 배포 된 최신 버전을 받아올 수 있으므로 편리하다.
그러나 docker image list를 통해 확인해보면 버전 태그가 latest로 지정되어 직관적으로 버전 확인하기가 어렵다.
 
따라서 가급적 아래 URL에 접속하여 latest로 지정 된 버전을 확인한다.
latest 태그의 DIGEST와 동일한 해시를 갖는 버전을 확인하면 된다.
2022-02-08 현재 5.0.6 버전이 최신으로 확인된다.
 
mongodb와 함께 mongo-express도 사용한다. mongo-express는 PHPMyAdmin과 같이 웹 기반 UI를 제공해준다.
 
아래 사이트에서 최신 버전을 확인한다.
2022-02-08 현재 1.0.0-alpha 버전이 최신이다.
 

docker-compose.yml 작성

Docker 컨테이너 생성을 위한 docker-compose.yml 파일을 작성한다.
$ vi docker-compose.yml

version: "3" 
services: 
  mongodb:
    image: 사설저장소경로:포트/mongo:버전  # dockerhub를 사용하는 경우 mongo:버전
    restart: always
    ports:
      - "사용할포트:27017"  # 동일하게 사용하려는 경우 27017:27017
    environment: 
      - MONGO_INITDB_ROOT_USERNAME=mongo
      - MONGO_INITDB_ROOT_PASSWORD=mongo
    volumes:
      - /path/to/mongodb/data:/data/db  # 현재 경로 하위에 생성하면 ./mongo-data:/data/db

  mongo-express:
    image: 사설저장소경로:포트/mongo-express:버전  # dockerhub를 사용하는 경우 mongo-express:버전
    restart: always
    ports:
      - "사용할포트:8081"  # 동일하게 사용하려는 경우 8081:8081로 지정
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongodb  # mongodb 컨테이너 이름
      - ME_CONFIG_MONGODB_PORT=27017  # mongodb 연결 포트
      - ME_CONFIG_MONGODB_ADMINUSERNAME=mongo  # mongodb 컨테이너의 root 계정
      - ME_CONFIG_MONGODB_ADMINPASSWORD=mongo  # mongodb 컨테이너의 root 비밀번호
      - ME_CONFIG_BASICAUTH_USERNAME=mongo  # mongo-express 사용자 계정
      - ME_CONFIG_BASICAUTH_PASSWORD=mongo  # mongo-express 사용자 비밀번호
      # ME_CONFIG_MONGODB_ENABLE_ADMIN=true  # 모든 데이터베이스에 관리자권한으로 연결 (기본값 true)
    depends_on:
      - mongodb
 
위의 옵션에서 주목해야 하는 부분은 ME_CONFIG_MONGODB_ENABLE_ADMIN이다.
mongo-express가 mongodb의 모든 모든 데이터베이스에 접근할 때 관리자 권한을 허용하는 옵션이다.
 

MongoDB 컨테이너 생성

아래 명령어를 사용하여 Docker 컨테이너를 생성한다.
$ docker-compose up -d
 
아래 명령으로 mongo-express 컨테이너의 로그를 확인해보면 오류가 발생한 것을 확인할 수 있다.
원인은 mongodb 컨테이너의 실행이 완료되기 전에 mongo-express 컨테이너가 mongodb 컨테이너에 연결을 시도하기 때문이다.
docker-compose.yml 파일에 재시작 설정이 always 로 되어 있기 때문에, mongo-express 컨테이너는 반복적으로 재시작하면서 연결을 시도한다.
mongodb 컨테이너의 실행이 완료되면 아래와 같이 연결 된 것을 확인할 수 있다.
WSL 환경의 /mnt 하위 경로에서 오류 발생

wsl 환경에서 테스트하다보면 /mnt의 c나 d 폴더 하위에서 오류가 발생한다.
C와 D 폴더는 윈도우 운영체제의 C드라이브와 D드라이브를 의미하며, 윈도우 운영체제가 권한을 관리한다.
따라서 chown이나 chmod와 같은 설정을 적용해도 변경되지 않는다.

WSL 환경에서 폴더 권한 설정이 되지 않으면 아래 명령을 실행하고 다시 시도한다.
만약, 기존에 /mnt 하위에 공유 볼륨을 지정하여 사용 중인 컨테이너가 있다면 영향을 받는다.
따라서 반드시 기존 컨테이너들도 모두 종료하고 진행해야 한다.
$ sudo umount /mnt/d
$ sudo mount -t drvfs D: /mnt/d -o metadata​
 
 

mongodb 확인

mongodb 컨테이너가 정상적으로 실행되었는지 확인한다.
 
아래 명령으로 mongodb 컨테이너 내부로 진입하여 mongodb에 로그인한다.
$ docker exec -it mongodb_mongodb_1 /bin/bash

$ mongosh -u mongo -p mongo
 
다음과 같이 mongodb 쉘이 실행된다.
 
아래 명령을 사용하여 생성된 데이터베이스 목록을 확인한다.
test> show dbs
admin    102 kB
config  111 kB
local  73.7 kB
test>
 
local 데이터베이스로 변경하고 Collection (Table)과 Documents (Row)의 정보를 확인한다.
출력은 bson (json) 형태이다.
test> use local
switched to db local
local> db.getCollectionInfos()
[
  {
    name: 'startup_log',
    type: 'collection',
    options: { capped: true, size: 10485760 },
    info: {
      readOnly: false,
      uuid: UUID("de528301-df24-4f94-be50-b89e13d3f8c0")
    },
    idIndex: { v: 2, key: { _id: 1 }, name: '_id_' }
  }
]
local> db.startup_log.find().pretty()
 
해당 명령으로 Documents를 조회하면 아래와 같이 확인된다.
 
 

mongo-express 확인

초기 화면 접속
mongo-express 컨테이너가 정상적으로 실행되었는지 확인하기 위해 아래 URL로 접속한다.
 
아래와 같은 Mongo Express 화면이 출력된다.
 
데이터베이스 정보 확인
local 데이터베이스 좌측의 View를 클릭하면 데이터베이스의 상세 정보 확인이 가능하다.
 
Collection (Table)과 Document (Row) 확인
해당 데이터베이스에는 startup_log라는 Collection (Table)이 존재한다.
다시 좌측의 View를 클릭하면 해당 테이블의 레코드를 확인할 수 있다.
 
데이터베이스 생성
우측 상단의 Database Name에 임의의 이름을 입력하고 Create Database를 클릭한다. (test로 입력했다.)
 
test라는 이름의 데이터베이스가 정상적으로 생성되었다.