Dockerでお手軽JSONデータベース体験 ~ Couchbase Server最新版を試す

# はじめに

## 本記事の対象者

本記事の対象者として、以下の様な人を想定しています。

- JSONデータを格納できるデータベースで開発を始めたい（中でも特に以下の関心がある人）
    - JSONデータへの問合せをSQLのようなクエリ言語で行いたい
    - ミリ秒以下の応答性能を実現したい
- 開発・検証用にローカル環境にデータベースをインストールしたい

## インストール方法について

表題にある様に、ここではDockerを利用します。
Dockerについての知識を前提としなくても、実行できる記述を心がけますが、インストーラーによるインストールの方が馴染みがある方は、下記からダウンロードして実行してください（Mac, Windows, Ubuntuのインストーラがあります）。その後、初期設定などについて、本記事をご参照ください。

[COUCHBASE FREE NOSQL DATABASE LIST](https://www.couchbase.com/downloads)

Dockerについては、環境にインストールされているところから、解説を始めます。

## Couchbase Serverについて

Couchbase Serverは、分散アーキテクチャーを持ちますが、ここではローカル環境に、シングルノードのクラスターとして構築します。（Dockerを使えば、ローカル環境で複数のノードからなるクラスターとして構築することも可能です。Dockerに慣れている方には特に難しいところはありませんが、興味のある方は、参考情報のドキュメントをご参考ください）

Couchbase Serverには、Enterprise EditionとCommunity Editionがありますが、ここでは、検証目的として、Enterprise Editionを用います（上記リンクに各エディションの利用できる範囲について記述があります）。

# 環境構築手順

## Dockerによるインストール

### 初回実行
下記のコマンドを実行します。

```bash
$ docker run -d --name db -p 8091-8094:8091-8094 -p 11210-11211:11210-11211 couchbase
```
CouchbaseのDockerリポジトリから最新版（"couchbase:latest"）がダウンロードされ、コンテナの実行が開始されます。

[http://localhost:8091](http://localhost:8091)にアクセスします。

下記の様な画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/aec606f0-c22b-1b4c-6324-a008cabef3a2.png)



インストール完了です！

### インストール確認

...というのも味気ないので、インストールされた状態を確認してみます。

#### ログの確認

`db`は、`docker run`コマンドの`--name`オプションで指定したものです。

```
$ docker logs db
Starting Couchbase Server -- Web UI available at http://<ip>:8091
and logs available in /opt/couchbase/var/lib/couchbase/log
```

#### イメージの確認

```
$ docker images
REPOSITORY                                                TAG                 IMAGE ID            CREATED             SIZE
couchbase                                                 latest              8f1b63be0df7        3 weeks ago         1.19GB
```
#### プロセスの確認

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                               NAMES
d4bfe9191a55        couchbase           "/entrypoint.sh couc…"   6 minutes ago       Up 6 minutes        8095-8096/tcp, 0.0.0.0:8091-8094->8091-8094/tcp, 11207/tcp, 0.0.0.0:11210-11211->11210-11211/tcp, 18091-18096/tcp   db
```

「couchbase」という名前のDockerイメージがインストールされ、そのイメージから「db」という名前のコンテナが作られ、稼働中の状態であることが確認されました。（最後にこのコンテナの停止と再起動についてもみていきます）

## Couchbase Serverの初期設定

### クラスター初回構築

#### ウィザード選択
上記の画面イメージに見える通り、インストール直後にWEBコンソールにアクセスした際の初めの選択肢は、「Setup New Cluster」と、「Join Existing Cluster」との二つです。ここでは、当然前者を選択します。

次の様な画面が表示されるので、適宜入力します。「Next: Accept Terms」を押します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/bc069dbb-a667-7d72-d9d7-489d69a614c5.png)


#### Terms and Conditions
適宜、チェックボックス押下します。


「Finish With Defaults」で終了することもできますが、「Configure Disk, Memory, Services」をみてみましょう。

#### クラスター設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/bfcbbc12-c650-404f-a1bb-bcc4ba3a4cd0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/81c5fc90-3e57-7eaf-1894-60e5867768a7.png)


検証目的において、特に変更しなければならないところはないので、「Save & Finish」を押下し、終了します...と言いたいところですが、下記の様なエラーが表示されるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/f85f87bc-354c-fb8c-79af-6443719d25d2.png)

上の画面を見直すと、TOTAL QUOTAが、Max Allowed Quotaを上回っていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/dd261998-fc7a-b51e-d7b8-a29afac0a6d7.png)

適宜、各サービスのQuotaを変更し、Max Allowed Quota以下になる様に調整します。また、不要なサービスのチェックボックスを外すことにより、このノードでは、そのサービスが無効になります。後から有効にすることはできませんが（その場合は、クラスターからの削除、再追加が必要）クラスター全体の構成を柔軟に設計することができます。ここで準備する検証環境としては、特に必要のない限り、Search, Analytics,Eventingを無効にして差し支えないかと思います。


最終的にこの様な画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/70cf58e2-6aff-199f-2ba9-ca69818b2c51.png)


### バケット作成

データの格納の単位であるBucketを作るため、左端のメニューから「Bucket」リンクをクリックします（ブラウザの画面サイズを十分に広げることで、左のメニューが表示されます）。

表示されるのは、バケット一覧画面です。右上の「ADD BUCKET」リンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/4f22f5df-45d6-e38c-1709-806eec6137b6.png)

適当な名前を入力して「Add Bucke」ボタンを押下します。(バケットの設定は後から変更可能です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/d59d4048-a677-adb6-1057-bc0f725a3098.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/fffb9e50-fac3-ca95-a9d0-44a3b21d9189.png)


こんな感じになったかと思います。「Warning」が表示されていますが、これは、デフォルトでレプリカの設定が有効になっているためです（ここでは、検証用に１ノード構成のクラスターとしているため、レプリカを持つことができません）。アラートが表示されない様にするため「Edit」を押下します。

「Advanced bucket settings」を展開し、Replicasのチェックボックスを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/074d8c3d-c835-13be-c31a-e64ad199c51d.png)

ついでに、Flushを有効にしておきます。「Save Changes」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/d941c1d1-e772-a55e-0c1e-5b31f4df1f1d.png)

「Warning」が消え、「Flush」ボタンが追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/54215dc1-40fe-8894-d756-97713198568e.png)

### ドキュメント追加

ドキュメントの追加を行ってみます。
上の画面の右上のDocumentsリンクをクリックします。

この様な画面が表示されます。
右上の「ADD DOCUMENT」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/18a64542-1b0d-3638-22bf-2d526ccb210a.png)

適当なドキュメントIDを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/4455d3bd-1e1e-5177-f734-54e45302867f.png)

WEBコンソールからドキュメントを作った際のデフォルトの内容が表示されるので、適宜編集するなりして、「Save」を押下します。（ドキュメント作成確認のためなので、修正は不要です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/638c6797-4880-748d-a6bb-4e5523f3b2a0.png)

ドキュメントの追加が確認されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/14c52459-22a6-cdf4-8d13-948eec4dfa1a.png)

## コンテナの停止・起動

コンテナをストップします。

```
$ docker stop db
```
実行中のコンテナを確認します。ブラウザでWEBコンソールにアクセスできないことも確認します。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

実行されていないコンテナを確認します。

```
$ docker ps -a
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS                          PORTS                                                                                                      NAMES
d4bfe9191a55        couchbase                                                     "/entrypoint.sh couc…"   49 minutes ago      Exited (0) About a minute ago                                                                                                              db
```

コンテナを改めて開始してみます。

```
$ docker start db
```

WEBコンソールにアクセスできることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/b06b60f3-d8ba-da59-8e7e-241c5cb0538a.png)

お疲れ様でした！

...というほどカロリーを使ってはいないと思いますが、新しい技術に初めて触れる時の抵抗感が多少でも緩和されたのであれば幸いです。

本稿で扱っている内容の一次情報として、以下のドキュメントがあります。

https://docs.couchbase.com/server/current/install/getting-started-docker.html


この後は、下記の記事なども参考にしてみてください


https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f

https://qiita.com/yoshiyuki_kono/items/77d342423cab35d42652

また、Couchbase Serverについては、日本語で読むことができるまとまった情報として、次の拙著を紹介させていただきます。

https://www.amazon.co.jp/-/en/%E6%B2%B3%E9%87%8E-%E6%B3%B0%E5%B9%B8/dp/429560030X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1636588872&sr=1-1


# 関連情報

[Couchbaseローカル環境をDockerで構築](https://qiita.com/nishimu0507/items/15b8f8bc822d6a88432f)
以前のバージョン(4.5.1)のCommunity Editionを使うケースが紹介されています。また、Dockerのカスタマイズについても解説されています。

[Deploy a Multi-Node Cluster with Containers](https://docs.couchbase.com/server/current/install/getting-started-docker.html#section_msh_fbl_42b)
本記事冒頭で触れたDockerを使って複数ノードのクラスタをローカル環境で実現する方法（同じことを実現するために、Kubernetesを使う方法もありますが、それはまた別のトピックとして、いずれ記事にできたらと思います）

[よく使うDockerコマンド](https://qiita.com/tera_shin/items/8a43e904bd15990d3129)
各種Dockerコマンドが簡潔に紹介されています。

# Appendix. コミュインティエディションのケース

```
docker run -d --name cb -p 8091-8094:8091-8094 -p 11210:11210 couchbase:community
```