Docker MongoDBコンテナのデプロイと管理方法

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です。

sudo docker pull mongo

以下のように、コマンドは自動的にイメージの最新バージョンを取得し、latestとしてタグ付けします。

Pulling mongo image

次に、以下のdocker imagesコマンドを実行して、サーバー上で利用可能なすべてのイメージをリストします。

sudo docker images

下記に、latestとしてタグ付けされたMongoDBイメージが表示されます。

Listing all Docker images

MongoDBのDockerコンテナを展開します。

ダウンロードしたMongoDBイメージから、MongoDBコンテナを展開できます。mongo実行可能ファイルでMongoDBコンテナを初期化し、データディレクトリを作成します。その後、Dockerコンテナのデータ領域とホストマシンとのマッピングを定義します。

1. 下記のmkdirコマンドを実行して、mongodataという名前のデータディレクトリを作成します。

sudo mkdir -p /mongodata

2. 次に、以下のdocker runコマンドを実行して、mymongoという名前のコンテナを作成します。また、コンテナはインタラクティブな疑似TTY(-it)で起動されます。

最後に、新しく作成されたディレクトリmongodataは、内部ディレクトリ/data/dbにバインドされます(-v)。-dオプションは、コンテナをデタッチモードで起動し、バックグラウンドプロセスとして実行し、作成時にコンソール出力を返します。

システムは、コンテナを実行するときに/data/dbディレクトリを自動的に作成し、コンテナ内で行った変更のデータを保存します。このディレクトリは読み取り専用のモードで実行され、ホストシステムで永続的なデータストレージを有効にします。

sudo docker run -it -v mongodata:/data/db --name mymongo -d mongo

コマンドが正常に完了すると、以下のような出力が表示されます。

Deploying MongoDB Container

3. 最後に、以下のdocker psコマンドを実行して、コンテナのIDを特定し、その状態を確認します。docker psコマンドは、現在実行中のコンテナに関するすべての情報を表示します。

docker psコマンドは、通常のLinuxのpsコマンドと同等です。

sudo docker ps

以下の出力では、ポートセクションが表示され、コンテナに割り当てられたすべてのポートが入力接続を待機していることがリストされています。

この例では、ポート27017がホストにマップされています。以下の出力は、このコンテナ上のMongoDBインスタンスにホストからlocalhost:27017経由でアクセスできることを示しています。

Checking Docker MongoDB Container Status

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

Reading Docker Container Log File

BashシェルにDocker MongoDBコンテナをアタッチする

あなたはたった今Docker MongoDBコンテナをデプロイしましたが、それをどのように管理しますか?docker execコマンドを使用して、まずDockerコンテナをBashシェルにアタッチしてください。

コンテナをBashシェルにアタッチすることは重要です。なぜなら、コンテナは現在デタッチモード(バックグラウンドで実行)で実行されているためです。そして、コンテナがバックグラウンドで実行されている場合、コンテナは入力を受け取らず、出力も表示しません。

docker execコマンドを以下のように実行して、コンテナ(mymongo)をBashシェルにアタッチしてください。

sudo docker exec -it mymongo bash

コマンドが完了すると、プロンプトは以下のように変わります。ユニークな英数字(77782fa95314)はコンテナIDです。

コンテナIDは、名前の競合を回避し、ホスト間でコンテナを効果的に識別するために重要ですので、それらを変更しないようにしてください。

Attaching Docker MongoDB Container to Bash Shell

今、mongoコマンドを引数なしで実行して、コンテナ(mymongo)内のMongoDBシェルにログインしてください。MongoDBシェルは、mongoクエリ/コマンドを実行する場所です。

コンテナに入ったら、今度はコンテナ内でルートユーザーになったので、sudo接頭辞を付けずに任意のコマンドを実行できます。コンテナで行ったすべての変更は、ホストシステムに影響しません。

mongo

以下に表示されるプロンプトを見ることで、現在MongoDBシェル内にいることがわかります。

Logging in to the MongoDB shell

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

Listing Available Commands in MongoDB Shell

管理用のMongoDBユーザーを作成する

Dockerコンテナ内にMongoDBサーバーをデプロイした後、管理用のMongoDBユーザーを作成します。管理ユーザーにより、MongoDBサーバーに接続してデータベースを管理できます。

1. 再びMongoDBシェルにログインし、以下のuseコマンドを実行して最初にadminデータベースに切り替えてください。これにより、管理ユーザーにデータベースを管理する権限が与えられます。

use admin
Switching to the Admin Database

MongoDBプロンプトに以下のコードをコピーして貼り付けて、管理ユーザーを作成します。以下のコードは、db.createUser()メソッドを使用して管理ロールを持つユーザーを作成します。

