sagantaf

機械学習やITインフラ、特にコンテナ関連の記事を書いているブログ。

redisとetcdをコンテナとして起動してPythonやGUIから使ってみる

はじめに

KVS(Key Value Store)として利用できるRedisとetcdのうち、どちらがより簡単に使い始められるか、シンプルな導入として適しているかを検証しました。

どちらもDockerコンテナの形式で起動し、Pythonからの操作と、GUIでの操作を試しています。



環境

  • Ubuntu 16.04
  • Docker version 18.06.0-ce
  • docker-compose version 1.24.1
  • etcd:3.4.3
  • redis:5.0.7


etcd

まずはetcdです。

コンテナとして構築

下記のDockerHubにあるdocker-compose.ymlをダウンロードします。

https://hub.docker.com/r/bitnami/etcd/

$ curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-etcd/master/docker-compose.yml

ダウンロードしてきたら、中身を以下のように書き換えます。

version: '3.5'

services:
  etcd:
    image: bitnami/etcd:3.4.3
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379
    ports:
      - 2379:2379
      - 2380:2380
    networks:
      - etcdtest
  myapp: # etcd操作用のコンテナを追加
    image: python:3.6
    command: tail -f /dev/null
    networks:
      - etcdtest

networks: # コンテナ同士を通信させるためにネットワークを追加
  etcdtest:
    name: etcdtest
    driver: bridge

etcdコンテナに加えてpythonからetcdを操作するためにmyappコンテナも起動する設定にしています。commandで/dev/nullをtail -fさせておき、コンテナが起動し続けられるようにしています。

また、内部ネットワークとしてetcdtestを作成し、コンテナ同士が疎通できるようにしています。


では作成したdocker-compose.ymlをもとにコンテナを起動させます。

$ sudo docker-compose up -d
Creating network "etcdtest" with driver "bridge"
Creating etcdtest_etcd_1  ... done
Creating etcdtest_myapp_1 ... done

コンテナが二つ立ち上がればOKです。


pythonからetcdを操作

コンテナが二つ立ち上がったので、実際にPythonでetcdを操作してみます。

まずはmyappコンテナにログインしてetcdのpython sdkとなるetcd3をインストールします。

$ sudo docker exec -ti etcdtest_myapp_1 bash
root@83cbcbc628f8:/# pip install etcd3

続いて、そのままコンテナにログインした状態でpythonインタプリタを起動し、etcd3をimportします。

root@83cbcbc628f8:/# python
Python 3.6.9 (default, Oct 17 2019, 06:34:57)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import etcd3
>>>

実際にetcdに接続し、データの書き込みと読み込みをしてみます。

>>> client = etcd3.client(host='etcd' port=2379)
>>> client.put('lang', 'python')
header {
  cluster_id: 14841639068965178418
  member_id: 10276657743932975437
  revision: 4
  raft_term: 2
}

>>> client.get('lang')
(b'python', <etcd3.client.KVMetadata object at 0x7f1fc95afa90>)

>>> for i in client.get_all():
...   print(i)
...
(b'python', <etcd3.client.KVMetadata object at 0x7f1fcb3ba668>)

接続の方法はシンプルにhostとportを指定するだけでできました。また、keyとvalueの設定や取り出しもputgetで簡単にできました。

ただ、keyとvalueの一覧はget_all()を使ってイテレータを取得する形になるため、表示させるにはfor文とprintを使う必要があります。


GUIからの操作

続いてGUIでの操作を試すために、ETCD Managerというツールを使ってみます。(これしか見つからなかった)

GitHub - icellmobilsoft/etcdmanager: A cross-platform GUI for ETCD

アクセス元のクライアントにインストールして使うタイプのツールのため、今回はMac OS用のインストールファイルをダウンロードします。

githubのreadme.mdにインストールファイルのリンクがあります。

f:id:sagantaf:20200214004538p:plain

ダウンロードしてきたら、ダブルクリックして開きます。

よくあるインストールページとして下記の画面が開きますので、etcd-managerのアイコンをApplicationsにドラック&ドロップしてください。

f:id:sagantaf:20200214004626p:plain

ぱっと見、反応がないですが、Applicationsにちゃんと追加されていました。クリックして起動します。

初回起動時はMacのデフォルトの動作としてセキュリティに引っかかって起動させてくれません。「システム環境設定 > セキュリティとプライバシー」の画面を開いて、下記のように”このまま開く”をクリックします。

f:id:sagantaf:20200214004715p:plain

