Docker-composeで気軽にetcdに触れてみる

# はじめに
この記事は[ITRC Advent Calendar 2020](https://adventar.org/calendars/5535)の10日目の記事です。
前の記事→　[[Unity]ゼロプログラミングでギャルゲー風ゲームを作ろう！day1 ~MMDのモーションをUnityに入れて鑑賞会をしよう~](https://qiita.com/saba383810/items/c55043bdbc47dd4cb6f4)
こんにちはRIN1208です今回はいろいろあって最近etcdに触れたのでそのことについて書いていきたいと思います。


# 必要環境
- docker-compose
- mac os

上記の環境で説明していきます

# etcdって何？
etcd(エトセディーと読むらしい)とはOSSの分散型KVS(Key-Value Store)です 
curlなどのHTTPツールを使用して読み書きすることができます。
またオプションのSSL認証をオプションで使用することも可能です

# 構築してみる
dockerでの構築のやり方は以下のGit Hubに書いてあります。

https://github.com/etcd-io/etcd/releases

ただdockerコマンドで構築しようとするとコマンド長い、
複数立てるのに複数回コマンド打たなきゃいけない、
データを残さなくてもいい、
ポート変えたいと思った時に編集しづらいので今回はdocker-composeを使用してささっと構築していきたいと思います。

## 準備
まずはdocker-compose.ymlを書いていきます。
また今回、コマンドに関する説明は省かせていただきす。

```yaml
version: "3"
services:
  etcd1:
    build: .
    ports: ["12379:12379", "12380:12380"]
    command: >-
      /usr/local/bin/etcd 
      -name etcd1 
      -data-dir /etcd-data 
      -listen-client-urls http://0.0.0.0:12379 
      -advertise-client-urls http://0.0.0.0:12379 
      -listen-peer-urls http://172.16.0.4:12380 
      -initial-advertise-peer-urls http://172.16.0.4:12380 
      -initial-cluster etcd1=http://172.16.0.4:12380,etcd2=http://172.16.0.5:12382 
      -initial-cluster-token tkn 
      -initial-cluster-state new
    networks:
      etcd-network:
        ipv4_address: 172.16.0.4

  etcd2:
    build: .
    ports: ["12381:12381", "12382:12382"]
    command: >-
      /usr/local/bin/etcd 
      -name etcd2 
      -data-dir /etcd-data 
      -listen-client-urls http://0.0.0.0:12381 
      -advertise-client-urls http://0.0.0.0:12381 
      -listen-peer-urls http://172.16.0.5:12382 
      -initial-advertise-peer-urls http://172.16.0.5:12382 
      -initial-cluster etcd1=http://172.16.0.4:12380,etcd2=http://172.16.0.5:12382 
      -initial-cluster-token tkn 
      -initial-cluster-state new

    networks:
      etcd-network:
        ipv4_address: 172.16.0.5

  
networks:
  etcd-network:
    name: etcd-network 
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24
```

次にDockerfileです。こちらはdocker-compose.ymlに書いても良かったのですが。今回は書きました。

```dockerfile
FROM gcr.io/etcd-development/etcd:v3.4.7 
```

次にネットワークの作成です。下記のコマンドを実行してネットワークを作成してください　

```
$ docker network create etcd-network --subnet=172.16.0.0/24 --ip-range=172.16.0.0/24
```




## 起動してみる
それでは起動してみましょう。


```
$ docker-compose build
$ docker-compose up -d 
```

上記のコマンドを実行しコンテナを起動します。

## 書き込んでみる
それでは次に書き込んでみましょう。

```
$ curl -X POST -d '{"key": "hoge","value": "hogehoge"}' http://localhost:12379/v3/kv/put
```  
　
上記のコマンドを実行し書き込んでみましょう
下記のように表示されれば成功です

```
{"header":{"cluster_id":"10899443767562795482","member_id":"10670599892879733166","revision":"2","raft_term":"2"}}%
```

## 読み込んでみる
それでは次にetcd1からデータを読み込んでみましょう。

```
$ curl -L http://localhost:12379/v3/kv/range -X POST -d '{"key": "hoge"}'
```  
　
上記のコマンドを実行しetcd1のデータを読み込んでみましょう
下記のように表示されれば成功です。きちんとvalueのhogehogeが取得できています。

```  
"header":{"cluster_id":"10899443767562795482","member_id":"2275886477673874084","revision":"2","raft_term":"2"},"kvs":[{"key":"hoge","create_revision":"2","mod_revision":"2","version":"1","value":"hogehoge"}],"count":"1"}%
```  

次にetc2からデータを取得します。

```  
$　curl -L http://localhost:12381/v3/kv/range -X POST -d '{"key": "hoge"}'
```  

上記のコマンドを実行しetcd２のデータを読み込んでみましょう。
先ほど実行したコマンドと同じように表示されれば成功です。きちんと分散されているのが確認できました。

# 終わりに
気軽にetcdを試す際にdockerで構築できる時点で楽なのですがもっと楽したかったのでdocker-compose使って構築してみました。
やっぱり楽ですね。
明日はhashy0917先輩の記事になります