まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:docker

きっかけはこのツイートでも紹介した、豊島屋の鳩サブレ缶がちょうどラズベリーパイを4つ格納できるような仕切りになっていることに気付いたことでした:
20190117


面白そうなので、本当にラズパイのケースにしてみよう、それもせっかくなのでこの鳩サブレ缶の中だけでクラスタリング環境を作ることに挑戦してみよう、と思いたちました。ちなみに私自身はクラスタ化とか専門ではなく、あまり得意な方ではないです。思いついた時点では構築方法として Docker Swarm か、Kubernetes か、まあその辺りが動けばいいな、くらいに考えていました。。

当初は「さてとりあえずラズパイを4台買って・・」と思っていましたが、冷静に考えるとスイッチングハブとか、USBハブとか、電源周りとか、ラズパイ本体以外でもそこそこのサイズの機器を収納する必要がありそうだと気づきました。というわけで、それらをどこか1つにまとめるとして、ラズパイ本体は3台体制で行けるかな・・・ という想定でお買い物しました:
IMG_3782


購入したモノリスト:
買ったモノ個数目的
Raspberry Pi 3 Model B3クラスタノードになるホスト
マイクロ USB ケーブル上記ラズパイの電源ケーブル
マイクロSDカード(64GB)上記ラズパイのストレージ
ラズパイケースプラスチックの仕切りの上にラズパイ本体を直接載せるのは熱的にまずいかと思ったので・・・
LANケーブル3台のラズパイを同一ネットワークに接続(結局、今回は使わず※)
スイッチングハブ1LANケーブルのハブ(結局、今回は使わず※)
USB ハブ電源ケーブルのハブ(結局、今回は使わず※)


※今回は結局無線 LAN で接続することにしたので有線の LAN ケーブルとハブを使わずに構築しました。また USB ハブは購入したのですが、この USB ハブ1つに3台のラズパイを接続すると電流量が足りませんでした。というわけで別途 USB からの電源変換プラグ3つと、テーブルタップ1つを買い足しています。

上記に含まれていないものとして、マイクロ SD カードにイメージを書き込むための Windows PC と、マイクロ SD カードを読み書きするための USB アダプタ、USB -> 電源プラグの変換アダプタ、各ホストでネットワークが有効になるまでの操作用に LCD モニタ、HDMI ケーブル、USB キーボードと USB マウスを使います(これらは所有していたものをそのまま使います)。加えてケースとなる 18 枚入りの鳩サブレー缶を用意しました。

また構築する環境は最近流行り(遅い?)の Kubernetes 、にしたかったのですが、訳あって Docker Swarm にしました。コンテナ・オーケストレーションとしてはほぼデファクトスタンダートになった Kubernetes を選びたかったのですが、とりあえず 2019/01/21 時点ではマスターノードを初期化する kubeadm init コマンドを実行した際に再現率 100% で Timeout エラーになってしまうようでした。


どうもこの Issue に近い現象だと思っています:
2019012101


ただ Issue そのものは Closed になっていて、でもスレッドを見ていると本当に治っているのかなんとも微妙・・ 一方で成功例も報告されているのでラズパイで発生する環境依存問題なのか、タイミングが悪かったのか・・・ なんとも言えないのですが、仮に Kubernetes の障害であったとしてもその修正を待つのも変なので、Docker Swarm によるクラスタリング環境構築を優先することに決めました。

というわけで、改めて3台のラズパイを使った Docker Swarm 環境の構築を目標に作業を進めてみます:
2019012200



【構成図】
このような最終型を目指すことにします:
2018012201

raspi001, raspi002, raspi003 の3台のラズベリーパイを Docker Swarm でクラスタリングします。raspi001 を管理ノード、raspi002 と raspi003 をワーカーノードとします。



【ラズパイノードの準備】
Docker Swarm 環境の核となる3台のノードをラズパイで作ります。前提として最新版の Raspbian OS をマイクロ SD カードに書き込んで起動し、初回起動時のセットアップは3台ぶん済んでいるものとします。また SSH も有効にしておいてください。そして以下の手順を3台それぞれに対して行います。

【ホスト名の変更】
今回は3台のラズパイに raspi001, raspi002, raspi003 という3つの名前をそれぞれ付与して使いますこのため、まずは各ラズパイのホスト名をそれぞれ変更します。
$ sudo vi /etc/hostname

raspberrypiraspi001  raspberrypi をホスト名に変更して保存


