Moved from Arukas to hyper.sh

Arukasのベータサービスが終了したので移住先を探さねばなりません。

そこで、少し前に会社のSlackでDockerマンが呟いてるのを見てオッとなったhyper.shを使ってみます。

hyper.shもArukasのようなContainer-as-a-Serviceで、特徴は通常のLinuxコンテナは同一ホスト上のカーネルから複数立ち上げるのに対し、hyper.shはコンテナ毎に独立したカーネル上で動かしている点です。これにより、セキュアなコンテナ環境の提供を可能にしているようです。

また、コンテナの利点である起動スピードを殺さないように特別なハイパーバイザが使われているようです。

あとはDockerボリュームを使えるのがありがたい(Arukasはβ版なのもありボリュームを使えなかった)。データ永続化できる!やった!

お値段。結構細かく課金される。記事の最後の方で1コンテナ立てた際の細かい月額料金を計算しています。

サービス登録すると1ヶ月のフリー期間が始まるんだけど、クレジットカードを登録するとフリー期間が3ヶ月に延長されるので登録しておくと良さそう(最初から3ヶ月かも?うる覚え)。

フリー期間に対象となるリソースは以下。コンテナを稼働させるのに必要なもの一式一セットって感じですね。

  • 1 container
  • 1 image
  • 1 Floating IP (FIP)
  • 1 Volume
  • 1 Set of credentials

フリー期間が終わると課金が開始される。

during the free tier period, you will incur no costs for the following resources: 1 Container (<= S4), 1 Image, 1 Volume, 1 Floating IP.
Once the free tier period ends, you will be charged accordingly each month for all resources.

ログイン後のダッシュボードより引用

フリー期間中に使えるコンテナの最大スペックであるS4は、メモリ512MB、CPUは1コア。基本的にメモリのサイズとCPUのコア数でコンテナのスペックが上がっていく感じですね。ルートボリュームはどのコンテナも10GBでこいつも課金対象なので注意。ネットワークはどのコンテナでも無料。

インストール

install方法。

brew install hyper

ヘルプを見ると、dockerコマンドをラップしたような印象。dockerコマンドと大体同じ感覚で使えるぽい(しかし動くのはローカルではなくhyper上!)。