# 管理ユーザーを作成
db.createUser(
{
	# 管理ユーザーのユーザー名を設定
	user: "ata",
	# 管理ユーザーのパスワードを設定
	pwd: "password123",
	# 管理ユーザーの役割を設定
	roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

コードが機能すれば、MongoDBプロンプトで以下のようなメッセージが表示されます。

Creating an Administrative New User

3. 以下のquit()クエリを実行してMongoDBシェルを終了します。

quit()

4. 最後に、以下のmongoコマンドを実行して、作成した管理ユーザー(ata)を使用してMongoDBサーバーに接続します。プロンプトに表示される管理ユーザーのパスワードを入力してください。

mongo -u ata -p --authenticationDatabase admin

以下のように、MongoDBサーバーが正常に接続された場合、MongoDBサーバーのバージョンが表示されます。

Connecting to the MongoDB Server

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

use admin
show users

以下、作成した管理者ユーザーがリストに表示されていることがわかります。

Listing Users in Database

MongoDBデータベースの作成

Docker MongoDBコンテナの管理は、データベースを作成することなしには完全ではありません。MongoDBシェルを介してデータを格納する新しいMongoDBデータベースを作成します。

1. Dockerコンテナ内の対話型セッションから、以下のshow dbsコマンドを実行して、サーバー内のすべてのデータベースをリストします。

show dbs

以下、管理データベース、設定データベース、およびローカルデータベースが表示されます。MongoDBシェルは、これらのデータベースをデフォルトですべてのMongoDBサーバーに作成します。

Listing all MongoDB Databases

2. 次に、以下のuseコマンドを実行して、新しいデータベースを作成します。選択したデータベース名で<database_name>を置き換えてください。ただし、この例ではデータベースの名前をlinuxとします。

useクエリは、指定した場合に現在のデータベースを切り替えます。存在しない場合、useクエリは新しいデータベースを作成し、自動的にそれに切り替えます。

use <database_name>
Creating a new MongoDB Database

3. 以前と同様に(ステップ1で)、作成したデータベースが存在するかどうかを確認するためにshow dbsコマンドを再実行します。

show dbs

まだ新しく作成されたデータベース(Linux)がリストに表示されていませんか? MongoDBは、初めてデータを格納するときにのみデータベースを構築します。データはコレクションドキュメントの形式である可能性があります。

Listing all MongoDB Databases

4. 以下のコードをMongoDBシェルにコピー/貼り付けてEnterを押します。

以下のコードは、linux_versionという新しいコレクションを作成します。これを好きな名前に変更できます。コレクションには、キー:値のペア形式のデータが含まれています。

# insertOneメソッドを使用してデータを挿入
db.linux_version.insertOne(
	# データベースに挿入するキー:値のペア
	{ "debian" : "11",
	"ubuntu" : "20.04",
	"rocky linux" : "8.4",
	"alma linux" : "8"
	}
)

以下の出力では、linux_versionコレクションが作成され、ObjectIDが付いているのが見えます。

Showing collection with its ID

5. show collectionsコマンドを実行してコレクションのリストを表示し、新しいコレクションlinux_versionが存在するか確認します。

show collections

以下では、linux_versionコレクションが正常に作成されているのが見えます。

Showing List of Collections

6. 最後に、以下のコマンドを実行して、linux_version コレクションに挿入したデータが正しいか確認します。 pretty() メソッドを使用すると、データを人が読める形式で表示できます。

db.linux_version.find().pretty()

データベースでデータを変更した場合は、Update() メソッドを使用してください。

以下の出力ははるかに読みやすい形式です。

Viewing Data from MongoDB Database

Docker MongoDB コンテナを再起動する

これで、Docker MongoDB コンテナが正常に実行されています。ただし、コンテナの使用がなくなった場合や動作しなくなった場合はどうすればよいでしょうか?いくつかのDockerコマンドが、MongoDB Dockerコンテナを停止、再起動、または削除するのに役立ちます。

1. 以下の docker ps コマンドを実行して、実行中のすべてのコンテナを一覧表示します。

sudo docker ps

コンテナを停止、再起動、または削除したいコンテナの名前とコンテナIDを以下に示すようにメモしてください。

Showing all running docker containers

2. 次に、実行中のMongoDBコンテナを停止するには、以下のいずれかの docker stop コマンドを実行します。

sudo docker stop mymongo
sudo docker stop container-ID

3. 先ほど行ったように、コンテナがシャットダウンしたかどうかを確認するために docker ps コマンドを再実行します(ステップ1)。

sudo docker ps

以下のように、コンテナが実行中のコンテナのリストに表示されていないことがわかります。これにより、コンテナを正常に停止させたことが示されます。

Listing all Containers

4. コンテナを再起動する場合は、以下のいずれかのdocker startコマンドを実行してください。

sudo docker start mymongo
sudo docker start container-ID

5. 最後に、コンテナが実行中かどうかを確認するためにdocker psコマンドを再実行してください。

sudo docker ps

おそらく、コンテナをもう使用しない場合があります。その場合は、まずコンテナを停止し、rmコマンドを実行してコンテナを削除する必要があります。例えば、次のように実行します:sudo docker container rm mongodb。先ほどの例と同様に、mongodbをコンテナ名またはコンテナIDに置き換えてください。

結論

このチュートリアルでは、DockerのMongoDBコンテナを展開し、管理する方法について学びました。管理者ユーザーを作成してデータベースを作成し、データを格納することができるようになりました。不要なコンテナを停止、再起動、削除してDockerイメージを整理することができることに気付きました。

Dockerを使用してMongoDBを展開し、管理することは、コンテナ化技術を活用し、オーバーヘッドを削減するための第一歩です。なぜこの第一歩を利用して、MongoDBをさらに探求し、DockerのMongoDBコンテナがプロジェクトにどのように役立つかを見てみませんか?

Source:
https://adamtheautomator.com/docker-mongodb/