DockerでMongoDB, Mongo-Express(とNode.js)の環境を立ち上げました。
イメージを自作する必要がなかったので、Dockerfileは使用せず、docker-composeファイルのみ使用しました。
docker-composeファイルを用意して起動
docker-compose.yaml
version: "3.8"
services:
mongo:
image: mongo:5.0 # バージョンは自由に
restart: always
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: q-cards-db
volumes:
- ./data/db:/database
networks:
- default
- mongo-express
mongo_express:
image: mongo-express:1.0.0-alpha.4 # イメージのバージョンも念のため指定
restart: always
ports:
- "8081:8081"
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: password
ME_CONFIG_MONGODB_SERVER: mongo
ME_CONFIG_BASICAUTH_USERNAME: admin # mongo-expressアクセス時に要求されるユーザー名。なくてもOK。
ME_CONFIG_BASICAUTH_PASSWORD: Password1# mongo-expressアクセス時に要求されるパスワード。なくてもOK。
depends_on:
- mongo # mongoコンテナが起動してから起動させる
networks:
- mongo-express
app:
image: node:16 # 今回はExpressフレームワークを動かしたかったのでNode.js
env_file: .env
ports:
- "8080:8080"
volumes:
- ./src:/app
working_dir: /app
command: "yarn start"
depends_on:
- mongo
networks:
- default
networks:
default:
driver: bridge
mongo-express:
driver: bridge
起動
docker-compose up -d
アクセス
http://localhost:8081/にアクセス。こんな感じの画面が出ます!

工夫したこと
networkを分けました。ネットワークを分けた方が安全かと思ったので。
各コンテナは下記ネットワークに接続しています。
- app -> defaultネットワーク
- mongo -> defaultネットワーク、mongo-expressネットワーク
- mongo-express -> mongo-expressネットワーク
※ネットワークを設定・分離しなくても、環境を立ち上げることはできます。
※今回は、driverにbridgeを使用したカスタムbridgeネットワークになってます。
参考リンク:Networking in Compose | docker doc , Use bridge networks | docker doc
ハマったこと
エラー:Could not connect to database using connectionString: mongodb://root:pass@mongodb:27017/
mongo-expressがデータベースに接続できないというエラー。
下記の項目を確認・修正するとうまくいきました。
ME_CONFIG_MONGODB_SERVERを設定する
デフォルトではmongodb
なのですが、自分の用意したDBサーバー名を設定する必要があります。
私の場合、MongoDBのサーバーをmongo
としていたため、mongo
と追記しました。
# mongo-expressのenvironment設定
ME_CONFIG_MONGODB_SERVER: mongo
ME_CONFIG_MONGODB_ADMINUSERNAME, ME_CONFIG_MONGODB_ADMINPASSWORD を設定する
こちらもデフォルトでは、root
とpass
になっています。自分の用意したMongoDBのユーザーネームとパスワードに合わせます。
# mongo-expressのenvironment設定
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: password
restart設定を追加する
上記のことを行なってもうまくいかなかったのですが、restart設定を追加することで解決しました。
# mongo-expressのenvironment設定
restart: always # unless-stopped でもOK
restartのalwaysとunless-stoppedの違い
どちらも手動でコンテナを停止させた場合を除き、コンテナ停止時に再起動します。大きな違いはDockerデーモンが再起動した時の動きで、alwaysだとコンテナの再起動を実行しますが、unless-stoppedでは実行しません。