ポイント: MongoDB を Docker コンテナとして実行することでデプロイが簡素化され、移植性が向上します。このガイドでは、Docker と Docker Compose のインストール手順、MongoDB コンテナの構成、および GUI インターフェイス用の Mongo Express のような高度なセットアップをカバーしています。
- Docker で MongoDB を使用する利点には、環境間の一貫性が含まれます。
- 高度な構成では、セキュアなアクセスとヘルスチェックによる監視が可能です。
MongoDB と Docker コンテナ
MongoDB は現在最も人気のある NoSQL データベース の一つであるため、MongoDB を Docker コンテナとして実行する必要があるかもしれません。この記事では、以下のことを学びます:
- Docker コンテナ内で MongoDB を使用する利点
- Docker をインストールする方法
- Docker Compose をインストールする方法
- Docker コンテナとして MongoDB を設定する方法
- MongoDB コンテナへの外部接続を確立する方法
- 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
2. 前提条件パッケージをインストールします。
sudo apt install apt-transport-https ca-certificates curl software-properties-common
3. 公式 Docker リポジトリから GPG キーを追加します。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. 公式 Docker リポジトリを APT ソースに追加します。
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5. Ubuntu パッケージリストを更新します。
sudo apt update
6. Docker リポジトリを確認します。
apt-cache policy docker-ce
7. Docker コミュニティエディションをインストールします。
sudo apt install docker-ce
8. 次のコマンドでインストールのステータスを確認します。サービスのステータスがアクティブ (実行中) と返される場合、Docker は正常にインストールされ、システムでアクティブです。
sudo systemctl status 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
2. ダウンロードしたバイナリに実行可能な権限を適用します。
>sudo chmod +x /usr/local/bin/docker-compose
3. Docker Compose のインストールを確認します。
docker-compose --version
Docker Compose コンテナを使用して MongoDB を設定
このセクションでは、Docker Compose ファイルを使用して MongoDB コンテナを設定する方法を説明します。Compose ファイルを作成する前に、検索コマンドを使用して公式の MongoDB コンテナイメージを検索します。
sudo docker search mongodb
検索結果は、「mongo」という名前の公式 MongoDB コンテナイメージが Docker コンテナレジストリに存在することを示しています。デフォルトでは、MongoDB コンテナはコンテナ内の /data/db ディレクトリ内にデータベースを格納します。
MongoDB を保持するための Docker Compose ディレクトリを作成
次に、Docker Compose ファイルを保持するための「mongodb」という名前のディレクトリを作成する必要があります。その中に、コンテナのデータベース位置にマッピングし、データベースへのローカルアクセスを可能にする「database」という名前の別のディレクトリを作成します。-pv オペレーターを使用してそれらの親フォルダを作成します。
>mkdir -pv mongodb/database
以下の 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 コンテナの開始
「mongodb」フォルダに移動し、docker-compose up コマンドを実行して MongoDB コンテナを起動します。-d オペレーターは、デタッチされたコンテナをバックグラウンドプロセスとして実行します。
sudo docker-compose up -d
up コマンドは、Docker レジストリから「mongo」イメージをプルし、docker-compose.yml ファイル内の指定されたパラメータを使用してコンテナを作成します。コンテナが実行中であり、ローカルフォルダが次のコマンドを使用してポピュレートされているかどうかを確認しましょう。-a オペレーターは、ステータスに関係なく、システム内のすべてのコンテナを表示します。
sudo docker ps -a
sudo tree mongodb
Docker コンテナ内の MongoDB と対話する
Docker exec コマンドを使用して、MongoDB コンテナのターミナルにアクセスできます。コンテナはデタッチモードで実行されているため、Docker インタラクティブターミナルを使用して接続を確立します。
sudo docker exec -it mongodb bash
コンテナの 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} ])
find コマンドを使用してドキュメントを検索します。
db.fruits.find().pretty()
MongoDB コンテナは、通常の MongoDB インストールのように動作し、基盤となるソフトウェアやハードウェアの構成についての懸念はありません。exit コマンドを使用して、MongoDB シェルとコンテナシェルの両方から退出できます。
MongoDB コンテナへの外部接続
MongoDB コンテナを作成する際、内部 MongoDB ポートをサーバー内の対応するポートにマッピングし、MongoDB コンテナを外部ネットワークに公開しました。以下の MongoDB Docker Compose の例では、mongo コマンドを適切なサーバーとポートにポイントすることで、外部エンドポイントからコンテナに接続する方法を示しています。
mongo 10.10.10.60:27017
MongoDB Docker Compose の例における find コマンドは、fruits コレクションとそのドキュメントを検索し、MongoDB コンテナに接続されていることを確認します。
show databases
use food
show collections
db.fruits.find().pretty()
データの耐障害性と MongoDB Docker コンテナの再作成
データベースをローカルフォルダにマッピングしたため、コンテナを削除しても、ローカルフォルダ内の保存されたデータを使用して新しい MongoDB コンテナを再作成できます。テストしてみましょう。次のことを行います:
- docker-compose down を使用してコンテナを削除します。
- 関連するイメージを削除します。
- Compose ファイルとローカルデータベースファイルを使用して新しい MongoDB データベースを再作成します。
MongoDB コンテナを削除します。
sudo docker-compose down
ローカル mongo イメージを削除します。
sudo docker rmi mongo
ローカルデータベースファイルを確認します。以下の出力から、コンテナを削除しても、ローカルディレクトリにマッピングされたデータは削除されなかったことが確認できます。
sudo tree mongodb
新しい MongoDB Docker コンテナを再作成します。これで、元の docker-compose.yml ファイルを使用してコンテナを再作成します。「mongodb」フォルダ内で次のコマンドを実行します。
sudo docker-compose up -d
MongoDB コンテナ内のデータを確認します。これで、コンテナ内で bash シェルにアクセスし、「fruits」コレクションを確認しましょう。
sudo docker exec -it mongodb bash
show databases
use food
db.fruits.find().pretty()
結果は、ローカルデータベース情報を持つ新しいコンテナを作成したことを示しています。さらに、ローカルフォルダ構造を新しいサーバーに移動し、docker-compose.yml ファイルを使用してコンテナを作成することで、コンテナを簡単に移動できます。データの移植性を高めるために、ローカルにデータを保存する代わりに Docker ボリュームを使用できます。
MongoDB コンテナのログファイルを監視
すべてのコンテナは、監視およびデバッグに使用できるログを作成します。Docker logs コマンドを使用して、監視するコンテナ名を指定してコンテナのログにアクセスできます。
sudo docker logs mongodb
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
上記の出力にはエラーが含まれていないため、すべてのサービスが正常に作成されたと仮定できます。両方のサービスにヘルスチェックを追加したため、Docker ps コマンドを使用してそれを確認できます。
sudo docker ps -a
Docker ps コマンドは、コンテナのヘルスステータスを印刷します。このヘルスステータスは、コンテナのヘルスチェックを定義した場合にのみ利用可能です。
Mongo Express での監視
これで、サーバー IP (http://10.10.10.60:8081) を使用して Mongo Express ウェブインターフェイスに移動しましょう。
Mongo Express インターフェイスは、MongoDB データベースと対話するための便利な方法を提供します。Mongo Express インターフェイスは、MongoDB サーバーインスタンスの概要ステータスを提供し、シンプルな監視機能を提供します。
結論
MongoDB が NoSQL データベースの中で人気であり、Docker コンテナで使用することで得られる利点から、この Docker MongoDB チュートリアルを作成しました。Docker コンテナで MongoDB を使用することで、一貫した開発および運用環境が作成され、スムーズなデプロイメントが可能になります。仮想マシンとは異なり、Docker コンテナはリソースを少なく要求します。シンプルな Docker コンテナと高度な Docker コンテナの習得により、ソフトウェア開発プロセスははるかに効率的でトラブルフリーになることができます。
MongoDBガイド
- MongoDBの概要: MongoDBの使い始め
- UbuntuとMacにMongoDBをインストールする方法
- MongoDBでのデータベースの作成
- MongoDBシェルの基本コマンド
- MongoDB Compass: Mongo GUIの使用
- MongoDBの役割ベースのアクセス制御(RBAC)の説明
- MongoDBのプロジェクションとプロジェクションオペレーターの説明
- MongoDBの集約関数の説明
- MongoDBのソート: sort()メソッドと例
- MongoDBでのPushとPullオペレーターの使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリオペレーターとその使用方法
- MongoDBの地理位置クエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス: 主要なインデックスタイプとその管理方法
- 知っておくべきトップMongoDBコマンド
- MongoDBレプリケーション: 完全な紹介
- MongoDBクラスタを設定する方法
- MongoDBシャーディング: 概念、例、およびチュートリアル
- MongoDB Atlas: 管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用量、管理、要件
- MongoDBバックアップのためのmongodumpの使用方法
- MongoDBバックアップを復元するためのMongorestoreの例
- PyMongoの使用方法
- MongoDBとNodeJSのためのMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra: NoSQLデータベースの比較
- PostgreSQL対MongoDB: データベースの比較
- MySQL対MongoDB: データベースの比較
- MongoDB認定: 紹介
これらの投稿は私自身のものであり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。