2016-11-11_044913

超高速WordPress仮想マシンとして有名なkusanagiがさくらのVPSにも対応したという記事を先日読みました。

その記事を読むまでkusanagi自体を知らなかった自分としては、え?草薙?SM○Pか?という感じで何の事かさっぱりわかりませんでした。

記事を読んだところ、kusanagiはwordpressが高速に動作するようにチューニングした仮想マシンで、内部にnginxやHHVM、MariaDB等を使用して極限?まで高速に動作するよう作られた仮想マシンのようです。

気になって使いたくなりましたので、早速対応しているパブリッククラウドを確認してみました。(2016年11月時点)

  • KUSANAGI for Microsoft Azure
  • KUSANAGI for SoftLayer
  • KUSANAGI for AWS
  • KUSANAGI for さくらのクラウド
  • KUSANAGI for ConoHa
  • KUSANAGI for Z.com
  • KUSANAGI for S-Port
  • KUSANAGI for IDCF クラウド
  • KUSANAGI for Cloudn
  • KUSANAGI for ALTUS
  • KUSANAGI for NIFTY Cloud

あれ?Googleがない・・・。AWSでもいいのですが、ここは最近熱いGoogle Cloud Platform(GCP)を使って環境を構築したいものです。さらに調べたところ、docker-machine用のコンテナイメージ(KUSANAGI Runs on Docker)が提供されていることが分かりました。おっ、これならGCPでもいけそうだ。

ではGoogle Compute Engine(以下、GCE)を使って、KUSANAGI Runs on Dockerを構築してみます。

方法は公式HP https://kusanagi.tokyo/cloud/kusanagi-runs-on-docker/ を参考にしてます。

1.dockerのホストマシンを作る

ホストマシンは手元のPCでも、クラウドサーバでも何でもよいのですが今回はGCEを使います。

GCEでインスタンスを作成する

GCEの管理画面より、スペックは何でもよいのでサーバを作ります。今回はcentos7で作りました。※cent os6よりは前はdockerがサポートされなくなっているのでcentos7を使用します。

GCEで作成する場合はAPIのアクセス権が必要になるので「すべての Cloud API に完全アクセス権を許可」にチェックをつけてサーバを作成する。途中で変更できないので作成時に指定する必要があります。

dockerインストール

### インストール
$ curl -fsSL https://get.docker.com/ | sh

### deamon起動
$ systemctl start docker
$ systemctl enable docker

### docker動作確認
$ docker run hello-world
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
(省略)

### dockerコマンドメモ
#### 停止
docker stop CONTAINER

#### 全てのコンテナ停止
docker stop $(docker ps -a -q)

#### 開始
docker start CONTAINER
例)docker start nginx

#### 起動中 コンテナ表示
docker ps

#### 停止を含む全てのコンテナ
docker ps -a

#### コンテナ削除
docker rm CONTAINER

#### 全てのコンテナ削除
docker rm $(docker ps -a -q)

2.docker-machineをGCE上に作る

docker-machineインストール

※v.0.8.2をインストールする。古いバージョンだと後続の手順でエラーになります。
$ curl -L https://github.com/docker/machine/releases/download/v0.8.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && chmod +x /usr/local/bin/docker-machine

ちなみに、docker-machineをバージョンアップする場合
$ rm /usr/local/bin/docker-machine
でコマンドを削除して、再度インストールすればOKでした。

GCEにdocker-machineを作成

参考:この辺りを記事を参考にdocker-machineを作りました。
* http://qiita.com/ma2saka/items/74db9393072ff9e779c7
* http://docs.docker.jp/machine/drivers/gce.html
* https://github.com/rancher/rancher/issues/4711

GCE上にdockerインスタンスを作成するのには、事前に作成元のサーバからoauthで認証をする必要があります。

$ gcloud auth loginでURLが表示されるので、ブラウザでアクセスしトークンを取得。その後取得トークンをコンソールに貼り付けて完了。正しく認証ができれば$ gcloud auth listコマンドでユーザが表示されます。

※ホストマシンがGCEではない場合は、gcloudコマンドが入っていないので、pipにてインストールをする。

### docker-machine 作成コマンド
$ docker-machine create -d google \
–google-disk-size “30” \
–google-project “GCPのプロジェクトID” \
–google-zone asia-northeast1-b \
–google-machine-type “n1-standard-2” \
–google-preemptible \
–google-machine-image “https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20161027” \
gcetest5

これで問題なければdocker-machineが作成されます。管理画面からも作成されたことを確認。足りないポート開放やIPの付与などは管理画面から実施しました。2016-11-11_060230

