MongoDBをDockerコンテナとして実行する方法

MongoDBをDockerコンテナとして実行する方法

  • ITOps・DevOps
5分で読めます 更新日 Aug 26, 2024

ポイント: MongoDB を Docker コンテナとして実行することでデプロイが簡素化され、移植性が向上します。このガイドでは、Docker と Docker Compose のインストール手順、MongoDB コンテナの構成、および GUI インターフェイス用の Mongo Express のような高度なセットアップをカバーしています。

  • Docker で MongoDB を使用する利点には、環境間の一貫性が含まれます。
  • 高度な構成では、セキュアなアクセスとヘルスチェックによる監視が可能です。

MongoDB と Docker コンテナ

MongoDB は現在最も人気のある NoSQL データベース の一つであるため、MongoDB を Docker コンテナとして実行する必要があるかもしれません。この記事では、以下のことを学びます:

このチュートリアルの最後では、コンテナ化されたプロジェクトの拡張性の一端を垣間見ることができる高度な構成について見ていきます。MongoDB インスタンスと Mongo Express ウェブインターフェイスを専用ネットワーク上に持つ自己完結型プロジェクトを作成し、プロジェクトの移植性を最大化するために Docker ボリュームを使用します。それでは始めましょう。

Docker コンテナ内で MongoDB を使用する利点

Docker は、アプリケーションを作成、デプロイ、実行するためにコンテナを簡単に使用するツールです。コンテナ は、アプリケーションとそのすべての依存関係を単一のパッケージにまとめたソフトウェアの標準単位です。このようなコンテナの価値は、ソフトウェアがハードウェアや構成に関係なく任意のサーバープラットフォームで実行できることです。

Docker を使用して MongoDB インスタンスを実行できます。MongoDB Docker コンテナインスタンスを設定すると、ポータブルで拡張可能な NoSQL データベースを作成できます。このコンテナ化された MongoDB インスタンスは、サーバー構成を心配することなく、非コンテナ化された MongoDB インスタンスとまったく同様に動作します。

Docker のインストール

このチュートリアルでは、Ubuntu ベースのサーバー上でコンテナを実行するためのシンプルな Docker インストールを設定します。Docker のインストールパッケージは、公式 Docker リポジトリから取得できます。インストール手順は次のとおりです: 1. 既存のパッケージを更新します。

    sudo apt update && sudo apt upgrade -y
MongoDB Docker 1.1 - 既存のパッケージを更新

2. 前提条件パッケージをインストールします。

    sudo apt install apt-transport-https ca-certificates curl software-properties-common
MongoDB Docker 1.2 - 前提条件パッケージをインストール

3. 公式 Docker リポジトリから GPG キーを追加します。

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
MongoDB Docker 1.3 - GPGキー

4. 公式 Docker リポジトリを APT ソースに追加します。

    sudo add-apt-repository 
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
MongoDB Docker 1.4 - DockerリポジトリをAPTソースに

5. Ubuntu パッケージリストを更新します。

    sudo apt update
MongoDB Docker 1.5 - Ubuntuパッケージリストを更新

6. Docker リポジトリを確認します。

    apt-cache policy docker-ce
MongoDB Docker 1.6 - Dockerリポジトリを確認

7. Docker コミュニティエディションをインストールします。

    sudo apt install docker-ce
MongoDB Docker 1.7 - Dockerコミュニティ版

8. 次のコマンドでインストールのステータスを確認します。サービスのステータスがアクティブ (実行中) と返される場合、Docker は正常にインストールされ、システムでアクティブです。

    sudo systemctl status docker
MongoDB Docker 1.8 - Dockerインストールのステータスチェック

Docker Compose のインストール

コマンドラインインターフェイス (CLI) を使用して Docker コンテナを作成および管理できます。複数のコンテナや構成を扱う際に CLI を使用するのは面倒です。代わりに、Docker Compose を使用して複数のコンテナを単一のアプリケーションに統合できます。YAML 形式を使用して、docker-compose up または down コマンドを使用して簡単に実行できる Compose ファイルを作成します。これにより、Compose ファイル内のすべてのコンテナと構成が作成または削除されます。それでは、Ubuntu サーバーに Docker Compose をインストールしましょう。 1. Docker Compose の現在の安定リリースをインストールします。

    sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
