もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

MongoDBをDockerでつかってみた話

はじめに

とある案件で、DBの正規化が面倒臭そう&ちょっとの間だけしか利用しないシステムだったので、RDBSではなくNoSQLを使用することにした。

MongoDBをDockerで使用して見たところ、認証周りがイマイチ分からなかったので、自分がやったことをまとめ

環境

  • Docker: 20.10.6, build 370c289
  • docker-compose: 1.29.1, build c34c88b2
  • MongoDB: 3.4.4

参考サイト

qiita.com

MongoDBの構築

LinuxからMongoDBサーバを構築するのは面倒臭いので、Dockerから使用してみることにした。

docker-compose.ymlのは以下の感じ

version: '3'
services:
    mongo:
        image: mongo:3.4.4
        container_name: sample-mongo-db
        ports:
            - 27017:27017
        volumes:
            - ./mongo/db:/data/db
            - ./mongo/configdb:/data/configdb
        environment:
            MONGO_INITDB_ROOT_USERNAME: sampleAdmin
            MONGO_INITDB_ROOT_PASSWORD: thisIsTest
            MONGO_INITDB_DATABASE: sample-db
            TZ: Asia/Tokyo

MongoDBのイメージのバージョンは3.4.4

AWSのMongoDBのイメージ(AMI)が3.4.4のため

MongoDBの認証

コンソールから認証するときに、結構つまずいたのでメモ書き

$ mongo

使用するDBの切り替え

use admin

認証

db.auth("sampleAdmin", "thisIsTest")

認証に成功すると「1」、失敗すると「0」と返される

ユーザの追加

adminのログインを済ませた状態でDBの切り替え、「sample-db」を読み書きするユーザを追加する

use sample-db
db.createUser({
    user: "sample-app-user",
    pwd: "S@mple",
    roles: [
        { role: "readWrite", db: "sample-db" }
    ]
})

コンソール画面からコレを入力するのは面倒臭いね・・・

ユーザの自動追加

「/docker-entrypoint-initdb.d」というディレクトリに、.jsか.shファイルを置いておくと、自動的にスクリプトが実行され、ユーザの追加とかできるらしい

docker-compose.ymlに「/docker-entrypoint-initdb.d」のマウント設定を追加

version: '3'
services:
    mongo:
        image: mongo:3.4.4
        container_name: sample-mongo-db
        ports:
            - 27017:27017
        volumes:
            - ./mongo/db:/data/db
            - ./mongo/configdb:/data/configdb
            - ./mongo/init:/docker-entrypoint-initdb.d
        environment:
            MONGO_INITDB_ROOT_USERNAME: sampleAdmin
            MONGO_INITDB_ROOT_PASSWORD: thisIsTest
            MONGO_INITDB_DATABASE: sample-db
            TZ: Asia/Tokyo

ユーザを追加するスクリプト

var users = [
    {
        user: "sample-app-user",
        pwd: "S@mple",
        roles: [
            { role: "readWrite", db: "sample-db" }
        ]
    }
];

users.forEach(user => {
    db.createUser(user);
});