MongoDBは人気のあるオープンソースのドキュメントデータベースであり、高いパフォーマンスと大きな柔軟性を提供します。しかし、MongoDBデータベースをコンテナ化したことがありますか?もしそうでなければ、驚きが待っています!
このチュートリアルでは、Dockerを使用してMongoDBを効果的に展開、セキュリティを確保し、管理する方法を学びます。それでは、Docker MongoDBコンテナの展開の達人になるために読み進めてください!
前提条件
このチュートリアルでは、実演を行います。一緒に進むためには、以下が必要です:
- Ubuntuマシン – このチュートリアルでは、Ubuntu 20.04 LTS を使用します。
- A user with
sudo
permission - Docker – このチュートリアルでは、Docker 20.10.9 を使用します。
Docker MongoDBイメージのダウンロード
Docker MongoDBコンテナを展開して管理するには、まずDocker HubからMongoDBイメージをダウンロードして、MongoDBコンテナをローカルで実行する必要があります。
以下のdocker
コマンドを実行して、MongoDB Community Edition(CE)イメージをダウンロードします(pull mongo
)。このイメージはDocker Hubでホストされています。執筆時点での最新バージョンは4.2です。
以下のように、コマンドは自動的にイメージの最新バージョンを取得し、latestとしてタグ付けします。

次に、以下のdocker images
コマンドを実行して、サーバー上で利用可能なすべてのイメージをリストします。
下記に、latestとしてタグ付けされたMongoDBイメージが表示されます。

MongoDBのDockerコンテナを展開します。
ダウンロードしたMongoDBイメージから、MongoDBコンテナを展開できます。mongo実行可能ファイルでMongoDBコンテナを初期化し、データディレクトリを作成します。その後、Dockerコンテナのデータ領域とホストマシンとのマッピングを定義します。
1. 下記のmkdir
コマンドを実行して、mongodata
という名前のデータディレクトリを作成します。
2. 次に、以下のdocker run
コマンドを実行して、mymongo
という名前のコンテナを作成します。また、コンテナはインタラクティブな疑似TTY(-it
)で起動されます。
最後に、新しく作成されたディレクトリmongodataは、内部ディレクトリ/data/dbにバインドされます(-v
)。-d
オプションは、コンテナをデタッチモードで起動し、バックグラウンドプロセスとして実行し、作成時にコンソール出力を返します。
システムは、コンテナを実行するときに/data/dbディレクトリを自動的に作成し、コンテナ内で行った変更のデータを保存します。このディレクトリは読み取り専用のモードで実行され、ホストシステムで永続的なデータストレージを有効にします。
コマンドが正常に完了すると、以下のような出力が表示されます。

3. 最後に、以下のdocker ps
コマンドを実行して、コンテナのIDを特定し、その状態を確認します。docker ps
コマンドは、現在実行中のコンテナに関するすべての情報を表示します。
docker ps
コマンドは、通常のLinuxのps
コマンドと同等です。
以下の出力では、ポートセクションが表示され、コンテナに割り当てられたすべてのポートが入力接続を待機していることがリストされています。
この例では、ポート27017がホストにマップされています。以下の出力は、このコンテナ上のMongoDBインスタンスにホストからlocalhost:27017経由でアクセスできることを示しています。

もし何かが間違っているときにMongoデータベース/インスタンスで何が起こったのかを判断するために、
mymongo
コンテナのログファイルを見たい場合は、docker logs
コマンドを実行してください。次のようにしてください:sudo docker logs docker-container
。

BashシェルにDocker MongoDBコンテナをアタッチする
あなたはたった今Docker MongoDBコンテナをデプロイしましたが、それをどのように管理しますか?docker exec
コマンドを使用して、まずDockerコンテナをBashシェルにアタッチしてください。
コンテナをBashシェルにアタッチすることは重要です。なぜなら、コンテナは現在デタッチモード(バックグラウンドで実行)で実行されているためです。そして、コンテナがバックグラウンドで実行されている場合、コンテナは入力を受け取らず、出力も表示しません。
docker exec
コマンドを以下のように実行して、コンテナ(mymongo
)をBashシェルにアタッチしてください。
コマンドが完了すると、プロンプトは以下のように変わります。ユニークな英数字(77782fa95314)はコンテナIDです。
コンテナIDは、名前の競合を回避し、ホスト間でコンテナを効果的に識別するために重要ですので、それらを変更しないようにしてください。

今、mongo
コマンドを引数なしで実行して、コンテナ(mymongo)内のMongoDBシェルにログインしてください。MongoDBシェルは、mongoクエリ/コマンドを実行する場所です。
コンテナに入ったら、今度はコンテナ内でルートユーザーになったので、
sudo
接頭辞を付けずに任意のコマンドを実行できます。コンテナで行ったすべての変更は、ホストシステムに影響しません。
以下に表示されるプロンプトを見ることで、現在MongoDBシェル内にいることがわかります。

MongoDBシェルで利用可能なすべてのコマンドを表示する場合は、以下に示すように
help
コマンドを実行してください。

管理用のMongoDBユーザーを作成する
Dockerコンテナ内にMongoDBサーバーをデプロイした後、管理用のMongoDBユーザーを作成します。管理ユーザーにより、MongoDBサーバーに接続してデータベースを管理できます。
1. 再びMongoDBシェルにログインし、以下のuse
コマンドを実行して最初にadmin
データベースに切り替えてください。これにより、管理ユーザーにデータベースを管理する権限が与えられます。

