포스트

[Docker compose] 우분투에서 Mongodb 도커 컴포즈 작성하고 보안 로그인하기, 유저 생성하기, studio 3T로 접속하기.

여러 프로그래밍 환경 세팅을 하는 것은 번거롭지만, 도커 컴포즈로 설치를 하게 되면 매우 간편한 것 같다. /etc/mongod.conf도 미리 저장소에 세팅을 해두고 불러오면서 command 에 config 옵션을 넣어서 실행되도록 할 수도 있으나, docker-hub의 mongodb 이미지로 컨테이너를 생성하는 경우 mongod.conf 파일이 없고 mongod.conf.orig으로 흔적만 남겨놓았을 뿐더러, 해당 mongod.conf를 따로 생성해서 실행해주지 않아도 컨테이너를 생성할 때 몇 가지 파라미터만 설정해주면 자체적으로 필요한 authetication login 기능을 바로 사용할 수 있기 때문에 config를 사용하는 방법은 따르지 않았다.

또한 인터넷에서 mongodb를 설치하는 방법을 검색해보면 거의 대부분 mongo 명령어를 사용하는 구식의 버전을 다루고 있다. 그래서 이 포스팅에서는 mongosh 명령어를 사용해야만 하는 최신 버전의 mongodb에 대해 다룬다.

그래서 이번 포스팅에서는 최대한 간소화하여 클라우드 서버에 mongodb를 도커 컴포즈로 설치할 수 있도록 도커 컴포즈 yml 파일을 만들고, 보안 접속하고, 또 다른 유저를 생성해보고, studio 3T라는 gui툴로도 접속해보는 것까지만 다루겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# docker-compose.yml
version: "3"

services:

  mongo:
    image: mongo:latest
    container_name: mongodb
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
      TZ: Asia/Seoul
    volumes:
      - /db/mongodb/data:/data/db
    ports:
      - "27020:27017"

도커의 mongodb컨테이너 안에서 오픈된 포트는 27017이고, 이 포트가 서버 외부로 오픈될 때는 27020으로 오픈되도록 세팅했다.

1
2
3
4
# .env

MONGO_INITDB_ROOT_USERNAME=루트유저
MONGO_INITDB_ROOT_PASSWORD=루트유저비밀번호

docker compose up -d 로 빌드해주고, sudo chmod 777 -R /db 로 권한 문제를 임시방편으로 해결한다.


컨테이너에 접속해서 mongodb 작동을 확인하려면,

1
docker exec -it {컨테이너이름} /bin/bash

docker exec로 mongodb 컨테이너에 접속하고,

1
mongosh -u {루트유저이름} -p {루트유저비밀번호}

로 로그인한다.

1
show dbs

database를 확인하는 위 명령어를 입력해보면 아래와 같이 잘 출력된다.

그런데 만일 위 과정대로 로그인하지 않고 단순히 mongosh 로 로그인한다면, authentication 에러가 출력될 것이다.

다음과 같이 view 권한만 가지는 유저를 생성해보자.

