[Arukas.io CLI] #1 dockercloud/hello-worldを起動してみよう

Arukas.ioのCLIとdockercloud/hello-worldのイメージを利用して、Webサービスを起動してみます。


前提条件
========

## Arukas CLI

以下のバージョンで動作確認済

- v0.1.2

### arukasコマンドにパスが通っていること。

```bash:コマンド:
which arukas
```

```bash:結果(例):
/opt/local/bin/arukas
```

バイナリ版CLIを https://github.com/arukasio/cli/releases/ からダウンロードできます。



## 認証情報

### .envファイルに認証情報を保存してあること。

```bash:.env:
ARUKAS_JSON_API_TOKEN='<APIKey Token>'
ARUKAS_JSON_API_SECRET='<APIKey Secret>'
```

APIキーのページ( https://app.arukas.io/settings/api-keys )で作成・ 削除・確認できます。






## 手順の実行ディレクトリ (カレントディレクトリ)

この手順では、.envファイルが存在するディレクトリでarukasコマンドを実行する必要があります。(v0.1.2で確認)

.envを読み込めているかどうかは、例えば、vesionコマンドを実行することで確認できます。

```bash:コマンド:
arukas version
```

```text:結果(.envがカレントディレクトリに存在する場合):
v0.1.2
```

```text:結果(.envがカレントディレクトリに存在しない場合):
2016/06/09 01:23:45 ARUKAS_JSON_API_TOKEN is not set
```


0. 事前準備
===========


0.1. アプリケーション名の指定
-----------------------------

アプリケーション名を指定します。

```bash:変数の設定:
ARUKAS_APP_NAME='hello-world'
```


0.2. Dockerイメージの指定
-------------------------

利用するDocker Hub上のイメージを指定します。 ここでは、Docker公式のhello-worldイメージを利用します。

```bash:変数の設定:
DOCKER_IMAGE_NAME='dockercloud/hello-world'
```


0.3. 使用ポートの指定
---------------------

アプリケーションが利用するポート番号とプロトコル(TCP/UDP)を指定します
。

```bash:変数の設定:
ARUKAS_APP_PORT='80'
ARUKAS_APP_PROTOCOL='tcp'
```


0.4. インスタンスのスペック指定
-------------------------------

アプリケーションが利用するコンテナインスタンスの台数を指定します。

```bash:変数の設定:
ARUKAS_INSTANCE_COUNT='2'
```

アプリケーションが利用するコンテナインスタンスのメモリ容量を指定します。

```bash:変数の設定:
ARUKAS_INSTANCE_MEMSIZE='512'
```


1. 構築
=======


1.1. アプリケーションの起動
---------------------------

必要な変数が全て存在することを確認します。

```bash:変数の確認:
cat << ETX

        ARUKAS_APP_NAME:         ${ARUKAS_APP_NAME}
        DOCKER_IMAGE_NAME:       ${DOCKER_IMAGE_NAME}
        ARUKAS_APP_PORT:         ${ARUKAS_APP_PORT}
        ARUKAS_APP_PROTOCOL:     ${ARUKAS_APP_PROTOCOL}
        ARUKAS_INSTANCE_COUNT:   ${ARUKAS_INSTANCE_COUNT}
        ARUKAS_INSTANCE_MEMSIZE: ${ARUKAS_INSTANCE_MEMSIZE}

ETX
```

Arukas.io上でアプリケーションを起動します。

```bash:コマンド:
arukas run \
        --instances=${ARUKAS_INSTANCE_COUNT} \
        --mem=${ARUKAS_INSTANCE_MEMSIZE} \
        --app-name="${ARUKAS_APP_NAME}" \
        --ports=${ARUKAS_APP_PORT}:${ARUKAS_APP_PROTOCOL} \
        ${DOCKER_IMAGE_NAME}
```

```text:結果:
      ID  IMAGE   CREATED STATUS  NAME    ENDPOINT
      xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        dockercloud/hello-world 2016-06-09T01:23:45.678+09:00   stopped stupefied-carson-xxxx   stupefied-carson-xxxx.arukascloud.io
```

アプリケーションを搭載したコンテナが起動しはじめます。


1.2. 起動確認
-------------

arukas psコマンドに-aオプションを付けると全てのコンテナが一覧で表示さ
れます。 起動したコンテナを表示してみましょう。

```bash:コマンド:
arukas ps -a | grep ${ARUKAS_APP_NAME}
```

```text:結果:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        dockercloud/hello-world         2016-06-09T01:23:45.678+09:00   running stupefied-carson-xxxx   stupefied-carson-xxxx.arukascloud.io
```

起動したコンテナの識別子であるコンテナIDを変数に格納します。

```bash:コマンド:
ARUKAS_CONTAINER_ID=$( arukas ps -q ) \
        && echo ${ARUKAS_CONTAINER_ID}
```

```text:結果:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

コンテナIDは、そのコンテナの停止、起動、削除に必要になります。

起動したコンテナのエンドポイントを確認しましょう。

```bash:コマンド:
ARUKAS_CONTAINER_ENDPOINT=$( \
        arukas ps -a \
        | grep ${ARUKAS_APP_NAME} \
        | awk '{print $6}' \
) && echo ${ARUKAS_CONTAINER_ENDPOINT}
```

```text:結果:
determined-boyd-6116.arukascloud.io
```

コンテナのエンドポイントは、起動したアプリケーションへの接続点となります。

起動したコンテナのステータスを確認しましょう。

```bash:コマンド:
ARUKAS_CONTAINER_STATUS=$( \
        arukas ps -a \
        | grep ${ARUKAS_APP_NAME} \
        | awk '{print $4}' \
) && echo ${ARUKAS_CONTAINER_STATUS}
```

```text:結果:
running
```

ステータスがrunningになっていれば、アプリケーションの搭載されたコンテナの起動は完了しています。

アプリケーションにアクセスしてみましょう。

```bash:コマンド:
curl https://${ARUKAS_CONTAINER_ENDPOINT}/
```

```text:結果(起動完了していない場合):
curl: (52) Empty reply from server
```

```html:結果(起動完了している場合):
      <html>
      <head>
          <title>Hello world!</title>
          <link href='//fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
          <style>
          body {
                  background-color: white;
                  text-align: center;
                  padding: 50px;
                  font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
          }

          #logo {
                  margin-bottom: 40px;
          }
          </style>
      </head>
      <body>
          <img id="logo" src="logo.png" />
          <h1>Hello world!</h1>
          <h3>My hostname is 17da41f8f59b</h3>    </body>
      </html>
