개발자는 오늘도 달립니다.
[Docker] MongoDB Docker Container 생성 with user authentication ! 본문
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_name: markany-mongodb
image: mongo: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]
restart: always
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"
'유틸 > Docker' 카테고리의 다른 글
[Docker] docker-compose 특정 버전 설치하기! (0) | 2021.10.23 |
---|---|
[Docker] 도커 특정 버전 설치하기! (0) | 2021.10.22 |
[Error] docker 컨테이너 시작 문제, iptables: No chain/target/match by that name. (0) | 2021.09.14 |
[Docker] 리눅스 환경 Docker 쉽게 설치 하기! (0) | 2021.08.05 |