1
2
db.createUser({user: "viewer", pwd: "mongodb_viewer_12345", roles: [{role: "read", db: "mydb"}]})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
test> use admin
admin> show users
[
  {
    _id: 'admin.루트유저',
    userId: new UUID("9dd6f252-5f22-4f48-87c2-5efa24177fad"),
    user: '루트유저',
    db: 'admin',
    roles: [ { role: 'root', db: 'admin' } ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
  },
  {
    _id: 'admin.viewer',
    userId: new UUID("6cd6ab67-d3c8-4623-bcff-0320af1fe9e7"),
    user: 'viewer',
    db: 'admin',
    roles: [ { role: 'read', db: 'mydb' } ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
  }
]


이제 studio3t로 접속해보자.

mongodb를 데스크탑에서 접속해서 gui로 조작하기 위해 studio3t를 설치해준다. https://studio3t.com/ko/download/

MongoDB용 Studio 3T 다운로드 | 윈도우, 맥OS 및 리눅스 MongoDB 에서 가장 강력하고 사용자 친화적인 GUI를 무료로 시작하세요. 신용 카드가 필요하지 않습니다. 지금 다운로드하세요. MongoDB 에서 가장 강력하고 사용자 친화적인 GUI를 무료로 시작하세요. 신용 카드가 필요하지 않습니다. 지금 다운로드하세요.

유료버전 studio3t는 mongoDBCompass보다 더 기능이 많지만, 조금 기능이 축소된 무료 버전도 있어서 사용할 수 있다.

다음처럼 new connection에 서버IP와 로그인 아이디, 패스워드를 입력해주고, IP는 아까 설정했던 27020(27017이 아니라)를 입력했고, Authentication DB에는 admin을 넣어준다.

그 다음엔 test connection을 해줘서 전부 OK이면 잘 연결이 된 것이다. Save를 누르면 된다.

이제 데스크탑이 원격 서버에 있는 mongodb에 연결되었다.

혹시 도커를 잘못 세팅했다면 다음 명령어로 도커를 모두 내리고 정리할 수 있다.

1
2
3
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

그런 후 다시 docker compose up -d


도커를 사용해서 mysql, postgresql, mongodb를 세팅해보았었는데, 그 중 mongodb가 제일 세팅하기가 난해했다. 참고할 수 있는 강의영상이나 블로그에는 mongo 라는 명령어로 mongodb에 접속하고 권한 인증 설정도 하였는데, 현 시점에 mongo라는 명령어가 작동하지 않았고, mongosh를 대신 사용하지만, 문법이 완전히 같지는 않은것 같았다. 공식문서에서는 authentication관련 문서가 너무 길고 명확한 지침이 없이 불친절한 인상을 받았다. 디폴트 세팅으로 사용하면 해커에게 공격받는다는 사례가 너무 많기 때문에 유저 인증 등록을 위해 접속 후 명령어를 길게 작성해줘야 하고, 내부 포트를 27017로 하지 말고 다른 포트로 변경하는 것도 번거로웠다.

참고자료) [https://hub.docker.com//mongo](https://hub.docker.com//mongo)

mongo - Official Image | Docker Hub mongo 1B+ 9.7K MongoDB document databases provide high availability and easy scalability. docker pull mongo Quick reference Supported tags and respective Dockerfile links Note: the description for this image is longer than the Hub length limit of 25000, so the “Supported tags” list has been trimmed … mongo 1B+ 9.7K MongoDB document databases provide high availability and easy scalability. docker pull mongo Quick reference Supported tags and respective Dockerfile links Note: the description for this image is longer than the Hub length limit of 25000, so the “Supported tags” list has been trimmed …


mongodb를 배우기 위해 굳이 지금 세팅해본 까닭은, mongodb, postgresql, mysql 을 전부 사용할 줄 알고 싶기 때문이다… 게임의 뼈대를 만들 때 sqlite는 너무 빈약하고, mysql, postgresql, mongodb 중에 하나를 골라야 될 것 같았다. 빠르게 배울 수 있는 것을 선택하고자 했고, 마침 지난 도커강의를 들으면서 알게됬던 강사님의 또 다른 유료강의의 도움을 받기로 결정했다. 그래서 sql중에는 mysql을, nosql중에는 mongodb를 배우기로 했다. 강사님은 도커로 mongodb의 설치를 진행하시지 않았지만, 나는 잘못 세팅했을 때 삭제하는 것이 번거로워서 도커로 설치하기로 했다. 또한 도커의 내부 접속 포트를 바꿔줘야 하는 번거로움도, 도커를 사용하면 내부 포트는 안 바꾸고 외부 포트만 바꿔도 되고, 나에게 도커는 mongodb보다는 익숙하기 때문에 이점이 있는 것 같다.

감사합니다.

sticker

(20230802 업데이트): 컨테이너 보안 로그인. 추가 유저 생성.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.