Usage: hyper [OPTIONS] COMMAND [arg...]
       hyper [ --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

  --config=~/.hyper       Location of client config files
  -D, --debug             Enable debug mode
  -H, --host=[]           Daemon socket(s) to connect to
  -h, --help              Print usage
  -l, --log-level=info    Set the logging level
  -v, --version           Print version information and quit

Commands:
    attach    Attach to a running container
    commit    Create a new image from a container's changes
    compose   Define and run multi-container applications with Hyper.sh
    config    Config access key and secret key to Hyper server
    create    Create a new container
    cron      Manage cron service of Hyper.sh
    exec      Run a command in a running container
    fip       Manage Hyper.sh floating IPs
    func      Manage func service of Hyper.sh
    history   Show the history of an image
    images    List images
    info      Display system-wide information
    inspect   Return low-level information on a container or image
    kill      Kill a running container
    load      Load a local image or a tar file
    login     Register or log in to a Docker registry
    logout    Log out from a Docker registry
    logs      Fetch the logs of a container
    port      List port mappings or a specific mapping for the CONTAINER
    ps        List containers
    pull      Pull an image or a repository from a registry
    push      Push an image or a repository to a registry
    rename    Rename a container
    restart   Restart a container
    rm        Remove one or more containers
    rmi       Remove one or more images
    run       Run a command in a new container
    search    Search the Docker Hub for images
    service   Manage service of Hyper.sh
    sg        Manage security group of Hyper.sh
    snapshot  Manage Hyper.sh snapshots
    start     Start one or more stopped containers
    stats     Display a live stream of container(s) resource usage statistics
    stop      Stop a running container
    update    Update resources of one or more containers
    version   Show the Hyper.sh version information
    volume    Manage Hyper.sh volumes
    wait      Block until a container stops, then print its exit code

Run 'hyper COMMAND --help' for more information on a command.

hyperの設定

まずはクレデンシャルの作成。

hyperコマンドで認証。

$ hyper config
WARNING: null cloud config
Enter Access Key: XXXXXXXX
Enter Secret Key: YYYYYYYY
WARNING: Your login credentials has been saved in /Users/lorentzca/.hyper/config.json

これだけ。

もしくはHYPER_ACCESSHYPER_SECRET環境変数があればそれを使ってくれる。

コンテナの起動

dockerコマンドと同じ。

  • /var/vaultにボリュームをマウントしている(ボリュームは無料期間が終わると課金対象になる)
hyper run -d --name vault -v /var/vault -p 8200:8200 lorentzca/vault_on_docker

実行結果はこんな感じ。

$ hyper run -d --name vault -v /var/vault -p 8200:8200 lorentzca/vault_on_docker
Unable to find image 'lorentzca/vault_on_docker:latest' in the current region
latest: Pulling from lorentzca/vault_on_docker

0a8490d0dfd3: Pull complete
7c27cd5dccf7: Pull complete
1ab9185c3189: Pull complete
ec203001e1a0: Pull complete
Digest: sha256:df6dd50de552521f04d2362742ee7975dd6f2f86e1ae98a2d30f1e529d2c8313
Status: Downloaded newer image for lorentzca/vault_on_docker:latest

15663fe66c5f3527689efbec1c44972914b5a55f3087c4592262ed6f2212140e

起動しました。✨

$ hyper ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES               PUBLIC IP
15663fe66c5f        lorentzca/vault_on_docker   "/usr/local/bin/vault"   9 minutes ago       Up 9 minutes        0.0.0.0:8200->8200/tcp   vault

デフォルトのコンテナのサイズはs4で、--sizeオプションを使うことで指定できるとのこと。

起動したコンテナのサイズの情報は以下のようにinspect内にある。

$ hyper inspect vault | jq '.[].Config.Labels.sh_hyper_instancetype'
"s4"

コンテナの削除

コンテナ周りの削除をやってみます。

  • コンテナの停止、ボリュームの削除、イメージの削除
$ hyper stop vault
vault

$ hyper rm vault
vault
NOTICE : attached volume(1366da82761d2640cf3ab618d9536c28ac95c626ae10233adc8b43e791fb1b3) is not deleted

$ hyper volume rm 1366da82761d2640cf3ab618d9536c28ac95c626ae10233adc8b43e791fb1b3
1366da82761d2640cf3ab618d9536c28ac95c626ae10233adc8b43e791fb1b3

$ hyper rmi lorentzca/vault_on_docker
Untagged: lorentzca/vault_on_docker:latest
Deleted: sha256:0d8d6211595dd87f14dc444836378243212c7d327d6be613eccedc3af596a16f
Deleted: sha256:44e876c5395ac9ce29eed7c1eb02e2cf2119c1ed23e082728861f3c2dc8eead7
Deleted: sha256:6e59fa059f99d5537154319a7b1ca30615a1779ffb13d7b130589e12ccd069a0
Deleted: sha256:71a6df77b898cead95efd1d03e18503837a315df8d4bbe7796dc6ffb18e25183

ボリュームに名前をつけて作成

ボリュームは単体で作成可能で、名前もつけられます。後から変更はできない。たぶん。

hyper volume create --size=10 --name=vault-data

できた。

$ hyper volume ls
DRIVER              NAME                SIZE                CONTAINER
hyper               vault-data          10 GB

こんな感じでコンテナを起動するときに指定(-v vault-data:/var/vault)できます。

hyper run --size=s1 -d --name vault -v vault-data:/var/vault -p 8200:8200 lorentzca/vault_on_docker

コンテナに紐付けられました。

$ hyper volume ls
DRIVER              NAME                SIZE                CONTAINER
hyper               vault-data          10 GB               1b98009e650b54364b7e1860c5de8021112d236b79889f3dad188f2d7a7ca052

FIPをアタッチする

FIP(Floating IP)はコンテナ間で付け替え可能なグローバルIPアドレスです。

まずFIPを作成します。

hyper fip allocate 1

以下のような警告が出ます。

Please note that Floating IP (FIP) is billed monthly. The billing begins when a new IP is allocated, ends when it is released. Partial month is treated as a entire month. Do you want to continue? [y/n]:

hyper.shは基本的に秒単位で課金されますが、FIPは取得した瞬間1ヶ月分の請求(1ドル)が発生します。

コンテナにアタッチします。

hyper fip attach <割り当てたいFIP> vault

hyper psでFIPが割り当てられたか確認できます。

費用

無料期間なのでわかりませんが、ここまでで使ってきたリソースから計算すると、

  • s1サイズのコンテナ代: $0.0000004/second = $1.03/month
  • s1コンテナの10GBのルートファイルシステム代: $0.1/GB/month * 10 = $1/month
  • 10GBのボリューム代: $0.1/GB/month * 10 = $1/month
  • lorentzca/vault_on_docker のボリューム代(59.68MBなので100MBに切り上げ計算と思われる): 1GB@$0.0000000386/GB/second $0.1/GB/month = $0.01/month
  • FIP代: $1/month

なので合計すると1ヶ月で発生する請求は$4.04くらいと思われます(そこはかとなく不吉な数字w)。

感想

最初見たときは1ヶ月1ドルかと思ってウオオって思ったけど実際は5ドル弱でござった…。5ドルなら良いけどね!

課金体系がかなり細かいので注意が必要そう。特にDocker Hubから引っ張ってきたイメージにも課金が発生するのは気をつけなければ…。色々コンテナ建てて掃除して〜ってやってたら実はイメージが数GB分溜まっちゃってましたみたいなのがありそう。

とりあえず使いやすいし最小構成なら5ドル以内に収まりそうなのでArukasの移住先として使っていくぞ!

参考リンク