また raspi001, raspi002, raspi003 の名前でアクセスできるよう、/etc/hosts も変更しておきます(DNS などが有効であればそちらで対応いただくのがいいと思います):
$ sudo vi /etc/hosts

127.0.1.1       raspberrypiraspi001  raspberrypi をホスト名に変更

192.168.10.101  raspi001
192.168.10.102  raspi002
192.168.10.103  raspi003   raspi00X の名前でアクセスできるよう IP アドレスを指定して追加し保存

【SSH 鍵の共有】
この3台のラズパイ間ではパスワードなしで SSH 接続ができるように SSH 鍵を共有しておきます:
$ ssh-keygen -t rsa
$ ssh-copy-id raspi001
$ ssh-copy-id raspi002
$ ssh-copy-id raspi003

【Docker のインストール】
こちらで紹介した手順でラズパイに Docker をインストールします:
$ curl -sSL https://get.docker.com | sh

$ sudo usermod -aG docker pi

(このコマンドの後、一度ログアウトして再ログインする)

以上、ここまでの手順は3台のラズパイ全てで共通に行っておく必要があります。ちと面倒ですが、全てのラズパイに Docker をインストールするところまで実行しておきます。


【管理ノードの作成】
ここからは3台のラズパイの役割ごとに作業が変わる部分になります。まずは管理ノードを作成します。raspi001 において、自分のアドレスを指定して以下のコマンドを実行します:
$ docker swarm init --advertise-addr 192.168.10.101

Swarm initialized: current node (xenxp2w34x5dhvtdmq0ndwolk) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0dg4im1kvb41odjj9zmhwug0bcvg6n8tt0d8548jxho5cp8cvo-df89pmegbdf4a3vy37apftv8r 192.168.10.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


↑コマンドが成功すると青字のような出力になります。この中の太字部分(docker swarm join で始まる行)は後でワーカーノードで実行することになるコマンドなのでコピペできるようにしておきましょう。


【ワーカーノードの接続】
次にワーカーノード側(raspi002, raspi003)から管理ノードに接続します。上記の管理ノード作成時に実行したコマンドの実行結果をそのまま入力して実行します:
$ docker swarm join --token SWMTKN-1-0dg4im1kvb41odjj9zmhwug0bcvg6n8tt0d8548jxho5cp8cvo-df89pmegbdf4a3vy37apftv8r 192.168.1.153:2377

コマンドの実行が成功すると "This node joined a swarm as a worker." といったメッセージが表示されます。これを raspi002 と raspi003 の両方で(4台以上で構成する場合は全てのワーカーノードで)実行します。


【ノードの状態を確認】
ここまでの作業でこの環境が作れています:

2018012201


ノードの状態を確認してみます。raspi001 から以下のコマンドを実行します:
2019012202

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
xenxp2w34x5dhvtdmq0ndwolk *   raspi001            Ready               Active              Leader              18.09.0
hztpov7qya7y99m4oifx73ugt     raspi002            Ready               Active                                  18.09.0
wksx0mlyu9wsilk9c4jigvcib     raspi003            Ready               Active                                  18.09.0

実行結果↑の青字部分をみると raspi001, raspi002, raspi003 がリストされ、全て Active になっています。また raspi001 の MANAGER STATUS が Leader とマークされており、ここが管理ノードになっていることが確認できました。


あとはこの3つのラズパイと電源ケーブル等をつなげて鳩サブレー缶に押し込みます:
IMG_3802


鳩サブレ版の(?) docker swarm 環境が完成しました!
IMG_3800



(参考)
https://blog.ruanbekker.com/blog/2018/10/23/setting-up-a-docker-swarm-cluster-on-3-raspberrypi-nodes/


ラズベリーパイネタシリーズです。

今回はオープンソースのブロックチェーン基盤である Hyperledger Fabric を一通り Raspbian OS に導入して実行する手順を紹介します。まあラズパイの 1GB 物理メモリでどこまで実用的に動くか、というのはあまり期待できないし、また現時点では Hyperledger Fabric はともかく、Hyperledger Composer を使った動作は 32bit OS である Raspbian OS ではどうやら難しいのかもしれない・・・と感じていることを最初に申し上げておきます。 なお以下で紹介する手順はこの環境で確認しています:

モデル: Raspberry Pi 3B+
OS: Raspbian 2018-11-13 (Stretch Full) ※最新版はこちら
SD カード: 128GB