これでETCD Managerが起動するはずです。

f:id:sagantaf:20200214004742p:plain

起動したら、Settings > ETCD を押します。下記のように接続先を入力する画面になりますので、etcdコンテナが起動しているホストのIPアドレスとポート番号2379を入力し、SAVEしてください。

右上に緑のダイアログが表示されればOKです。

f:id:sagantaf:20200214004815p:plain

この状態で左のメニューから「Manage keys」に移動すると、先ほど入力したkeyとvalueが表示されるのが分かります。

f:id:sagantaf:20200214004841p:plain

GUIのツールインストールと操作は非常に簡単にできることがわかりました。見た目も分かりやすいし、サクサク動きます。

ただ、クライアント側にインストールするタイプのツールであるため、開発者ごとにインストールしないといけない点がイマイチです。


Redis

続いてredisを構築して操作してみます。

コンテナとして構築

まずはdocker-compose.ymlファイルを作成します。

version: '3.5'
services:
  redis:
    image: redis:5.0.7
    ports:
      - 6379:6379
    volumes:
      - ./data/reis:/data
      - ./redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redistest
  myapp:
    image: python:3.6
    command: tail -f /dev/null
    networks:
      - redistest
networks:
  redistest:
    name: redistest
    driver: bridge

etcdの時と同様、my appコンテナを用意しています。一つ異なる点は、Redisの設定ファイルである redis.confをボリュームマウント形式でコンテナに渡している部分です。

そのため、redis.confを下記のように作成しておく必要があります。

port 6379
bind 0.0.0.0

Redisコンテナにアクセスするためのホストとポートの設定をしているだけです。

では作成したdocker-compose.ymlをもとにコンテナを起動させます。

$ sudo docker-compose up -d
Creating network "redistest" with driver "bridge"
Creating redistest_redis_1 ... done
Creating redistest_myapp_1 ... done

コンテナが二つ立ち上がればOKです。


pythonからredisを操作

コンテナが二つ立ち上がったので、実際にPythonで操作してみます。

まずはmyappコンテナにログインしてredisのpython sdkとなるredisをインストールします。

$ sudo docker exec -ti redistest_myapp_1 bash
root@fe8d915cd26b:/# pip install redis

続いて、そのままコンテナにログインした状態でpythonインタプリタを起動し、接続、書き込み、読み込みなどの操作をしてみます。

>>> import redis
>>> r = redis.Redis(host='redis', port=6379, db=0)
>>> r.set('hoge',123)
True
>>> r.get('hoge')
b'123'
>>> r.keys()
[b'hoge']

接続やkey/valueの取り出しはetcdと同じく非常にシンプルにできました。また、etcdとは異なり、r.keys()の一文でvalueを取ってこれました。


GUIからの操作

続いてGUI操作のためのツールを使ってみます。

こちらはコンテナとしてサーバを起動してブラウザからアクセスできるタイプです。そのため、Macなどのローカル環境にインストールする必要はありません。

Installing RedisInsight on Docker | Redis Labs Documentation Center


シンプルにコマンドでコンテナを起動させます。

docker run -d -v redisinsight:/db -p 8001:8001 --name redisinsight redislabs/redisinsight

問題なく起動したら、ブラウザから <ホストのIPアドレス>:8001にアクセスしてみます。

最初は下記のようなシンプルな画面が表示されます。

f:id:sagantaf:20200214005033p:plain

「ADD REDIS DATABASE > ADD DATABASE」を選択して、redisコンテナに接続します。

Nameは何でもOKです。HostはホストのIPアドレスを入力し、Portには6379を入力します。

f:id:sagantaf:20200214005111p:plain

接続に成功したら、Redisコンテナにアクセスできるようになります。

実際に左のメニューにある「Browser」を確認すると、python sdkで追加したkeyとvalueを確認できます。

f:id:sagantaf:20200214005129p:plain

etcdと同じくGUIのツールインストールと操作は非常に簡単にできました。


おわりに

etcdはKubernetesで利用されているため、KVSとしてだけでも使っておいたら理解が深まり、一石二鳥かと思いましたが、Redisの方が使いやすく感じました。ただ、それぞれ得意な場面があり、用途に応じて使い分けられるのがベストだと思います。

今回の目的である、どちらがより簡単に使い始められるか、シンプルな導入として適しているか、という意味ではRedisが適している!と言えそうです。


参考

etcd3 · PyPI

PythonでRedisを操作しよう (基本操作編)