SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】MongoDBをDockerコンテナで構築する

MongoDBのDockerコンテナを構築します。


環境はAWS Linux上にDockerをインストールして実行しています。

Dockerコマンドで構築する

基本的なところはなるべくさらさら進めたい。
⇒やってみたらわからないことが多すぎてめちゃくちゃ苦労しました。

イメージの取得

まずはDockerイメージを取得してきます。
今回はバージョン4.2.5を選択しました。

docker image pull mongo:4.2.5
コンテナの生成

取得したイメージからコンテナを生成します。
即座に起動させないのは起動前にファイルを配置するためです。

※createってこうゆう使い方するんですね。

docker create -e MONGO_INITDB_DATABASE="test" -p 28001:27017 --name mongo1 mongo:4.2.5 mongod --auth

上記のコマンドでポイントは、以下の点です。

・ポートフォワーディング
「-p」オプションでポートを指定していて、コンテナで「27017」で起動しているMongoサービスをホストマシンでは「28001」ポートフォワードしています。
一応、ホストで起動しているサービスとの競合を防ぐ意味で「28001」を設定していますが、気にならなければ必須ではないです。


・認証の有効化
Mongoサービスの認証機能を有効化させるために引数を指定しています。
※そのまま起動すると有効化されないため。
「mongod --auth」の部分がそれです。

・環境変数の設定
環境変数「MONGO_INITDB_DATABASE」を設定します。
初期化に使用するDBを指定する環境変数になります。

実行ファイルをコンテナに配置する

コンテナ側でいちいちMongo ShellでDBの初期状態を生成しなくてもいい方法を探ります。
DBの初期状態として準備したいことは以下です。

・ユーザ作成(認証用)
・コレクションを作成
・ドキュメントを挿入

・setup.js

DBの初期状態セットアップ用のスクリプト。

const user = {
  user: 'wantan',
  pwd: 'wantan',
  roles: [{
    role: 'readWrite',
    db: 'test'
  }]
};

db.createUser(user);

use test;

db.createCollection('doc');

db.doc.insert({
    'name' : 'wantan',
    'num' : '1'
});

ファイルのコピー

docker container cp setup.js mongo1:/docker-entrypoint-initdb.d/setup.js

やってることとしては環境変数で設定したDBに対してユーザの作成、コレクションの作成、データの投入を行っています。
配置場所については、Dockerコンテナは初回起動する際に「docker-entrypoint.sh」というスクリプトが走りますが、その際に「/docker-entrypoint-initdb.d/」配下の「js」ファイルと「sh」ファイルが読み込まれるのでそこに配置します。


以下の記事を参考にさせていただきました。
【MongoDB】MongoDBのDockerコンテナ起動時に認証用ユーザーを作成する - Qiita

起動と疎通確認

Createしたコンテナを起動します。

docker container start mongo1

Robo3Tによって疎通確認を行います。
※A5M2ツールだと認証がうまくいかなったのでもしかするとツールによってできるできないがあるかもしれません

Robo3Tについては以下の記事も参照。
www.wantanblog.com

アドレスにはマシンのIPと今回はポートフォワーディングをしているのでホスト側に設定したポート番号を指定します。

f:id:wantanBlog:20200412032119p:plain

認証情報にはデータベース名とユーザ名、パスワードを入力してテストを実行。

f:id:wantanBlog:20200412032317p:plain

認証に成功すればOK。

f:id:wantanBlog:20200413005815p:plain


実際に開いてみると確かにコレクションが作成され、ドキュメントが追加されていることが確認できました。よかった!!

f:id:wantanBlog:20200413002505p:plain

Dockerfileで構築する

さて上記ではひとつひとつ実行していきましたが、複数の環境に構築する場合や複数人に実行してもらう場合にはどこかでつまったりすることがあるわけです。
なのでここはDockerの真骨頂でもあるDockerfileで構築を行っていきます。

勉強目的でやる場合には最初からDockerfileで構築をやらずひとつひとつ実行して確認していくのは有効であったと思います。

Dockerfileの内容
# ベースイメージmongo取得
FROM mongo:4.2.5

# 環境変数の設定
ENV MONGO_INITDB_DATABASE "test"

# ファイルのコピー
COPY setup.js /docker-entrypoint-initdb.d/

# 認証を有効化して起動
CMD ["mongod", "--auth"]

内容はシンプルです。
ファイルは前半で使用したものと同様です。

ビルド実行とコンテナ起動

・構成

/home/ec2-user/docker_work/mongo
┠mongoDfile
┗setup.js

・ビルド実行

docker build -t mongoim:1.0 -f mongoDfile /home/ec2-user/docker_work/mongo

・コンテナ起動
ビルドしたイメージをコンテナとして起動します。
ポート番号はコンテナ側はDockerfileでも指定できますが、ホスト側の指定はコンテナ起動時しかできない(わからなかった)のでここで指定しています。

docker container run -p 28002:27017 --name devmongo -d mongoim:1.0
疎通確認

先ほどと同様にRobo3Tにて疎通確認を行います。

f:id:wantanBlog:20200412235820p:plain

f:id:wantanBlog:20200412235840p:plain

f:id:wantanBlog:20200413005842p:plain

認証が成功すればOK。

先ほどと同じように自分でデータを挿入することなく、データが挿入されていることが確認できました。

f:id:wantanBlog:20200413002538p:plain

これにて、Dockerコマンドを用いた構築と同様のコンテナがDockerfileにて生成できたことが確認できました。

イメージの作成とDockerHubへのアップ

せっかくなので作成したコンテナをイメージ化してDockerHubへとアップロードしておきます。

コンテナのイメージ化

・コンテナのイメージ化

docker container commit -a "wantanblog" devmongo wantanblog/devmongoim:1.0
イメージのアップロード

・DockerHubへのログイン
アップロードするにあたってまずはログインをしておきます。

docker login

・DockerHubへのpush

docker image push wantanblog/devmongoim:1.0

f:id:wantanBlog:20200413002735p:plain

プッシュされていることが確認できました。

挙げたものは普通にプルできます。


ーーーーーーーーー
こんな感じのことを繰り返していけば少しは理解して覚えていけそうな気がしてきました。

・ソース類
docker/sample/mongo at master · wantanblog/docker · GitHub

※本記事は本書の内容に沿っているわけではありません。