MongoDB Docker 2.1 - Docker Composeをインストール

2. ダウンロードしたバイナリに実行可能な権限を適用します。

    >sudo chmod +x /usr/local/bin/docker-compose
MongoDB Docker 2.2 - 実行可能な権限を適用

3. Docker Compose のインストールを確認します。

    docker-compose --version
MongoDB Docker 2.3 - Docker Composeのインストールを確認

Docker Compose コンテナを使用して MongoDB を設定

このセクションでは、Docker Compose ファイルを使用して MongoDB コンテナを設定する方法を説明します。Compose ファイルを作成する前に、検索コマンドを使用して公式の MongoDB コンテナイメージを検索します。

    sudo docker search mongodb
MongoDB Docker 4.1 - MongoDBコンテナイメージ

検索結果は、「mongo」という名前の公式 MongoDB コンテナイメージが Docker コンテナレジストリに存在することを示しています。デフォルトでは、MongoDB コンテナはコンテナ内の /data/db ディレクトリ内にデータベースを格納します。

MongoDB を保持するための Docker Compose ディレクトリを作成

次に、Docker Compose ファイルを保持するための「mongodb」という名前のディレクトリを作成する必要があります。その中に、コンテナのデータベース位置にマッピングし、データベースへのローカルアクセスを可能にする「database」という名前の別のディレクトリを作成します。-pv オペレーターを使用してそれらの親フォルダを作成します。

    >mkdir -pv mongodb/database
MongoDB Docker 4.2 - Docker Composeディレクトリを作成

以下の docker-compose.yml ファイルは、「mongodb」ディレクトリ内に作成され、MongoDB コンテナを構築します。docker-compose.yml

    version: "3.8"
services:
mongodb:
image : mongo
container_name: mongodb
environment:
- PUID=1000
- PGID=1000
volumes:
- /home/barry/mongodb/database:/data/db
ports:
- 27017:27017
restart: unless-stopped

上記の Compose ファイルを作成するためにバージョン 3.8 を使用しました。Compose ファイルのバージョンは、次のことに直接関連しています:

  • Compose ファイル内で利用可能なオプション
  • 最小サポートされている Docker エンジンのバージョン

この場合は、Docker エンジン 19.03.0 以降です。

Docker コンテナ内の MongoDB サービス

Compose ファイルでは、「mongodb」というサービスを「mongo」という Docker イメージを使用して作成しました。コンテナの名前は「mongodb」で、コンテナ内のデータベースフォルダをローカルデータベースフォルダ (/home/barry/mongodb/database) にマッピングしました。このようなマッピングはバインドマウントボリュームとして知られています。環境変数はコンテナの「ユーザー」と「グループ」を定義するために使用されます。最後に、ローカルポート 27017 を内部ポート 27017 にマッピングしました。再起動ポリシーは、ユーザーによって停止されない限り再起動するように設定されています。プロジェクトのファイル構造は次のとおりです:

    tree mongodb
MongoDB Docker 4.3 - MongoDBサービス

MongoDB Docker コンテナの開始

「mongodb」フォルダに移動し、docker-compose up コマンドを実行して MongoDB コンテナを起動します。-d オペレーターは、デタッチされたコンテナをバックグラウンドプロセスとして実行します。

    sudo docker-compose up -d
MongoDB Docker 4.4 - MongoDBコンテナを開始

up コマンドは、Docker レジストリから「mongo」イメージをプルし、docker-compose.yml ファイル内の指定されたパラメータを使用してコンテナを作成します。コンテナが実行中であり、ローカルフォルダが次のコマンドを使用してポピュレートされているかどうかを確認しましょう。-a オペレーターは、ステータスに関係なく、システム内のすべてのコンテナを表示します。

    sudo docker ps -a
