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の方が使いやすから(震え)