使用できるディスクイメージは次のコマンドで確認可能
$ gcloud compute images list –uri

以下、docker-machine create時に出るエラーの備考録

エラー1 アクセス権

Running pre-create checks…
(gcetest) Check that the project exists
Error with pre-create check: “Project with ID \”XXXXX\” not found. googleapi: Error 403: Insufficient Permission, insufficientPermissions”

→間違いないなくプロジェクトはあるし、なんでだろう。。。これはホストマシンにGCEを使ったことが原因なのですが、インスタンス作成時のアクセス範囲(scope)が正しく設定できていなかった模様。「すべての Cloud API に完全アクセス権を許可」を設定してサーバを作成すればこの問題は解決されます。途中で変更はできませんのでサーバ作成時の設定する必要があります。

エラー2 docker-machineが古い

Error creating machine: Error running provisioning: exit status 6
open : no such file or directory
notifying bugsnag: [Error creating machine: Error running provisioning: exit status 6]

→docker-machine v0.7系で遭遇。バージョンを0.8.2に上げると解決する

エラー3 centOS7をインストールすると発生

Error running SSH command: Something went wrong running an SSH command!
command : netstat -tln
err : exit status 127
output : bash: netstat: command not found
・・・netstatがないからかな。

※CentOS7では、ifconfigやarp、netstatなどのよく利用しているネットワーク系のコマンドが非推奨となり、iproute2に置き換わってます。推奨されていないがnet-toolsをインストール。これでnetstatが使える。

$ yum -y install net-toolsをインストール

docker-machine動作確認

### 作成したdocker-machineにsshで接続
$ docker-machine ssh gcetest5

### docker-machine動作確認。nginxを設置
$ docker pull nginx
$ docker run -d -p 80:80 –name nginx nginx
2df9284fdf911b3e7b5453057a641a36e8cdf7263318261b601e30bd9ca35b70.

GCEの管理画面から80番で通信できるように設定を追加

$ curl http://$(docker-machine ip gcetest5)
HTMLがレスポンスとして返される

### docker machineコマンドメモ
#### バージョン確認
docker-machine version
docker-machine version 0.8.2, build e18a919

#### マシン開始、停止
docker-machine start|stop マシン名

#### マシンの確認
docker-machine ls

#### マシンの削除
docker-machine rm machine-name

3.Docker Composeをインストール

ホストマシン側にDocker Composeをインストールします。

https://github.com/docker/compose/releases/から安定してそうなバージョンを探す

インストール

$ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

4.KUSANAGI RoDをインストール、起動!

インストール、設定

$ git clone https://github.com/prime-strategy/kusanagi-docker.git
$ cd kusanagi-docker

更新HPを参考にdocker-compose.ymlの設定を作る

起動

#docker-machineの選択
$ eval $(docker-machine env gcetest5)

#docker-machineに設置
$ docker-compose -p gcetest5 up

起動するとコンソールにたくさんログが出てきます。

動作確認

http://XXX.XXX.XXX.XXXでアクセスすると、wordpressの管理画面が出ました。あとは通常のインストールと同じ流れで初期設定をします。

完成!!2016-11-11_063214

気になる速度は・・・ abコマンドで100リクエスト、100同時接続で試して見た結果です。

何回かやって平均的なものを選びました。マシンがn2-standardを使っていることもあり結構な速度が出ています。通常のwordperssを使った測定結果はこちらの記事「GCP/GCE 東京リュージョンを使ってベンチマークを取る!」に書いてますが、比較するとかなり速いです。KUSANAGIのBCACHEとFCACHEの両方をONにしているので、その辺りも速度に繋がっているのでしょうか。

Server Software: nginx
Server Hostname: XXX.XXX.XXX.XXX
Server Port: 80

Document Path: /
Document Length: 11002 bytes

Concurrency Level: 100
Time taken for tests: 0.783 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 1128100 bytes
HTML transferred: 1100200 bytes
Requests per second: 127.68 [#/sec] (mean)
Time per request: 783.207 [ms] (mean)
Time per request: 7.832 [ms] (mean, across all concurrent requests)
Transfer rate: 1406.60 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 5 7 1.0 7 12
Processing: 52 395 196.5 402 730
Waiting: 15 368 208.1 373 722
Total: 60 402 196.4 410 737

dockerなので、自由にミドルウェアを簡単に差し替えできるのが良いですね。今回はPHP7で動かしましたが、HHVMとかで動かすともっと早くなるかも。

次回はKUSANAGI RoDを使って、ひとつサイトを作って見たいと思います。