Docker のオフィシャルイメージとして、mongo
イメージが公開されています。
このイメージには、MongoDB サーバー (mongod
) や、MongoDB クライアント (mongosh
) が含まれており、コマンドを省略してコンテナを起動すると、デフォルトで MongoDB サーバーが立ち上がります。
MongoDB サーバーのコンテナを起動する
次のように mongo
コンテナを起動すると、ローカルホスト上で MongoDB サーバーを立ち上げたのと同様に振舞います。
$ docker container run --rm -d -p 27017:27017 --name mongo mongo
オプションの意味:
--rm
… コンテナを停止したときにコンテナを削除します。コンテナを削除したくなければ、このオプションは外してください。-d
… デーモンをバックグラウンドで動作させます。-p 27107:27017
… ローカルホストの27107
ポートへのアクセスを、コンテナ内の MongoDB サーバーの27107
ポートへ転送します。--name mongo
… 起動するコンテナにmongo
という名前を付けます。mongo
… Docker イメージとしてmongo:latest
を使用します(デフォルトで:latest
が使われます)。
次のようにして、mongo
コンテナが起動していることを確認できます。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5a2aeba6bf4 mongo "docker-entrypoint.s…" 16 seconds ago Up 14 seconds 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mongo
コンテナを停止したいときは次のようにします。
$ docker container stop mongo
次のような docker-compose.yml
を作成しておけば、docker compose up -d
とするだけで起動できます(停止は docker compose down
で)。
MongoDB サーバーに接続する
ローカルホスト上の MongoDB クライアント (mongosh
) を使って、上記のように起動した Docker コンテナの MongoDB サーバーに接続できます。
デフォルトで、localhost:27017
に接続しに行くので、接続先アドレスを指定する必要はありません。
$ mongosh mydb
...
mydb>
接続できました。 ٩(๑❛ᴗ❛๑)۶ わーぃ
(おまけ)コンテナ間で通信させる
コンテナ内の MongoDB サーバーに、別のコンテナから接続したい場合は、それぞれのコンテナを同一のネットワークに接続しておくことで、コンテナ名でアクセスできるようになります。
ここでは、mongo-net
というブリッジネットワークを作って、そこに各コンテナを接続してみます。
docker コマンドを使う場合
docker network create
コマンドで、接続先のネットワーク mongo-net
を作成しておきます。
MongoDB サーバー用のコンテナを起動するときに、--net mongo-net
オプションを付けて、上記で作成したネットワークに接続します。
このとき、-p
オプションによるポートフォワードの指定は必要ありません(ローカルホストへのアクセスをフォワードするわけではないので)。
次に、別のコンテナから MongoDB クライアント (mongosh
) で接続します。
接続先コンテナの IP アドレスの代わりに、コンテナ名を使って mongo:27017
というアドレスで接続します。
Docker イメージとしては、サーバーと同じ mongo
イメージを使用できます。
docker compose コマンドを使う場合
Docker Compose (docker compose up -d
) を使う場合は、次のような Compose ファイルを使用します。
前述の通り、ports
プロパティの指定は必要ありません。
Docker Compose はネットワークの作成まで同時にやってくれるので便利です。
MongoDB クライアントからの接続方法はほぼ同様ですが、ネットワーク名には、Docker Compose のプロジェクト名(親ディレクトリ名)がプレフィックスとして付けられているので注意してください。
例えば、親ディレクトリ名が mongo
であれば、実際に生成されるネットワーク名は mongo_mongo-net
になるので、次のように接続することになります。