Deploy Docker images to Heroku

herokuに好きなコンテナデプロイ出来るようになったらしいので試した!!

この記事を受けて試してみた

会社で遊んでた(定時後ですよ!)ので社内向けのqiita teamに書いたんだけどべつに機密でもないので個人ブログに移す!

先に結論

herokuはあくまでPaaSであり、CaaSではない!

確かに好きなコンテナプッシュできるが、 あくまでWebアプリケーションのデプロイ方法の1つとして提供された機能 であり、
なんでもかんでも動かせるわけではなさそうだった(dnsサーバー立てたりvault立てたりはできなそう。pushまではできるけど)

※ もし動かせたらすまん → 動いたw ↓

結論を書いたものの…

コメントでvault動いた報告 (´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)

感謝 (´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)

CaaSじゃねーか!(怒)

以下(早とちりした)結論に至るまでの道のり

任意のコンテナをプッシュしてみる

ほんとに任意のコンテナプッシュできるのか!?vault乗ったコンテナプッシュしちゃうよ!

https://devcenter.heroku.com/articles/container-registry-and-runtime に沿って進める

まずプラグイン入れる

$ heroku plugins:install heroku-container-registry
Installing plugin heroku-container-registry... done

herokuコンテナレジストリにログイン

$ heroku container:login
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded

Dockerfikeのあるディレクトリをcloneしてcdする

$ git clone git@github.com:Lorentzca/vault_on_docker.git
$ cd vault_on_docker

herokuアプリ作成

$ heroku create
Creating app... done, ⬢ salty-eyrie-64019

イメージをビルドしてherokuコンテナレジストリにプッシュ

$ heroku container:push vault
Sending build context to Docker daemon 33.28 kB
Step 1 : FROM alpine
 ---> f70c828098f5
Step 2 : RUN apk --update add --virtual build-dependencies   curl   wget   unzip
 ---> Using cache
 ---> 1eb78de42356
Step 3 : RUN cd /usr/local/bin &&   wget https://releases.hashicorp.com/vault/0.6.0/vault_0.6.0_linux_amd64.zip &&   unzip vault_0.6.0_linux_amd64.zip &&   rm vault_0.6.0_linux_amd64.zip &&   mkdir /etc/vault.d &&   mkdir /var/vault
 ---> Using cache
 ---> 9f50d44eebcd
Step 4 : COPY ./config.hcl /etc/vault.d/config.hcl
 ---> Using cache
 ---> c72fa37f9c3a
Step 5 : ENTRYPOINT /usr/local/bin/vault server -config=/etc/vault.d/config.hcl
 ---> Using cache
 ---> 00bcc1060440
Successfully built 00bcc1060440
The push refers to a repository [registry.heroku.com/salty-eyrie-64019/vault]
454dd289f6fa: Pushed
233f396ac882: Pushed
506722a298d7: Pushed
77f08abee8bf: Pushed
unsupported: Your Docker image must specify a `CMD` instruction.
 !    Error: docker push exited with 1

CMDを定義する必要があるらしい…

テキトーに設定ファイルのオプション渡すところをCMDに移す

-ENTRYPOINT ["/usr/local/bin/vault", "server", "-config=/etc/vault.d/config.hcl"]
+ENTRYPOINT ["/usr/local/bin/vault", "server"]
+CMD ["-config=/etc/vault.d/config.hcl"]

再度push

$ heroku container:push vault
Sending build context to Docker daemon 33.28 kB
Step 1 : FROM alpine
 ---> f70c828098f5
Step 2 : RUN apk --update add --virtual build-dependencies   curl   wget   unzip
 ---> Using cache
 ---> 1eb78de42356
Step 3 : RUN cd /usr/local/bin &&   wget https://releases.hashicorp.com/vault/0.6.0/vault_0.6.0_linux_amd64.zip &&   unzip vault_0.6.0_linux_amd64.zip &&   rm vault_0.6.0_linux_amd64.zip &&   mkdir /etc/vault.d &&   mkdir /var/vault
 ---> Using cache
 ---> 9f50d44eebcd
Step 4 : COPY ./config.hcl /etc/vault.d/config.hcl
 ---> Using cache
 ---> c72fa37f9c3a
Step 5 : ENTRYPOINT /usr/local/bin/vault server
 ---> Running in a37b4f6f0ac9
 ---> db131f9fb3d7
Removing intermediate container a37b4f6f0ac9
Step 6 : CMD -config=/etc/vault.d/config.hcl
 ---> Running in 19d2822ca4a0
 ---> 63412a2b3c35
Removing intermediate container 19d2822ca4a0
Successfully built 63412a2b3c35
The push refers to a repository [registry.heroku.com/salty-eyrie-64019/vault]
454dd289f6fa: Layer already exists
233f396ac882: Layer already exists
506722a298d7: Layer already exists
77f08abee8bf: Layer already exists
latest: digest: sha256:181ef09c0426fec7833de1b0fb0785aa517588ba772846db8e6dd3dd0ad75af2 size: 1158

オオー!!pushできた!

管理画面見るとレジストリに登録したイメージ名と、CMDの内容が見れる

アクセスしてみるが…

vaultのdefaultのポート(8200)は特に何もフォワードするような設定していないので当然アクセスはできない

$ curl -sv https://salty-eyrie-64019.herokuapp.com:8200/v1/sys/init
*   Trying 54.243.64.13...
* connect to 54.243.64.13 port 8200 failed: Connection refused
* Failed to connect to salty-eyrie-64019.herokuapp.com port 8200: Connection refused
* Closing connection 0

じゃあポートフォワードの設定すれば良さそうだが…

The web process must listen for HTTP traffic on $PORT, which is set by Heroku. EXPOSE in Dockerfile is not respected, but can be used for local testing. Only HTTP requests are supported.

ポートの指定はそもそもherokuは出来ないんだっけ…

EXPOSE - While EXPOSE can be used for local testing, it is not supported in Heroku’s container runtime. Instead your web process/code should get the $PORT environment variable.

dockerfileのexpose機能はサポートされていない…

ポートフォワードサポートされてないので好きなポート使うのはむりぽそう

httpプロトコル以外使えなーい

その他メモ

VOLUME - Volume mounting is not supported. The filesystem of the dyno is ephemeral.

(´;ω;`)

その他サポートしてないdockerコマンド達

まとめ

突然のarukasとの比較コーナー

  • arukasのほうがポートの縛りがないので雑に好きなコンテナ動かせる(herokuもなんかやり方あるのかもしれないけど… いや無いか…)
  • arukasはβ版なので1週間に1回コンテナ再起動されてコンテナ内のデータ消える
  • herokuもコンテナ再起動でデータは消える(The filesystem is ephemeral)が、アドオンで連携してデータの保存先を指定できる のかな?(試してない)
    • herokuが寝た際にデータ消えるのかは不明

arukasとどっちが良いか

  • 両方β版なので本番運用は微妙
  • だけどWebアプリを動かすなら流石にhrokuの方が完成度高い
  • ただし、好きなポートで好きなコンテナ動かしたいならarukasのほうが使いやすい(herokuはそれは出来ない?)
  • herokuとarukasは↑みたいにコンセプトが違う(PaaSとCaaS)気がするので今回のherokuのアプデがarukas殺しになることは無さそう
  • 私はvault動かしたいのでCaaSじゃないとあかん -> arukas一択 みたいな。

と思ったんだけど冒頭に書いたとおりそんなことなかった

でもArukasの方が使いやすから(震え)