MongoDB Docker 4.5 - Dockerコンテナを確認
    sudo tree mongodb
MongoDB Docker 4.6 - MongoDbコンテナを確認

Docker コンテナ内の MongoDB と対話する

Docker exec コマンドを使用して、MongoDB コンテナのターミナルにアクセスできます。コンテナはデタッチモードで実行されているため、Docker インタラクティブターミナルを使用して接続を確立します。

    sudo docker exec -it mongodb bash
MongoDB Docker 5.1 - MongoDbターミナルにアクセス

コンテナの bash ターミナル内で、mongo コマンドを呼び出して MongoDB にアクセスします。この MongoDB Docker Compose の例では、「food」という名前のデータベースと「fruits」という名前のコレクションを作成し、3 つのドキュメントを追加します。 1. データベースを切り替えます。

    use food

2. コレクションを作成します。

    db.createCollection("fruits")

3. ドキュメントを挿入します。

    db.fruits.insertMany([ {name: "apple", origin: "usa", price: 5}, {name: "orange", origin: "italy", price: 3}, {name: "mango", origin: "malaysia", price: 3} ])
MongoDB Docker 5.2 - データベースを作成

find コマンドを使用してドキュメントを検索します。

    db.fruits.find().pretty()
MongoDB Docker 5.3 - ドキュメントを検索

MongoDB コンテナは、通常の MongoDB インストールのように動作し、基盤となるソフトウェアやハードウェアの構成についての懸念はありません。exit コマンドを使用して、MongoDB シェルとコンテナシェルの両方から退出できます。

MongoDB Docker 5.4 - コマンドを終了

MongoDB コンテナへの外部接続

MongoDB コンテナを作成する際、内部 MongoDB ポートをサーバー内の対応するポートにマッピングし、MongoDB コンテナを外部ネットワークに公開しました。以下の MongoDB Docker Compose の例では、mongo コマンドを適切なサーバーとポートにポイントすることで、外部エンドポイントからコンテナに接続する方法を示しています。

    mongo 10.10.10.60:27017
MongoDB Docker Compose 6.1 - 外部接続

MongoDB Docker Compose の例における find コマンドは、fruits コレクションとそのドキュメントを検索し、MongoDB コンテナに接続されていることを確認します。

    show databases
use food
show collections
db.fruits.find().pretty()
MongoDB Docker 6.2 - 接続を確認

データの耐障害性と MongoDB Docker コンテナの再作成

データベースをローカルフォルダにマッピングしたため、コンテナを削除しても、ローカルフォルダ内の保存されたデータを使用して新しい MongoDB コンテナを再作成できます。テストしてみましょう。次のことを行います:

  1. docker-compose down を使用してコンテナを削除します。
  2. 関連するイメージを削除します。
  3. Compose ファイルとローカルデータベースファイルを使用して新しい MongoDB データベースを再作成します。

MongoDB コンテナを削除します。

    sudo docker-compose down
MongoDB Docker 7.1 - 新しいコンテナを作成

ローカル mongo イメージを削除します。

    sudo docker rmi mongo
MongoDB Docker 7.1 - Mongoイメージを削除

ローカルデータベースファイルを確認します。以下の出力から、コンテナを削除しても、ローカルディレクトリにマッピングされたデータは削除されなかったことが確認できます。

    sudo tree mongodb
MongoDB Docker 7.2 - データベースファイルを確認

新しい MongoDB Docker コンテナを再作成します。これで、元の docker-compose.yml ファイルを使用してコンテナを再作成します。「mongodb」フォルダ内で次のコマンドを実行します。

    sudo docker-compose up -d
MongoDB Docker 7.3 - Mongoコンテナを再作成

MongoDB コンテナ内のデータを確認します。これで、コンテナ内で bash シェルにアクセスし、「fruits」コレクションを確認しましょう。

    sudo docker exec -it mongodb bash
MongoDB Docker 7.4 - Mongoコンテナを確認
    show databases
use food
db.fruits.find().pretty()
MongoDB Docker 7.5 - データベースを表示

