ローカルでMongoDBを使ったアプリを開発する際に、dockerを使うと便利.
docker-compose
開発環境で利用する docker-compose.dev.yaml
を準備する.
Port
mongodbのデフォルトのポートは 27017
だが、コンテナ外からアクセスするためにローカルの 27018
をポートフォワードしておく.
Volumes
-
./mongo/db:/data/db
./mongo/configdb:/data/configdb
はデータの永続化に必要. -
./mongo/init:/docker-entrypoint-initdb.d
にデータベースの初期化のための.js
ファイルを入れておく. 後述.
Environment
- MONGO_INITDB_ROOT_USERNAME: rootユーザの名称
- MONGO_INITDB_ROOT_PASSWORD: rootユーザのパスワード
- MONGO_INITDB_DATABASE: コンテナ作成時に初期化されるデータベース
dokcer-compose.dev.yaml
mongo:
container_name: mongo
restart: always
image: mongo:4.2.0
ports:
- "27018:27017"
volumes:
- ./mongo/db:/data/db
- ./mongo/configdb:/data/configdb
- ./mongo/init:/docker-entrypoint-initdb.d
environment:
MONGO_INITDB_ROOT_USERNAME: <root_user_name>
MONGO_INITDB_ROOT_PASSWORD: <root_password>
MONGO_INITDB_DATABASE: <database_name>
TZ: Asia/Tokyo
初期データ
.js
か .sh
を ./mongo/init
以下に置いておくことで、初期データが投入される.
以下の記事にてそれぞれのファイルが読み込まれる仕組みが詳述してあります.
https://qiita.com/homines22/items/038dc08fca6405813e0b
認証用ユーザの作成
docker-composeで立ち上げたmongoコンテナに、ローカルからアクセスするユーザを作成する.
ユーザはアクセスできるデータベースが割り当てられている.(authenticationDatabase)
1-mongo-init.js
var users = [
{
user: "<user_name>",
pwd: "<pass_word>",
roles: [
{
role: "dbOwner",
db: "<db_name>"
}
]
}
];
for (var i = 0, length = users.length; i < length; ++i) {
db.createUser(users[i]);
}
Jsonファイルのインポート
ユーザデータだけでなく、手元のJsonデータを適当なcollectionに投入しておきたいケースもある.
2-mongo-init.sh
mongoimport --db <db_name> --collection <collection_name> --drop --file /docker-entrypoint-initdb.d/<your_json.json> --jsonArray
-
--drop
オプションをつけることで、実行時に対象のcollectionが存在した場合にそれを削除して初期データを投入する. -
--jsonArray
オプションをつけることで、array形式になっているJsonファイルも読み込める. (insertManyする感じ.)
コンテナ外からのアクセス
作成されたユーザを使って、以下のコマンドでローカルのターミナルからmongoに入れる.
$ mongo -u <user_name> -p --port 27018 --host 127.0.0.1 --authenticationDatabase <db_name>