본문 바로가기

개발자는 오늘도 달립니다.

[Docker] MongoDB Docker Container 생성 with user authentication ! 본문

유틸/Docker

[Docker] MongoDB Docker Container 생성 with user authentication !

✍21시간 2021. 1. 6. 17:23

mongoDB 인증 로그인이 가능하게끔 도커라이징 하는 방법을 포스팅 하도록 하겠습니다.!

관리자와 일반 사용자를 설정하고, 관리자는 super user 와 같습니다. 그리고 사용자는 접근도 가능하고 물론 데이터베이스에 대한 읽기, 쓰기 권한을 주도록 하겠습니다.

 

1. Dockerfile 생성

Dockerfile 을 생성 하고 아래의 내용을 복사해서 붙여넣어주세요~! 버전은 mongodb 4.0.2 로 하겠습니다.

FROM mongo:4.2.0
COPY ./users_init.sh /docker-entrypoint-initdb.d/

 

2. users_init.sh 생성

해당 파일은 도커 시작 시 호출 하게 될 스크립트 파일(javascript 코드가 포함 된 리눅스 쉘 스크립트)입니다. 기존 mongodb 데이터 경로를 볼륨으로 마운트하면 이 스크립트가 무시되고 사용자 생성이 발생하지 않습니다.

데이터베이스는 tempdb와 testdb 두가지 를 생성하겠습니다.

#!/bin/bash
set -e

#dbUser is the userName used from applicatoin code to interact with databases and dbPwd is the password for this user.

#MONGO_INITDB_ROOT_USERNAME & MONGO_INITDB_ROOT_PASSWORD is the config for db admin.

#admin user is expected to be already created when this script executes. We use it here to authenticate as admin to create

#dbUser and databases.

echo ">>>>>>> trying to create database and users"
if [ -n "${MONGO_INITDB_ROOT_USERNAME:-}" ] && [ -n "${MONGO_INITDB_ROOT_PASSWORD:-}" ] && [ -n "${dbUser:-}" ] && [ -n "${dbPwd:-}" ]; then
mongo -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD<<EOF
db=db.getSiblingDB('tempdb');
db=db.getSiblingDB('iot_db');
use tempdb;
db.createUser({
 user: '$dbUser',
 pwd: '$dbPwd',
 roles: [{
  role: 'readWrite',
  db: 'tempdb'
 }]
});
use iot_db;
db.createUser({
 user: '$dbUser',
 pwd: '$dbPwd',
 roles: [{
  role: 'readWrite',
  db: 'iot_db'
 }]
});
EOF
else
  echo "MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD,dbUser and dbPwd must be provided. Some of these are missing, hence exiting database and user creatioin"
  exit 403
fi

✔환경 변수

위 파일의 내용에서 알 수 있듯이 스크립트 내부에 유저, 패스워드를 미리 입력하는 방식이 아닌 컨테이너를 실행 할때 파라미터로 전달 하는 방식을 사용했습니다. 변수 MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD 기본 이미지 내장 환경 변수 입니다. 이미지에서 이러한 내장 환경 변수가 정의되어 있으면 스크립트가 실행 되기 전에 루트 사용자가 생성이 됩니다.

javascript 문에서 db.getSliblingDB('tempdb'); 와 db.getSliblingDB('iot_db');가 호출 될 때 데이터베이스가 만들어 집니다. 그리고 db.createUser 메소드로 유저를 만들면 됩니다.

 

3. .env 파일 생성

## Mongodb
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=pass
MONGO_INITDB_DATABASE=admin
dbUser=user
dbPwd=pass

docker run 명령어를 통해서 .env 에 변수들을 넘겨 줄 수도 있고, docker-compose 파일에 명시를 하여 docker-compose up 으로 동작할때 불러올수도 있습니다.

 

4. Docker 이미지 빌드

1번에서 생성 한 Dockerfile 을 통해서 이미지를 빌드 하겠습니다.

sudo docker build -f Dockerfile -t my-mongo:1.0 .

이미지 이름은 my-mongo 로 만들면서 버전은 1.0 으로 명시 하겠습니다.

 

5. Docker Network 생성

sudo docker network create -d bridge n1

 

6. Docker run 으로 실행하기

sudo docker run --name mongodb --rm --network n1 --env-file .env --log-driver=journald -v /var/lib/mongodb:/data/db -d my-mongo:1.0

 

7. Docker compose .yml 파일 생성 및 실행

version'3'

services:

  mongodb:

    container_namemarkany-mongodb

    imagemongo:4.2.0

    ports:

      - "27017:27017"

    volumes:

      - "./data/db:/data/db"

      - "./users_init.sh:/docker-entrypoint-initdb.d/users_init.sh:ro"

    networks:

      - network1

    environment

        MONGO_INITDB_ROOT_USERNAME$user

        MONGO_INITDB_ROOT_PASSWORD$pass

    env_file

      - $env

    command: [--auth]

    restartalways

 

networks:

   network1:

    driver"bridge"

 

위의 내용을 복사해서 docker-compose.yml 파일을 생성합니다.

다음은 docker-compose 명령어를 실행 하는 방법입니다.

sudo user=root pass=pass env=.env docker-compose up -d

 

✔접속 확인

mongo -u user -p pass --authenticationDatabase "iot_db"

Comments