MongoDBを使用する主な利点は、使いやすいことです。 MongoDBを簡単にインストールして、数分で作業を開始できます。 Dockerを使用すると、このプロセスがさらに簡単になります。
Dockerの優れた点の1つは、わずかな労力といくつかの構成で、コンテナーを起動して任意のテクノロジーの作業を開始できることです。この記事では、Dockerを使用してMongoDBコンテナーを起動し、ストレージボリュームをホストシステムからコンテナーに接続する方法を学習します。
DockerにMongoDBをデプロイするための前提条件
このチュートリアルでは、Dockerをシステムにインストールするだけで済みます。
MongoDBイメージの作成
最初にフォルダを作成し、そのフォルダ内にDockerfileという名前のファイルを作成します。
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
このコンテンツをDockerfileに貼り付けます:
FROM debian:jessie-slim
RUN apt-get update && \
apt-get install -y ca-certificates && \
rm -rf /var/lib/apt/lists/*
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6 && \
gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg
ARG MONGO_PACKAGE=mongodb-org
ARG MONGO_REPO=repo.mongodb.org
ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
ENV MONGO_MAJOR 3.4
ENV MONGO_VERSION 3.4.18
RUN echo "deb http://$MONGO_REPO/apt/debian jessie/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR main" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN echo "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN apt-get update
RUN apt-get install -y ${MONGO_PACKAGE}=$MONGO_VERSION
VOLUME ["/data/db"]
WORKDIR /data
EXPOSE 27017
CMD ["mongod", "--smallfiles"]
次に、次のコマンドを実行して、独自のMongoDBDockerイメージを構築します。
docker build -t hello-mongo:latest .
Dockerファイルの内容を理解する
Dockerファイルの各行の構造は次のとおりです。
INSTRUCTIONS arguments
- FROM:コンテナの構築を開始するベースイメージ
- RUN:このコマンドは、MongoDBをベースイメージにインストールするためのすべての命令を実行します。
- ARG:Dockerビルドのデフォルト値をいくつか保存します。これらの値は、コンテナーでは使用できません。 --build-arg引数を使用して、イメージの構築プロセス中にオーバーライドできます。
- ENV:これらの値は、ビルドフェーズ中およびコンテナーの起動後に使用できます。 -e引数をdockerrunコマンドに渡すことでオーバーライドできます。
- ボリューム:data/dbボリュームをコンテナーに接続します。
- WORKDIR:RUNまたはCMDコマンドを実行するように作業ディレクトリを設定します。
- EXPOSE:システムをホストするためにコンテナのポートを公開します(外部)。
- CMD:コンテナ内のmongodインスタンスを開始します。
イメージからのMongoDBコンテナの起動
次のコマンドを発行して、MongoDBコンテナーを起動できます。
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- -name:コンテナの名前。
- -d:コンテナをバックグラウンド(デーモン)プロセスとして開始します。コンテナをフォアグラウンドプロセスとして実行するためにこの引数を指定しないでください。
- -v:ホストシステムの/ tmp/mongodbボリュームをコンテナーの/data/dbボリュームに接続します。
- -p:ホストポートをコンテナポートにマップします。
- 最後の引数は画像の名前/IDです。
コンテナが実行されているかどうかを確認するには、次のコマンドを発行します。
docker ps
このコマンドの出力は次のようになります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7e04bae0c53 hello-mongo "mongod --smallfiles" 7 seconds ago Up 6 seconds 0.0.0.0:27017->27017/tcp my-mongo
ホストからMongoDBにアクセスする
コンテナが起動して実行されると、リモートのMongoDBインスタンスにアクセスするのと同じ方法でコンテナにアクセスできます。 CompassやRobomongoなどのユーティリティを使用して、このインスタンスに接続できます。今のところ、mongoコマンドを使用して接続します。ターミナルで次のコマンドを実行します:
mongo 27017
これにより、mongoシェルが開き、mongoコマンドを実行できます。次に、1つのデータベースを作成し、そのデータベースにデータを追加します。
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
次に、ボリュームマッピングが正しいかどうかを確認するために、コンテナを再起動して、データが含まれているかどうかを確認します。
Docker restart <container_id>
ここで再びmongoシェルに接続し、次のコマンドを実行します:
db.myColl.find().pretty()
次の結果が表示されます:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
これは、コンテナを再起動した後でも、コンテナがデータベースデータを保持していることを意味します。これは、ボリュームマッピングのために可能です。コンテナは、すべてのデータをホストシステムの/ tmp/mongodbディレクトリに保存します。そのため、コンテナを再起動すると、コンテナ内のすべてのデータが消去され、新しいコンテナがホストのtmp/mongodbディレクトリのデータにアクセスします。
MongoDBコンテナシェルへのアクセス
$ docker exec -it <container-name> /bin/bash
MongoDBコンテナログへのアクセス
$ docker logs <container-name>
別のコンテナからMongoDBコンテナに接続する
次の構造に従う--link引数を使用して、他のコンテナーからMongoDBコンテナーに接続できます。
--link <Container Name/Id>:<Alias>
ここで、Aliasはリンク名のエイリアスです。このコマンドを実行して、Mongoコンテナーをexpress-mongoコンテナーにリンクします。
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
このコマンドは、dockerhubからmongo-expressイメージをプルし、新しいコンテナーを開始します。 Mongo-expressは、MongoDBの管理UIです。次に、http:// localhost:8081にアクセスして、このインターフェイスにアクセスします。
Mongo-express Admin UI結論
この記事では、MongoDBイメージを最初からデプロイする方法と、Dockerを使用してMongoDBコンテナーを作成する方法を学びました。また、ボリュームマッピングや、リンクを使用して別のコンテナーからMongoDBコンテナーに接続するなどの重要な概念についても説明しました。
Dockerは、複数のMongoDBインスタンスをデプロイするプロセスを容易にします。同じMongoDBイメージを使用して、レプリカセットの作成に使用できる任意の数のコンテナーを構築できます。このプロセスをさらにスムーズにするために、YAMLファイル(構成ファイル)を作成し、docker-composeユーティリティを使用して、1つのコマンドですべてのコンテナーをデプロイできます。