Couchbaseローカル環境をDockerで構築

## 概要
Couchbaseのローカル環境をDockerで構築した時のメモ


#### 背景
Vagrantのローカル環境があったが、
 - 起動、ビルドが重い
 - コードがない(ブラックボックス化してる)
 - Vagrantわかる人がチームにいない(退社した人が作った環境の為）
などの問題がある。

#### 目的
ローカル環境をDockerでリプレイスする。 

## 作業ログ
### couchbaseイメージを動かしてみる。
まず、細かい設定とかは抜きにして、Couchbaseのコンテナを立ち上げてみる。

 - [Couchbaseのdockerhubリポジトリ](https://hub.docker.com/_/couchbase?tab=tags)でイメージを確認
![スクリーンショット 2020-09-20 13.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400875/77de14e0-eca0-62bb-48a1-e4b89bd62d7b.png)

→本番環境のバージョンが、`4.5.1`なので、`community-4.5.1` を使う。

 - コンテナを起動 

とりあえず`Description`に書いてある通り起動

```bash
$ docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase:community-4.5.1
```

 - コンテナ起動確認

```bash
$ docker ps
```
↓起動OK
![スクリーンショット 2020-09-20 13.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400875/442db8e6-48e8-a86a-5d73-52cc0310bf3d.png)


 - コンソール動作確認

ブラウザで`http://0.0.0.0:8091/`にアクセスし、Couchbaseのコンソールが表示されることを確認。
![0_0_0_0_8091_ui_index_html__.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400875/1433b619-1d04-5b63-1d28-261c8f73412e.jpeg)
`Setup`を押下し、手動でアカウント、バケットの設定なども可能ですが、コード化が目的なのでここではスルーします。


とりあえず動作を確認。。

### コード化

Dockerfile, docker-compose.yamlを作成

ローカル環境の設定を行うにあたり、以下の設定が必要になる。
 - クラスタ作成
 - サービス設定
 - Couchbaseサーバーの認証情報設定
 - バケット作成
 - View設定

上記の設定をコードにおとすため、Dockerfile(ついでにdocker-compose．ｙａｍｌも)を記載


```bash
# ディレクトリ構成
local-env
├ docker-compose.yaml
└ mbe-couchbase-container
  ├ byfield      
  │ └ all.ddoc   # viewの定義ファイル
  ├ Dockerfile   # CouchbaseのDockerファイル
  └ configure.sh # Couchbaseの設定を行うbashスクリプト
```

```yaml
# docker-compose.yaml
version: "3.7"
services:
  mbe-couchbase:
    build: ./mbe-couchbase-container
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 8094:8094
      - 11210:11210
      - 11211:11211
    environment:
      - COUCHBASE_ADMINISTRATOR_USERNAME=couchbase
      - COUCHBASE_ADMINISTRATOR_PASSWORD=lcouchbase1
```
 - `COUCHBASE_ADMINISTRATOR_USERNAME`,`COUCHBASE_ADMINISTRATOR_PASSWORD `でCouchbaseの認証情報を設定
 - `build: ./mbe-couchbase-container`で、↓Dockerfileを指定

```makefile
#Dockerfile作成
FROM couchbase:community-4.5.1

# Couchbase初期化シェルをコンテナ内にコピー
COPY ./configure.sh /opt/couchbase
COPY ./byfield/ /opt/couchbase

# Couchbase設定実行シェル
CMD [ "/opt/couchbase/configure.sh" ]
```

```bash
# Couchbase設定シェル
set -m

# サーバ起動
/entrypoint.sh couchbase-server &

# APIサーバ起動までの待ち時間をざっくり設定 TODO:サーバ起動を検知して処理を進めるようにしたい。
sleep 30

# クラスタのメモリ割り当て
curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=4096 -d indexMemoryQuota=4096

# サービス設定
curl -v http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2cn1ql%2Cindex

# Couchbaseサーバーの認証情報設定
curl -v http://127.0.0.1:8091/settings/web -d port=8091 -d username=$COUCHBASE_ADMINISTRATOR_USERNAME -d password=$COUCHBASE_ADMINISTRATOR_PASSWORD

# バケット上限解除(バケットの上限数はデフォルトで10個,,それ以上作成する場合は以下設定で変更が必要)
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/internalSettings -d maxBucketCount=20

# バケット作成
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets -d name=bucket_name -d bucketType=couchbase -d ramQuotaMB=100 -d authType=sasl -d saslPassword=ladd_personal_info1

echo "please wait 30 sec..."
sleep 30
# View設定
curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X PUT -H "Content-Type: application/json" http://127.0.0.1:8092/bucket_name/_design/api%2Ftest -d @/opt/couchbase/all.ddoc


sleep 15

# フォアグランド実行
fg 1
```

 - docker-composeでコンテナ実行

```bash

$ docker-compose up -d mbe-couchbase
```

バケット起動を確認。

## 所感
Couchbaseは、ググってもあまり記事見つからない。
公式リファレンスはしっかりしてるし、簡単な実装だけだったので特に困らなかったけど。。Couchbaseって人気ない？
ちょっと前に[クラウド版](https://www.couchbase.com/products/cloud)が出たらしいけど、クラウド移設する際は使わないと思う。


## 参考
https://blog.couchbase.com/docker-deploy-containerized-java-couchbase-web-application/

※もう1つQittaの記事を参考にしたが、URL無くしてわからん。。