※ページ最下の【参考】でも参照しているリンク先では Docker Swarm 環境で3台のラズパイを使った Hyperledger Fabric 環境構築を紹介しています。実用面ではこちらのほうが現実的かもしれません。



【導入手順】
基本方針として、このブログエントリ最下段の【参考】で記した2つのページの情報をあわせた方法で導入しています。

おおまかには以下の順序で Hyperledger Fabric 環境を構築します:
0. 事前準備
1. Docker 導入
2. Docker Compose 導入
3. Docker Image ダウンロード
4. 起動


今回は1台のラズパイの中に Docker 環境を構築し、その Docker の中で各種 Hyperledger Fabric のイメージを1インスタンスずつ動かして環境構築します。そのため上記のような順序でインストールする必要があります。


【0. 事前準備】
今回 Hyperledger Fabric を Docker 上で動かします。そのためラズパイに Docker 等を導入することになるのですが、そのための前提ライブラリ等を用意しておきます。ラズパイのターミナル等を開いて、以下のコマンドを順次実行します:
リポジトリ更新
$ sudo apt-get update && sudo apt-get upgrade -y

依存ライブラリを導入
$ sudo apt-get install git curl gcc libc6-dev libltdl3-dev python-setuptools -y

python pip インストーラーを更新
$ sudo -H pip install pip --upgrade

ここまでの操作が完了すると、ラズパイ用の Docker がインストールできるようになります。


【1. Docker 導入】

上記に続いて以下のコマンドを実行します:
Docker 導入
$ curl -sSL get.docker.com | sh

Docker の実行権限設定
$ sudo usermod -aG docker pi

ここまで完了したら一度ログアウトし、再度ログインします(最後の実行権限設定が有効になります)。ここまで正しく実行できていると、sudo なしで docker コマンドを実行することができるようになっているはずです:
Docker バージョン確認
$ docker -v
↑ Docker のバージョンが表示されれば、ここまでの手順は完了です。


【2. Docker Compose 導入】

引き続き Docker Compose を導入します。こちらは pip を使って導入し、導入後はすぐにコマンドを実行することが可能です:
Docker Compose 導入
$ sudo pip install docker-compose

Docker Compose バージョン確認
$ docker-compose -v
↑ Docker Compose のバージョンが表示されれば、ここまでの手順は完了です。


【3. Docker イメージダウンロード】

こちらのサイトで提供されている、ラズパイ用にビルド済みの Hyperledger Fabric (v1.0.7) の Docker イメージ群を docker pull コマンドでダウンロードします:
$ docker pull jmotacek/fabric-baseos:armv7l-0.3.2

$ docker pull jmotacek/fabric-basejvm:armv7l-0.3.2

$ docker pull jmotacek/fabric-baseimage:armv7l-0.3.2

$ docker pull jmotacek/fabric-ccenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-javaenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-peer:armv7l-1.0.7

$ docker pull jmotacek/fabric-orderer:armv7l-1.0.7

$ docker pull jmotacek/fabric-buildenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-testenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-zookeeper:armv7l-1.0.7

$ docker pull jmotacek/fabric-kafka:armv7l-1.0.7

$ docker pull jmotacek/fabric-couchdb:armv7l-1.0.7

$ docker pull jmotacek/fabric-tools:armv7l-1.0.7

自分でビルドする方法もあるようなのですが、あまりに面倒そうなので出来合いのものを使わせていただきました。 jmotacek 様、ありがとうございます。


これで Hyperledger Fabric 環境を動かすために必要な準備が完了しました。


【4. 起動】
Hyperledger Fabric の準備が整ったので起動します。ラズパイ1台で(物理メモリ 1GB で)この環境を起動するのは、できるか/できないかで言えばできそうですが、実用には厳しいかもしれません。環境に応じてスワップメモリを増やしておきましょう。方法はこちらを参照ください(私自身はスワップを 2GB に設定して以下を実行しました)。

Hyperledger Fabric の起動スクリプトの元となるキット(通称「サポートツール」)をダウンロード&展開します。以下の例ではホームディレクトリ以下に fabric/ というフォルダを作り、その中に展開しています:
$ mkdir ~/fabric

$ cd ~/fabric

$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip

$ unzip fabric-dev-servers.zip

この中の docker-compose.yml ファイルを上記で用意したラズパイ向け Docker イメージ用に書き換えます。具体的には ~/fabric/fabric-scripts/hlfv12/composer/docker-compose.yml を以下のように編集しました(変更部分をにしています):
version: '2'