結果は、ローカルデータベース情報を持つ新しいコンテナを作成したことを示しています。さらに、ローカルフォルダ構造を新しいサーバーに移動し、docker-compose.yml ファイルを使用してコンテナを作成することで、コンテナを簡単に移動できます。データの移植性を高めるために、ローカルにデータを保存する代わりに Docker ボリュームを使用できます。

MongoDB コンテナのログファイルを監視

すべてのコンテナは、監視およびデバッグに使用できるログを作成します。Docker logs コマンドを使用して、監視するコンテナ名を指定してコンテナのログにアクセスできます。

    sudo docker logs mongodb
MongoDB Docker 8.1 - ログファイルにアクセス

MongoDB 用の高度な Docker コンテナを設定

このセクションでは、データベースにアクセスするためにユーザー名とパスワードを必要とする安全な MongoDB コンテナを作成します。以前の MongoDB Docker Compose の例では、データベースデータをローカルフォルダにマッピングしました。この方法は面倒で、Docker コンテナを移動するときに手動での介入が必要です。Docker ボリュームを使用することで、Docker ネイティブで永続的なボリュームを作成し、Docker インストール間で簡単に転送できるようになります。MongoDB インスタンスを操作するために CLI を使用できますが、グラフィカルユーザーインターフェイス (GUI) の方が便利です。Mongo Express は、コンテナ化されたアプリケーションとしても実行できるウェブベースの MongoDB 管理インターフェイスです。docker-compose ファイルは、すべての要件をキャプチャする単一の YAML ファイルとして便利です。docker-compose.yml

    version: "3.8"
services:
mongodb:
image: mongo
container_name: mongodb
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=pass12345
volumes:
- mongodb-data:/data/db
networks:
- mongodb_network
ports:
- 27017:27017
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongo 10.10.10.60:27017/test --quiet
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
mongo-express:
image: mongo-express
container_name: mongo-express
environment:
- ME_CONFIG_MONGODB_SERVER=mongodb
- ME_CONFIG_MONGODB_ENABLE_ADMIN=true
- ME_CONFIG_MONGODB_ADMINUSERNAME=root
- ME_CONFIG_MONGODB_ADMINPASSWORD=pass12345
- ME_CONFIG_BASICAUTH_USERNAME=admin
- ME_CONFIG_BASICAUTH_PASSWORD=admin123
volumes:
- mongodb-data
depends_on:
- mongodb
networks:
- mongodb_network
ports:
- 8081:8081
healthcheck:
test: wget --quiet --tries=3 --spider http://admin:[email protected]:8081 || exit 1
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
volumes:
mongodb-data:
name: mongodb-data
networks:
mongodb_network:
name: mongodb_network

それでは、上記の Compose ファイルを分解してみましょう。まず、2 つのサービスを作成しました:

  • mongodb
  • mongo-express

mongodb サービスでは、以下の環境変数を使用して「mongodb」コンテナのルートユーザー名とパスワードを構成しました:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

データボリュームを mongodb-data Docker ボリュームにマッピングし、mongodb_network としてネットワークを定義し、ポート 27017 を開放しました。mongo-express サービスの環境変数は:

  • ME_CONFIG_MONGODB_SERVER – MongoDB サービス (mongodb)
  • ME_CONFIG_MONGODB_ENABLE_ADMIN – 管理者としてすべてのデータベースへのアクセスを有効にする
  • ME_CONFIG_MONGODB_ADMINUSERNAME – MongoDB データベースの管理者ユーザー名
  • ME_CONFIG_MONGODB_ADMINPASSWORD – MongoDB データベースの管理者パスワード
  • ME_CONFIG_BASICAUTH_USERNAME – Mongo-Express ウェブインターフェイスへのアクセスユーザー名
  • ME_CONFIG_BASICAUTH_PASSWORD – Mongo-Express ウェブインターフェイスへのアクセスパスワード

