DockerでMongoDB、Mongo Expressの環境を立ち上げる(docker-compose)

DB

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 を設定する

こちらもデフォルトでは、rootpassになっています。自分の用意した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では実行しません。

タイトルとURLをコピーしました