services:
#  ca.org1.example.com:
#    image: jmotacek/fabric-ca:armv7l-1.0.7
#    environment:
#      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
#      - FABRIC_CA_SERVER_CA_NAME=ca.org1.example.com
#
#    ports:
#      - "7054:7054"
#    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/19ab65abbb04807dad12e4c0a9aaa6649e70868e3abd0217a322d89e47e1a6ae_sk -b admin:adminpw -d'
#    volumes:
#      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
#    container_name: ca.org1.example.com
#
  orderer.example.com:
    container_name: orderer.example.com
    image: jmotacek/fabric-orderer:armv7l-1.0.7
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/composer-genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    ports:
      - 7050:7050
    volumes:
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/etc/hyperledger/msp/orderer/msp

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    image: jmotacek/fabric-peer:armv7l-1.0.7
    environment:
      - CORE_LOGGING_LEVEL=debug
      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=composer_default
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: peer node start
    ports:
      - 7051:7051
      - 7053:7053
    volumes:
        - /var/run/:/host/var/run/
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/peer/msp
        - ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users
    depends_on:
      - orderer.example.com
      - couchdb

  couchdb:
    container_name: couchdb
    image: jmotacek/fabric-couchdb:armv7l-1.0.7
    ports:
      - 5984:5984
    environment:
      DB_URL: http://localhost:5984/member_db

そして起動コマンドを実行します:
$ cd ~/fabric

$ ./startFabric.sh

↓こんな感じで Docker 内でイメージがコンテナ化され、実行されていきます:
2019011003


少し時間がかかりますが(1分くらい?)コマンドが完了すると、こんな画面になってプロンプトが戻ります:
2019011004


以下のコマンドで起動中のコンテナの状態を確認し、Hyperledger Fabric の各種コンテナが実行されていることを確認します:
$ docker ps

↓docker-compose.yml で指定されたイメージが起動していることが確認できます。Hyperledger Fabric の起動に成功しました!:
2019011002


ちなみに、この「Hyperledger Fabric が起動しただけ」の段階で使用メモリを確認してみました。起動しただけであれば意外と余裕あるようにも見えますね・・・
2019011006



【(途中まで)使ってみる】
Hyperledger Fabric の導入と起動までであれば上記までで完了していますが、せっかくなのでこの環境を使ってみることにします(といっても、以下で紹介しているのはカードファイルのインポートまでですが・・)。

具体的には「サポートツールで提供されているスクリプトを使って管理者用のカードファイルを作成する」ところまでを紹介します。といってもここから先はラズパイ特有の部分はなく、通常の方法と一緒というか、通常と同じ方法でできる所までを紹介する、というスタンスです。

そのために composer コマンドと呼ばれる、Hyperledger Composer のコマンドラインツールを導入するのですが、その前提として Node.js v8.x 環境(node と npm)が必要になります。ここがちとややこしいのですが、今回の導入に使った Raspbian OS 2018-11-13 (Stretch Full) でははじめから V8 の node コマンドは使えるようになっていますが、npm が導入されていません。というわけで今後のことも考えて node のバージョン管理ツール(n package)と合わせて Node.js v8.x を導入しておくことにします:
一旦 npm を導入
$ sudo apt-get install npm

キャッシュを更新
$ sudo npm cache clean

n package をインストール
$ sudo npm install n -g

n package で導入できる Node.js のバージョン(8.xx.xx の最新バージョン)を確認
$ sudo n list

(8.xx.xx の中では 8.15.0 が最新であったと仮定)
Node.js V8.15.0 を指定してインストール $ sudo n 8.15.0

一度ログアウト&ログインし直して、改めて node コマンドと npm コマンドのバージョンを確認します:
$ node -v
v8.15.0

$ npm -v
6.4.1
↑ Node.js V8.x と対応する npm が導入できたことを確認


Node.js 環境が整ったので、改めて composer コマンドをインストールします。今回用意した Hyperledger Fabric のバージョンが v1.0.7 のイメージなので、このバージョンに合う composer-cli v0.16 を指定してインストールします(※):
$ sudo npm install --unsafe-perm -g composer-cli@0.16

※ラズパイ環境だからかもしれませんが、上記の --unsafe-perm オプションを付けないと実行結果がエラーになってしまうようでした。こちらを参照。