さらに、mongo-express サービスが mongodb サービスに依存するように構成しました。ネットワークを同じ mongodb_network に割り当て、ボリュームを mongodb-data ボリュームにマッピングしました。ウェブインターフェイスへのアクセスを可能にするためにポート 8081 を公開しました。両方のサービスを Docker ヘルスチェックを使用して監視できます。mongodb サービスは MongoDB データベースを ping し、mongo-express サービスは指定された資格情報を使用してウェブページにアクセスしようとします。最後に、プロジェクト用に「mongodb-data」というボリュームと「mongodb_network」というネットワークを定義しました。Docker Compose ファイルを起動します。

    sudo docker-compose up -d
MongoDB Docker 9.1 - 高度なコンテナセットアップ

上記の出力にはエラーが含まれていないため、すべてのサービスが正常に作成されたと仮定できます。両方のサービスにヘルスチェックを追加したため、Docker ps コマンドを使用してそれを確認できます。

    sudo docker ps -a
MongoDB Docker 9.2 - PSコマンド

Docker ps コマンドは、コンテナのヘルスステータスを印刷します。このヘルスステータスは、コンテナのヘルスチェックを定義した場合にのみ利用可能です。

Mongo Express での監視

これで、サーバー IP (http://10.10.10.60:8081) を使用して Mongo Express ウェブインターフェイスに移動しましょう。

MongoDB Docker 9.3 - Mongo Expressの監視

Mongo Express インターフェイスは、MongoDB データベースと対話するための便利な方法を提供します。Mongo Express インターフェイスは、MongoDB サーバーインスタンスの概要ステータスを提供し、シンプルな監視機能を提供します。

結論

MongoDB が NoSQL データベースの中で人気であり、Docker コンテナで使用することで得られる利点から、この Docker MongoDB チュートリアルを作成しました。Docker コンテナで MongoDB を使用することで、一貫した開発および運用環境が作成され、スムーズなデプロイメントが可能になります。仮想マシンとは異なり、Docker コンテナはリソースを少なく要求します。シンプルな Docker コンテナと高度な Docker コンテナの習得により、ソフトウェア開発プロセスははるかに効率的でトラブルフリーになることができます。

MongoDBガイド

  1. MongoDBの概要: MongoDBの使い始め
  2. UbuntuとMacにMongoDBをインストールする方法
  3. MongoDBでのデータベースの作成
  4. MongoDBシェルの基本コマンド
  5. MongoDB Compass: Mongo GUIの使用
  6. MongoDBの役割ベースのアクセス制御(RBAC)の説明
  7. MongoDBのプロジェクションとプロジェクションオペレーターの説明
  8. MongoDBの集約関数の説明
  9. MongoDBのソート: sort()メソッドと例
  10. MongoDBでのPushとPullオペレーターの使用
  11. MongoDBの$unwindの使用方法
  12. 23の一般的なMongoDBクエリオペレーターとその使用方法
  13. MongoDBの地理位置クエリの例
  14. MongoDBトランザクションの紹介
  15. MongoDBインデックス: 主要なインデックスタイプとその管理方法
  16. 知っておくべきトップMongoDBコマンド
  17. MongoDBレプリケーション: 完全な紹介
  18. MongoDBクラスタを設定する方法
  19. MongoDBシャーディング: 概念、例、およびチュートリアル
  20. MongoDB Atlas: 管理されたMongoDBの設定と使用
  21. MongoDBをDockerコンテナとして実行する方法
  22. MongoDBのメモリ使用量、管理、要件
  23. MongoDBバックアップのためのmongodumpの使用方法
  24. MongoDBバックアップを復元するためのMongorestoreの例
  25. PyMongoの使用方法
  26. MongoDBとNodeJSのためのMongooseの使用方法
  27. MongoDBチートシート
  28. MongoDB対Cassandra: NoSQLデータベースの比較
  29. PostgreSQL対MongoDB: データベースの比較
  30. MySQL対MongoDB: データベースの比較
  31. MongoDB認定: 紹介

これらの投稿は私自身のものであり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。

ITOps・DevOpsの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。