```


2. 停止
=======


2.1. 停止対象コンテナの確認
---------------------------

コンテナを停止する前に、停止対象のコンテナが想定されているものか必ず確認してください。

```bash:コマンド:
arukas ps -a | grep ${ARUKAS_APP_NAME}
```

```text:結果:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        dockercloud/hello-world         2016-06-09T01:23:45.678+09:00   running stupefied-carson-xxxx   stupefied-carson-xxxx.arukascloud.io
```


2.2. コンテナの停止
-------------------

コンテナを停止します。

```bash:コマンド:
arukas stop ${ARUKAS_CONTAINER_ID}
```

```text:結果:
Stopping...
```


2.3. ステータスの確認
---------------------

停止したコンテナのステータスを確認します。

```bash:変数の設定:
ARUKAS_CONTAINER_STATUS=$( \
        arukas ps -a \
        | grep ${ARUKAS_APP_NAME} \
        | awk '{print $4}' \
) && echo ${ARUKAS_CONTAINER_STATUS}
```

```text:結果:
stopped
```

ステータスがstoppedであれば、コンテナは無事停止しています。


3. 起動
=======

停止したコンテナを再度起動してみましょう。


3.1. コンテナの起動
-------------------

コンテナを起動する前に、起動対象のコンテナが想定されているものか必ず確認してください。

```bash:コマンド:
arukas ps -a | grep ${ARUKAS_APP_NAME}
```

```text:結果:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        dockercloud/hello-world         2016-06-09T01:23:45.678+09:00   stopped stupefied-carson-xxxx   stupefied-carson-xxxx.arukascloud.io
```


3.2. コンテナの起動
-------------------

コンテナを起動します。

```bash:コマンド:
arukas start ${ARUKAS_CONTAINER_ID}
```

```text:結果:
Starting...
```


3.3. ステータスの確認
---------------------

起動したコンテナのステータスを確認します。

```bash:変数の設定:
ARUKAS_CONTAINER_STATUS=$( \
        arukas ps -a \
        | grep ${ARUKAS_APP_NAME} \
        | awk '{print $4}' \
) && echo ${ARUKAS_CONTAINER_STATUS}
```

```text:結果:
running
```

ステータスがrunningであれば、コンテナは無事停止しています。

注釈: 停止するとDNSの正引きが消えるみたいで、起動前にエンドポイントにアクセスするとネガティブキャッシュにはいって、しばらくアクセスできないかもです。


4. 削除
=======


4.1. 削除対象コンテナの確認
---------------------------

コンテナを削除する前に、削除対象のコンテナが想定されているものか必ず確認してください。

```bash:コマンド:
arukas ps -a | grep ${ARUKAS_APP_NAME}
```

```text:結果:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        dockercloud/hello-world         2016-06-09T01:23:45.678+09:00   running stupefied-carson-xxxx   stupefied-carson-xxxx.arukascloud.io
```


4.2. コンテナの削除
-------------------

コンテナを削除します。

```bash:コマンド:
arukas rm ${ARUKAS_CONTAINER_ID}
```

```text:結果:
      (戻り値なし)
```


4.3. コンテナの存在確認
-----------------------

削除したコンテナが存在しないことを確認します。

```bash:コマンド:
arukas ps -a | grep ${ARUKAS_APP_NAME}
```

```text:結果:
      (戻り値なし)
```


完了
====

以上で、Arukas.ioのCLIとdockercloud/hello-worldのイメージを利用した、Webサービス起動のハンズオンは完了です。