MongoDBプロンプトに以下のコードをコピーして貼り付けて、管理ユーザーを作成します。以下のコードは、db.createUser()
メソッドを使用して管理ロールを持つユーザーを作成します。
コードが機能すれば、MongoDBプロンプトで以下のようなメッセージが表示されます。

3. 以下のquit()
クエリを実行してMongoDBシェルを終了します。
4. 最後に、以下のmongo
コマンドを実行して、作成した管理ユーザー(ata
)を使用してMongoDBサーバーに接続します。プロンプトに表示される管理ユーザーのパスワードを入力してください。
以下のように、MongoDBサーバーが正常に接続された場合、MongoDBサーバーのバージョンが表示されます。

おそらく、管理者ユーザーをさらにテストしたいと思っているのでしょう。その場合は、以下のコマンドを実行してデータベース内のすべてのユーザーを表示してください。
以下、作成した管理者ユーザーがリストに表示されていることがわかります。

MongoDBデータベースの作成
Docker MongoDBコンテナの管理は、データベースを作成することなしには完全ではありません。MongoDBシェルを介してデータを格納する新しいMongoDBデータベースを作成します。
1. Dockerコンテナ内の対話型セッションから、以下のshow dbs
コマンドを実行して、サーバー内のすべてのデータベースをリストします。
以下、管理データベース、設定データベース、およびローカルデータベースが表示されます。MongoDBシェルは、これらのデータベースをデフォルトですべてのMongoDBサーバーに作成します。

2. 次に、以下のuse
コマンドを実行して、新しいデータベースを作成します。選択したデータベース名で<database_name>
を置き換えてください。ただし、この例ではデータベースの名前をlinux
とします。
use
クエリは、指定した場合に現在のデータベースを切り替えます。存在しない場合、use
クエリは新しいデータベースを作成し、自動的にそれに切り替えます。

3. 以前と同様に(ステップ1で)、作成したデータベースが存在するかどうかを確認するためにshow dbs
コマンドを再実行します。
まだ新しく作成されたデータベース(Linux)がリストに表示されていませんか? MongoDBは、初めてデータを格納するときにのみデータベースを構築します。データはコレクションやドキュメントの形式である可能性があります。

4. 以下のコードをMongoDBシェルにコピー/貼り付けてEnterを押します。
以下のコードは、linux_version
という新しいコレクションを作成します。これを好きな名前に変更できます。コレクションには、キー:値のペア形式のデータが含まれています。
以下の出力では、linux_version
コレクションが作成され、ObjectIDが付いているのが見えます。

5. show collections
コマンドを実行してコレクションのリストを表示し、新しいコレクションlinux_version
が存在するか確認します。
以下では、linux_versionコレクションが正常に作成されているのが見えます。

6. 最後に、以下のコマンドを実行して、linux_version
コレクションに挿入したデータが正しいか確認します。 pretty() メソッドを使用すると、データを人が読める形式で表示できます。
データベースでデータを変更した場合は、
Update()
メソッドを使用してください。
以下の出力ははるかに読みやすい形式です。

Docker MongoDB コンテナを再起動する
これで、Docker MongoDB コンテナが正常に実行されています。ただし、コンテナの使用がなくなった場合や動作しなくなった場合はどうすればよいでしょうか?いくつかのDockerコマンドが、MongoDB Dockerコンテナを停止、再起動、または削除するのに役立ちます。
1. 以下の docker ps
コマンドを実行して、実行中のすべてのコンテナを一覧表示します。
コンテナを停止、再起動、または削除したいコンテナの名前とコンテナIDを以下に示すようにメモしてください。

2. 次に、実行中のMongoDBコンテナを停止するには、以下のいずれかの docker stop
コマンドを実行します。
3. 先ほど行ったように、コンテナがシャットダウンしたかどうかを確認するために docker ps
コマンドを再実行します(ステップ1)。
以下のように、コンテナが実行中のコンテナのリストに表示されていないことがわかります。これにより、コンテナを正常に停止させたことが示されます。

4. コンテナを再起動する場合は、以下のいずれかのdocker start
コマンドを実行してください。
5. 最後に、コンテナが実行中かどうかを確認するためにdocker ps
コマンドを再実行してください。
おそらく、コンテナをもう使用しない場合があります。その場合は、まずコンテナを停止し、
rm
コマンドを実行してコンテナを削除する必要があります。例えば、次のように実行します:sudo docker container rm mongodb
。先ほどの例と同様に、mongodb
をコンテナ名またはコンテナIDに置き換えてください。
結論
このチュートリアルでは、DockerのMongoDBコンテナを展開し、管理する方法について学びました。管理者ユーザーを作成してデータベースを作成し、データを格納することができるようになりました。不要なコンテナを停止、再起動、削除してDockerイメージを整理することができることに気付きました。
Dockerを使用してMongoDBを展開し、管理することは、コンテナ化技術を活用し、オーバーヘッドを削減するための第一歩です。なぜこの第一歩を利用して、MongoDBをさらに探求し、DockerのMongoDBコンテナがプロジェクトにどのように役立つかを見てみませんか?