そしてサポートツール内の createPeerAdminCard.sh を実行して、PeerAdmin@hlfv1 のカードを作成します:
$ cd ~/fabric/fabric-scripts/hlfv1

$ ./createPeerAdminCard.sh

composer のコマンドで、PeerAdmin@hlfv1 カードが作成されていることを確認します:
$ composer card list
2019011101


とりあえず動作確認できたのはここまでです。2019/01/11 時点でこの先に進もうとして BNA ファイルを用意して composer runtime install し(ここまでは成功)、composer network start させようとすると、以下のようなエラーになりました:
Error: Error trying to instantiate composer runtime. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: Error starting container: API error (400): {"message":"Minimum memory limit allowed is 4MB"}
2019011102


このエラーの原因がまだわかっていないのですが、調べた範囲ではもしかすると 32bit OS である Raspbian OS に原因があるような気もしていて、そうだとすると現時点で Hyperledger Composer のこの先を動かすのは厳しいのかなあ・・・ とも思っています。

この辺りは引き続き調査もしますが、情報求む(苦笑)。


【Hyperledger Fabric を終了する】
起動した Hyperledger Fabric を終了するには startFabric.sh と同じフォルダにある stopFabric.sh を実行します:
$ ./stopFabric.sh

↓終了できました:
2019011005



実メモリ 1GB の制約はどうにもならないので実用的な使い方は難しいかもしれませんが、とりあえず1台のラズパイで Hyperledger Fabric が起動できることは確認できました。CouchDB などを使わずに、既存のビジネスネットワークに Peer だけ動かして接続するような使い方であればもう少し余裕を持って使えるかもしれません。


秋葉原の最安値で済ませることができれば、
 本体 5000 円 + ケース 1000 円 + Micro SDカード 2000 円
8000 円程度で Hyperledger Fabric のブロックチェーン環境が一台確保できる、ということになりますね。安っ!


【参考】
https://stackoverflow.com/questions/45800167/hyperledger-fabric-on-raspberry-pi-3
https://www.joemotacek.com/hyperledger-fabric-v1-0-on-a-raspberry-pi-docker-swarm-part-2/

オープンソースのブロックチェーン環境である Hyperledger Fabric に待望の V1.0 がリリースされ、同時に初の公式版リリースとなりました:
http://hyperledger-fabric.readthedocs.io/en/latest/releases.html


オープンソースなので、(前提環境さえあれば)誰でも同環境をダウンロードして構築することができます。というわけで、以下ではその導入手順を紹介します。

【前提環境】
まず前提として以下の環境が必要になります:
 Docker: 17.x for Linux or Mac OS X
 Docker-Compose
 Node.js V6.x(V8.x は未対応)

Docker は 17.x であればプラットフォームは問いません。自分は Ubuntu 14.04 および Mac OS X で確認しました。

今回紹介する方法では Fabric Composer のコマンドラインインターフェースを使って環境セットアップを行います。この Fabric Composer コマンドラインインターフェース(composer-cli)の導入前提として Node.js 環境が必要です。なお Node.js V6.x を用意してください、V8.x には未対応です。

【Hyperledger Fabric コマンドラインインターフェースを導入】
Node.js と同時に導入する npm を使って composer-cli をインストールします:
$ sudo npm install -g composer-cli
※Node.js V8.x だとここでコケます。Node.js V6 環境で行ってください。


【Hyperledger Fabric サポートツールを導入】
Hyperledger Fabric V1.0 環境を docker 内に構築するためのツールをダウンロード&展開します。以下の例では fabric というフォルダを作ってその中にダウンロード&展開していますが、ここは作業用ディレクトリなので任意の空フォルダで構いません:
$ mkdir fabric (作業用フォルダ)
$ cd fabric
$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip
$ unzip fabric-dev-servers.zip

【サポートツールを使って Hyperledger Fabric V1.0 環境を導入】

展開したサポートツールを使って Hyperledger Fabric V1.0 (の docker イメージ)をダウンロードして、実行します(docker サービスが稼働している必要があります):
$ ./downloadFabric.sh
$ ./startFabric.sh

