
Docker: MongoDb에서 사용자 지정 사용자 및 데이터베이스 초기화
2022-10-13 last update
9 minutes reading devops mongodb docker containers목적
모든 사전 프로덕션 데이터베이스, 사용자 및 테이블 또는 스키마를 개발할 준비가 되어 있는 사전 프로덕션 상태의 기본 OS 또는 외부 호스트에 설치할 필요가 없는 빠르고 재배포 가능한 데이터베이스가 필요한 상황이 있습니다. .
이를 위해 K8에서 전체 클러스터가 작동할 필요가 없으므로 배포하기가 더 쉽습니다.
docker compose
가 있는 MongoDB를 제거하고 개발 프로세스 중에 '기본 상태'로 재설정합니다.이론
예를 들어 데이터를 가져올 ETL로 작업해야 한다고 상상해보십시오. SQL Server를 만들고 MongoDB에 저장합니다.
이를 위해 항상 기본 데이터베이스를 초기 상태로 유지하면서 원할 때마다 회전할 수 있는 데이터베이스를 갖게 됩니다.
물론 ETL 시작 중에 즉시 테이블, 데이터베이스를 생성할 수 있지만 항상 작성 파일 내에서 사전 프로덕션 데이터베이스 설정을 생성할 수 있습니다.
먼저 첫 번째 것들
먼저 공간/폴더를 생성해야 합니다.
cd /home/user/repos
mkdir mongodb-dev
cd mongodb-dev
그리고 OS에
Docker
와 Docker Compose
가 설치되어 있어야 합니다.도커 작성
필요에 따라 쉽게 시작하거나 다시 만들 수 있는 스택을 만드는 데
docker compose
를 사용하는 것이 일반적입니다.먼저 시작점인
docker-compose.yml
파일을 생성해야 합니다.cd /home/user/repos/mongodb-dev
touch docker-compose.yml
그런 다음 IDE/코드 편집기(예: Visual Studio Code) 내에서 파일 편집을 시작할 수 있습니다.
code docker-compose.yml
간단한 MongoDb 설정은 다음을 위한 두 개의 영구 볼륨과 함께 하나의 서비스를 사용합니다.
docker-compose.yml
의 첫 번째 단락은 항상 엔진에서 사용할 작성 파일의 약 version
입니다.버전 관리에 대한 자세한 내용은 here를 참조하십시오.
이 기사에서는
version: '3.7'
를 사용합니다.compose file
의 초기 기반은 다음과 같습니다.version: '3.7'
services:
mongodb:
image: mongo:latest
restart: on-failure
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT:-mongodb}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:-mongodb}
MONGO_INITDB_ROOT_DATABASE: ${MONGO_ROOT_DB:-mongodb}
networks:
- services
ports:
- "27017:27017"
volumes:
- mongodb-data:/data/db
- mongodb-log:/var/log/mongodb
volumes:
mongodb-data:
driver: local
mongodb-log:
driver: local
networks:
services:
name: ${MONGO_NETWORK:-mongodb.network}
이름이
service
인 mongodb
를 생성했다면 mongo
의 최신DockerHub
이미지를 사용할 것입니다.사용자 정의 ENV에 매핑되는 내장 변수를 사용하여 기본 사용자를 설정합니다.
마지막 부분에서 네트워크를 초기화하고 포트 포워딩을 설정하고 컨테이너 내부의 데이터를 외부 저장소/볼륨으로 매핑하여 데이터 지속성을 허용합니다(제 생각에는 자체 설명이라고 생각합니다).
${VARIABLE:-secret}
이 트릭을 사용하면 적절한 .ENV 없이 데이터베이스를 회전할 수 있습니다.즉, 루트 디렉토리에 지정된 .env가 없거나 변수가 비어 있는 경우 -
docker-compose
는 일반yaml
에 저장된 기본 비밀을 사용합니다. 개발 목적으로는 좋지만 계획 코드에 기본 암호를 저장하는 것은 프로덕션 환경에서 허용되지 않습니다.스택 시작 시 데이터베이스 및 사용자 초기화
사용자 내에서 사용자 지정 시작 데이터베이스를 추가하려면 프로젝트 디렉터리에
.sh
파일을 만들어야 합니다.touch mongo-init.sh
그런 다음 볼륨에 다음 줄을 추가하여 파일을 docker-entrypoint에 매핑합니다.
volumes:
- ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
그런 다음 사용자 비밀번호를
environment
섹션에 추가합니다. 예:SALES_PASSWORD: ${SALES_PASSWORD:-sales}
WAREHOUSE_PASSWORD: ${WAREHOUSE_PASSWORD:-warehouse}
그리고 변수를 기반으로 데이터베이스를 생성하기 위해 적절한 자체 탐색 코드를
.sh
파일에 배치합니다.set -e
mongo <<EOF
db = db.getSiblingDB('sales')
db.createUser({
user: 'sales',
pwd: '$SALES_PASSWORD',
roles: [{ role: 'readWrite', db: 'sales' }],
});
db.createCollection('receipts')
db.createCollection('documents')
db.createCollection('invoices')
db = db.getSiblingDB('warehouse')
db.createUser({
user: 'warehouse',
pwd: '$WAREHOUSE_PASSWORD',
roles: [{ role: 'readWrite', db: 'warehouse' }],
});
db.createCollection('documents')
db.createCollection('stocks')
db.createCollection('invoices')
db.createCollection('orders')
EOF
최종 코드
최종
docker-compose.yml
파일은 다음과 같아야 합니다.version: '3.7'
services:
mongodb:
image: mongo:latest
restart: on-failure
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT:-mongodb}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:-mongodb}
MONGO_INITDB_ROOT_DATABASE: ${MONGO_ROOT_DB:-mongodb}
SALES_PASSWORD: ${SALES_PASSWORD:-sales}
WAREHOUSE_PASSWORD: ${WAREHOUSE_PASSWORD:-warehouse}
networks:
- services
ports:
- "27017:27017"
volumes:
- ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
- mongodb-data:/data/db
- mongodb-log:/var/log/mongodb
volumes:
mongodb-data:
driver: local
mongodb-log:
driver: local
networks:
services:
name: ${MONGO_NETWORK:-mongodb.network}
샘플 데이터베이스 실행
초기화하기 위해 (프로젝트 루트에서) 다음을 입력합니다.
docker compose up -d
시작하거나 중지하려면:
docker compose stop
docker compose start
컨테이너를 제거하려면:
docker compose down
볼륨과 함께 컨테이너를 제거하려면 다음을 입력합니다.
docker compose down -v
결과
모든 것이 정상이면 다음과 같이 표시되어야 합니다.

그리고
compose-file
에 주어진 사용자와 비밀번호로 인스턴스에 참여할 수 있습니다.