LoginSignup
115
96

More than 1 year has passed since last update.

docker-composeでmongoDB環境を構築して使う

Last updated at Posted at 2018-10-23

docker-compose.yml

DockerHubに公式のものがあります
https://hub.docker.com/_/mongo/

公式のものにportsとvolumesを追記しました。
下記のdocker-compose.ymlを配置したフォルダでdocker-compose up -dすると立ち上がります。

立ち上がったあとdocker-compose psで立ち上がってること(StateUpになっていること)を確認します

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - 27017:27017
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_SERVER: mongo
    depends_on:
      - mongo

各項目の説明

AdminNameとPassword

この2つはmongoDBとmongo-expressどちらにもありますが、設定するNameとPasswordは同じでなければなりません。

ports

ポートのマッピングをしています。
ポートはホスト:コンテナでマッピングするか、コンテナのポートのみ指定します。
コンテナのポートのみ指定した場合、ホストのポートはランダムで決まります。(docker psコマンドのPORTS列に表示されます)

volumes

パスをボリュームとしてマウントします。オプションとしてホスト側のパスを指定(ホスト:コンテナ)しています。
dbのデータとconfigのローカル:コンテナの指定です。docker-compose up -dすると自動でローカルにフォルダとファイルが作られます。

mongoDBコマンド実行

コンテナへアクセス

docker-compose exec mongo bash
mongo admin -u root -p
(docker-compose.ymlに書いたパスワード)

testデータベースのhogeテーブルにレコードを追加して確認するサンプル

show databases
use test
db.hoge.insert({ name: "test" })
db.hoge.find()
exit

mongo-expressへアクセス

下記URLにアクセスする。

http://0.0.0.0:8081/

アクセスすると認証が出るので、docker-compose.ymlに入れたAdminNameとPasswordでログインします。

上記のtestデータベースとかがブラウザで見れます。

mongoDBへのアクセス

Pythonからアクセスするサンプルです。
pymongoを使ってアクセスしてみます。

clientの指定

clientのhostはlocalhostではなく、コンテナの名前を指定します。

main.py
# OKな例
client = MongoClient('mongo', 27017)

# NGな例
client = MongoClient('localhost', 27017)

サンプルコード

コンテナ上のmongoDBにアクセスするサンプルコードです。

main.py
# coding: utf-8
from pymongo import MongoClient

client = MongoClient('mongo', 27017)
db = client.test_db
collection = db.test_collection

# レコードの全削除
collection.drop()

# 100万件のレコード
collection.insert_many([{"id": i}for i in range(100)])

# idが1のものを探す
results = collection.find({"id": 1})

for result in results:
    print(result)

コンテナを停止する

下記コマンドでコンテナを停止してネットワークを削除します。

docker-compose down
115
96
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
115
96