ここまでの作業で Hyperledger Fabric V1.0 が起動しました! docker コマンドでこの時点での稼働サーバーの(プロセスの)様子を確認します(青字が出力内容):
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
d2561aba32f0        hyperledger/fabric-peer:x86_64-1.0.0      "peer node start -..."   22 minutes ago      Up 22 minutes       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
b189b5837328        hyperledger/fabric-couchdb:x86_64-1.0.0   "tini -- /docker-e..."   22 minutes ago      Up 22 minutes       4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
5dc8e344f9f3        hyperledger/fabric-ca:x86_64-1.0.0        "sh -c 'fabric-ca-..."   22 minutes ago      Up 22 minutes       0.0.0.0:7054->7054/tcp                           ca.org1.example.com
5552ed31eb7d        hyperledger/fabric-orderer:x86_64-1.0.0   "orderer"                22 minutes ago      Up 22 minutes       0.0.0.0:7050->7050/tcp                           orderer.example.com

1つのピア(peer0.org1.example.com)や、CA、CouchDB(Cloudant) などが docker 上で稼働していることが確認できました。


【デフォルトプロファイルの作成】
最後に Composer を使ってデフォルトのプロファイルを作成します。これもサポートツールを使って実行します:
$ ./createComposerProfile.sh

【Hyperledger Fabric V1.0 の停止】
サービスを停止する場合もサポートツールで用意されているコマンドを使います:
$ ./stopFabric.sh

このコマンドを実行した後に再度 docker プロセスを確認すると、先程まで動いていたサーバーが止まっていることが確認できます:
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES


というわけで、Docker (+Docker Compose) 環境があれば簡単に Hyperledger Fabric V1.0 が動かせるようになりました!

ここまでの内容だと、単に Hyperledger Fabric v1.0 を使ったブロックチェーンのネットワークを動かすまでの説明であって、UIとかで動いている様子を見れるわけではないのでちとわかりにくい部分があるかもしれません。そのあたりやアプリケーション開発に関してはおいおいと。。


コンテナ環境のスタンダードともいえる docker が、いつの間にかラズパイでも動くようになってました:
DOCKER COMES TO RASPBERRY PI

2017070701


動くようになった当初は導入方法も(コマンドが用意されたり、専用イメージが用意されたり、・・)色々あったようですが、現状では IA 環境と同様の方法でインストールできるようになっていました。具体的にはこの(curl と sh を使った)コマンドだけで導入できます:
$ curl -sSL https://get.docker.com | sh

ただ、この方法で導入しただけだと root ユーザーでないと動かせません。通常の(非 root )ユーザーのままで docker を使うには、そのユーザーを docker グループに所属させる必要があります。具体的には以下のコマンドを実行した上で再ログインすると有効になります(pi ユーザーの場合の例です):
$ sudo usermod -aG docker pi

実際にいくつかのコマンドを実行してみました。まずは docker 環境の確認:
$ docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 17.05.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9048e5e50717ea4497b757314bad98ea3763c145
runc version: 9c2d8d184e5da67c95d601382adf14862e4f2228
init version: 949e6fa
Kernel Version: 4.9.28-v7+
Operating System: Raspbian GNU/Linux 8 (jessie)
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 923.4MiB
Name: raspberrypi
ID: TI35:OH7M:MCCS:PUBJ:RFNY:O2LP:MA6F:CECD:3BUW:7NFL:LSV2:A3FO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: No swap limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
WARNING: No cpuset support

↑docker 17.05 が動いていることが分かりました。あと分かっていたことですがメモリは 1GB ・・

