MongoDB の Docker 化

この例では、MongoDB がインストール済みの Docker イメージを、どのようにして構築するか学びます。また、イメージを Docker Hub レジストリpush して他人と共有する方法も分かるようになります。

注釈

このガイドでは MongoDB の構築方法を紹介しますが、 Docker Hub の公式イメージを使っても構いません。

Docker を使い MongoDB インスタンスをデプロイすると、次のようなメリットがあります。

  • 簡単なメンテナンス、MongoDB インスタンスの高い設定性
  • ミリ秒以内で実行と開始
  • どこからでも接続可能で共有できるイメージに基づく

注釈

sudo が好きでなければ、 root 以外のアクセス をご覧ください。

MongoDB 用の Dockerfile を作成

構築するための Dockerfile を作成しましょう。

$ nano Dockerfile

オプションですが、 Dockerfile の冒頭に自身の役割などをコメントしておくと便利です。

# MongoDB の Docker化:MongoDB イメージを構築する Dockerfile
# ubuntu:latest をベースとし、MongoDB は以下の手順でインストール:
# http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

ちなみに

Dockerfile は柔軟性がありますが、特定の書式に従う必要があります。まず最初に必要になるのは、これから作成する MongoDB を Docker 化 したイメージの親にあたるイメージの名前の定義です。

Docker Hub Ubuntu レポジトリにある Ubuntu の最新(latest)バージョンを使い、イメージを構築します。

# 書式:FROM    レポジトリ[:バージョン]
FROM       ubuntu:latest

続けて、 DockerfileMAINTAINER (メンテナ/担当者)を宣言します。

# 書式:MAINTAINER 名前  <email@addr.ess>
MAINTAINER M.Y. Name <myname@addr.ess>

注釈

Ubuntu システムにも MongoDB パッケージがありますが、作成日が古いものです。そのため、この例では公式の MongoDB パッケージを使います。

MongoDB 公開 GPG 鍵を取り込みます。また、パッケージ・マネージャ用に MongoDB レポジトリ・ファイルも作成します。

# インストール:
# MongoDB 公開 GPG 鍵を取り込み、MongoDB リストファイルを作成
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.0.list

この初期準備が終われば、パッケージを更新し、MongoDB をインストールできます。

# apt-get ソースを更新し、MongoDB をインストール
RUN apt-get update && apt-get install -y mongodb-org

ちなみに

特定のバージョンの MongoDB をインストールできます。そのためには、次の例のようにパッケージのバージョン番号のリストが必要です。

RUN apt-get update && apt-get install -y mongodb-org=3.0.1 mongodb-org-server=3.0.1 mongodb-org-shell=3.0.1 mongodb-org-mongos=3.0.1 mongodb-org-tools=3.0.1

MongoDB はデータ・ディレクトリが必要です。インストール命令の最後の手順で作成しましょう。

# MongoDB データ・ディレクトリの作成
RUN mkdir -p /data/db

最後に ENTRYPOINT を設定します。これは Docker に対して MongoDB イメージでコンテナを起動するとき、コンテナ内で mongod を実行するよう命令します。そして、ポートを公開するために EXPOSE 命令を使います。

# コンテナのポート 27017 をホスト側に露出(EXPOSE)
EXPOSE 27017

# usr/bin/mongodb を Docker 化アプリケーションのエントリーポイントに設定
ENTRYPOINT ["/usr/bin/mongod"]

ファイルを保存したら、イメージを構築しましょう。

この Dockerfile の完全版は こちら をご覧ください。

MongoDB Docker イメージの構築

作成した Dockerfile を使い、新しい MongoDB イメージを Docker で構築できます。テスト用でない限り、 docker build コマンドに --tag オプションを通して Docker イメージをタグ付けするのが良い手法です。

# 書式:docker build --tag/-t <ユーザ名>/<レポジトリ>
# 例
$ docker build --tag my/repo .

コマンドを実行すると、 Docker は Dockerfile を処理してイメージを構築します。イメージは最終的に my/repo とタグ付けされます。

MongoDB イメージを Docker Hub に送信

全ての Docker イメージ・レポジトリを Docker Hub で保管・共有できるようにするには、 docker push コマンドを使います。この場合は、ログインする必要があります。

# ログイン
$ docker login
Username:
..

# イメージを送信
# 書式:docker push <ユーザ名>/<レポジトリ>
$ docker push my/repo
The push refers to a repository [my/repo] (len: 1)
Sending image list
Pushing repository my/repo (1 tags)
..

MongoDB イメージを使う

作成した MongoDB イメージを使い、他の MongoDB インスタンスをデーモン・プロセスとして実行できます。

# 基本的な方法
# 使い方:docker run --name <コンテナ名> -d <ユーザ名>/<レポジトリ>
$ docker run -p 27017:27017 --name mongo_instance_001 -d my/repo

# Docker 化した Mongo DB 、学び理解しました!
# 使い方:docker run --name <コンテナ名> -d <ユーザ名>/<レポジトリ> --noprealloc --smallfiles
$ docker run -p 27017:27017 --name mongo_instance_001 -d my/repo --smallfiles

# MongoDB コンテナのログを確認
# 使い方:docker logs <コンテナ名>
$ docker logs mongo_instance_001

# MongoDB を使う
# 使い方:mongo --port <`docker ps` で得られるポート>
$ mongo --port 27017

# If using docker-machine
# docker-machine を使う場合
# 使い方:mongo --port <`docker ps` で得られるポート> --host <`docker-machine ip VM名`の IP アドレス>
$ mongo --port 27017 --host 192.168.59.103

ちなみに

もし同じエンジン上で2つのコンテナを実行したい場合、ホスト側は2つの異なったポートを各コンテナに割り当てる必要があります。

# 2つのコンテナを起動し、ポートを割り当て
$ docker run -p 28001:27017 --name mongo_instance_001 -d my/repo
$ docker run -p 28002:27017 --name mongo_instance_002 -d my/repo

# 各 MongoDB インスタンスのポートに接続できる
$ mongo --port 28001
$ mongo --port 28002