M1 MacでMongoDBをDocker Composeでサクッと環境構築

## この記事の内容
- M1 MacでMongoDBを環境構築した時の備忘録
- おそらくM1じゃなくても動く（未検証）

### 補足
動作確認したPCのスペック
- チップ：Apple M1
- macOS:Sonoma

# Dockerの設定
早速docker-compose.ymlです。

```yml:docker-compose.yml
services:
  mongo:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - "27017:27017"
    tty: true
    restart: always
    volumes:
      - ./data/db:/data/db
      - ./data/configdb:/data/configdb
```

コンテナ起動は次のコマンドを実行してください。
```bash
docker compose up -d
```

## 解説

### イメージ
```yml
image: mongo:latest
```
latestは最新の安定版バージョンのイメージを持ってきます。
今回は動作確認用のためlatestにしていますが、実際の案件で使う場合は、細かくバージョンを指定するようにしてください。

### 環境変数

```yml
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
```
初期設定として、スーパーユーザー「root」が生成されます。
rootユーザーは認証データベースに保存されます。
ユーザ一覧を確認するには、次のクエリを実行します。

```js
// ユーザー情報を確認する
use admin
db.system.users.find()
```

#### 認証データベースって？
MongoDBにログインするためのユーザーを管理するデータベースです。
ロールを設定すると、各データベースへアクセス制限を設けることができます。

詳しくは公式サイトより
[MongoDB 認証データベース](https://www.mongodb.com/docs/manual/core/security-users/#authentication-database)

### MongoDBのポート

```yml
    ports:
      - "27017:27017"
```
ホストマシンとコンテナ間のポートマッピングを指定します。左がホストマシン（Mac）、右がDockerのコンテナです。

### tty: true

```yml
tty: true

```
ttyはコンテナがバックグラウンドで実行されているときに標準入力を開いたままの状態にできます。

#### `tty: true`はなにしてるの？
ターミナルからコンテナに入り、コマンドを実行できるようにしています。

```:ターミナル(ttyがfalseの場合)
$ docker compose exec mongo bash
# コマンド実行できない
service "mongo" is not running container #1
make: *** [bash] Error 1
```

### 再起動ポリシー
```yml
restart: always
```

`restart: always`再起動ポリシーの設定です。コンテナが停止、Dockerデーモンの再起動、またはコンテナのクラッシュ時に自動的に再起動されます。

### ボリューム

```yml
    volumes:
      - ./data/db:/data/db
      - ./data/configdb:/data/configdb
```
ホストマシンとコンテナ間でボリュームをマウントします。これにより、データの永続性が保たれます。ここでは2つのマウントを設定しています：

`./data/db:/data/db` はMongoDBのデータファイル用です。
`./data/configdb:/data/configdb` はMongoDBの設定ファイル用です。

#### ボリュームってなに？
ボリュームとは、データを保存し、コンテナ間で共有するための仕組みです。主に以下の目的で使用されます。

**データの永続化** 
ボリュームを使用すると、コンテナのデータを保存し、永続化させることができます。
ボリュームを設定していない場合、Dockerコンテナのデータは一時的であるため、コンテナが削除されると、その内部のデータも失われます。

**コンテナ間のデータの共有** 
複数のコンテナ間でデータを共有するためにもボリュームが使用されます。例えば、複数のコンテナが同じデータベースのデータにアクセスする必要がある場合、共有ボリュームを介してデータを共有できます。

# 動作確認
## ターミナルで動作確認
アプリケーションを起動させるのが面倒な場合は、CLI上でコマンド実行した方が早い時があります。MongoDBに接続するには、まずコンテナに入り、そこからデータベースに接続します。

```:ターミナル
# mongoコンテナに入る
$ docker compose exec mongo bash
# MongoDBに接続
root@xxx:/# mongosh --port 27017  --authenticationDatabase -u "root" -p
Enter password: *******　# パスワードはexample
```

ログインできました。
試しに、employeeコレクションに１つ、ドキュメントを追加してみます。

```bash
test> db.employee.insertOne({name:"従業員A", age: 20})
{
  acknowledged: true,
  insertedId: ObjectId("655f0fc5d0aeeb23c03cbfa0")
}
```


## Studio 3Tで動作確認
Studio ３TはMongoDB 用のGUI ツールです。ビジュアルが見やすく、複数のMongoDBを管理する場合に重宝します。

### 導入方法
公式ホームページにアクセスし「Dowonload」ボタンからダウンロードし、起動してください。
ダウンロード後に初期設定で、無料のアカウントを作成する必要があります。

https://studio3t.com/

お使いのPCのOSに合わせてダウンロードしてください。Windowsをお使いの方は、「Other Platforms」ボタンを選んでください。
![](https://storage.googleapis.com/zenn-user-upload/55221dcb1551-20231123.png)

#### 接続
Studio ３Tを起動後、Connect>New ConnectionからURLを設定して接続できます。

```bash
#URI
mongodb://root:example@localhost:27017
```

![](https://storage.googleapis.com/zenn-user-upload/83cef69ab894-20231123.png)

#### 動作確認
IntellShellからクエリを実行できます。
結果はTree形式、テーブル形式、JSON形式が選べます。画像ではJSON形式にしていますが、お好きな表示方法を選んでください。

![](https://storage.googleapis.com/zenn-user-upload/2a96844bd8c8-20231123.png)

## まとめ
Docker Composeを使って、MongoDBの動作環境を整備しました。