ラズパイ(というか ARM )で使えるコンテナを探してみました:
$ docker search armhf-
NAME                                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
container4armhf/armhf-alpine                       Automatically built base images of Alpine ...   67                   [OK]
container4armhf/armhf-busybox                      Automated build of Busybox for armhf devic...   8                    [OK]
orax/alpine-armhf                                  Daily built Alpine-Linux Docker image for ...   7                    [OK]
forumi0721alpinearmhf/alpine-armhf-transmission    alpine-armhf-transmission                       3                    [OK]
forumi0721alpinearmhf/alpine-armhf-minidlna        alpine-armhf-minidlna                           3                    [OK]
forumi0721alpinearmhf/alpine-armhf-nginx           alpine-armhf-nginx                              2                    [OK]
forumi0721alpinearmhf/alpine-armhf-tvheadend       alpine-armhf-tvheadend                          2                    [OK]
forumi0721alpinearmhf/alpine-armhf-jenkins         alpine-armhf-jenkins                            2                    [OK]
forumi0721alpinearmhfbuild/alpine-armhf-gpio-bpi   alpine-armhf-gpio-bpi                           1                    [OK]
forumi0721alpinearmhf/alpine-armhf-gogs            alpine-armhf-gogs                               1                    [OK]
forumi0721alpinearmhf/alpine-armhf-samba           alpine-armhf-samba                              1                    [OK]
forumi0721alpinearmhf/alpine-armhf-owncloud        alpine-armhf-owncloud                           1                    [OK]
forumi0721alpinearmhf/alpine-armhf-vsftpd          alpine-armhf-vsftpd                             1                    [OK]
forumi0721alpinearmhf/alpine-armhf-postgresql      alpine-armhf-postgresql                         1                    [OK]
forumi0721alpinearmhf/alpine-armhf-wordpress       alpine-armhf-wordpress                          1                    [OK]
forumi0721alpinearmhfbuild/alpine-armhf-netatalk   alpine-armhf-netatalk                           1                    [OK]
forumi0721alpinearmhf/alpine-armhf-mariadb         alpine-armhf-mariadb                            1                    [OK]
forumi0721alpinearmhf/alpine-armhf-certbot         alpine-armhf-certbot                            1                    [OK]
forumi0721alpinearmhf/alpine-armhf-noip-curl       alpine-armhf-noip-curl                          0                    [OK]
forumi0721alpinearmhf/alpine-armhf-nodejs          alpine-armhf-nodejs                             0                    [OK]
forumi0721alpinearmhf/alpine-armhf-scepg           alpine-armhf-scepg                              0                    [OK]
forumi0721archarmhf/arch-armhf-dev                 arch-armhf-dev                                  0                    [OK]
forumi0721ubuntuarmhf/ubuntu-armhf-dev             ubuntu-armhf-dev                                0                    [OK]
forumi0721alpinearmhf/alpine-armhf-dev             alpine-armhf-dev                                0                    [OK]
forumi0721debianarmhf/debian-armhf-dev             debian-armhf-dev                                0                    [OK]


そんなに数は多くないけど、nginx やら jenkins やら wordpress やら mariadb やら・・・基本的なのは揃ってそうです。


ラズパイはメモリが 1GB しかないので、そもそも docker を動かすにはいろいろ厳しい環境だとは思いますが、一方でケースや SD カード含めて 6~7000 円程度で docker 環境を揃えることができてしまう、ということでもあります。今度はこれのクラスタリングにも挑戦してみようかな・・・

Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)




IBM Bluemix からも提供されている NoSQL 型データベースの DBaaS "Cloudant" の開発者向けエディションが Docker イメージでの無料提供が開始されました:
https://hub.docker.com/r/ibmcom/cloudant-developer/

2016091004


1インスタンスでスケーリングなし&サポートもなし、という条件は付きますが、IBM Bluemix などのアプリケーション開発者がローカル環境だけでシングルテナントの Cloudant の環境を使うことができるようになります。以下、その手順を紹介します。

まず利用にあたり、docker 1.9 以上が必要です。RHEL/CentOS の 6.x の場合は docker 1.7 までしかサポートされていないため、バージョン7以上を用意する必要があります。

docker 環境が用意できたら、以下のコマンドで開発者向け Cloudant のイメージを pull します:
# docker pull ibmcom/cloudant-developer

そして以下のコマンドでローカル環境上にコンテナを作り、起動します:
# docker run --privileged --detach --volume cloudant:/srv --name cloudant-developer --publish 8080:80 --hostname cloudant.dev ibmcom/cloudant-developer

初回起動時のみ、ライセンス規約に同意する必要があります。以下のコマンドを実行してライセンス画面を表示します:
# docker exec -ti cloudant-developer cast license --console

すると以下の様なライセンス内容がコンソールに表示されます。同意する場合は "1" を入力してください:

2016091001


また、これも最初の1回だけ利用前にデータベースを初期化する必要があります。初期化は以下のコマンドを実行します:
# docker exec cloudant-developer cast database init -v -y -p pass

これで準備は完了です、簡単ですね。実際にローカル環境の Cloudant を利用するにはウェブブラウザで以下のアドレスにアクセスします:
http://(docker が動いているマシンのIPアドレス):8080/dashboard.html

すると以下の様なログインが画面が現れます。デフォルトでは
 Username = admin
 Password = pass
という ID & パスワードがセットされているので、この値を入力してログインしてください:

2016091002


ログインが成功すると、見慣れた Cloudant のダッシュボード画面が表示されます。後はいつもと一緒です。これでいつでもローカルで手軽に使える Cloudant 環境が用意できました:

2016091003

このページのトップヘ