【Docker】Arukas アプリ作成時にハマったこと(EXPOSE 宣言は必須編)


はじめに

さくらインターネットの Docker ホスティングサービスである Arukas でアプリを作成しているときにハマったのでメモ。

顛末

まず、Arukas で アプリ(= Docker コンテナ)を起動するためには、Docker Hub に登録されているイメージを利用する必要がある。

今回使おうとしたのは Ubuntu18.04 の公式イメージ。

Arukas のアプリ追加コンソールを開いて、イメージとして Docker Hub で公式提供されているubuntu:18.04を指定してアプリ作成。

[OK]でアプリ起動。

アプリのステータスが「アプリはデプロイ中です」となったまましばらく待つ1と...「アプリの起動に失敗しました」となり起動できない。

イメージ名を_/ubuntu:18.04と指定して再試行したが同様に起動に失敗する。

調べてみると Arukas のFAQに以下のような記載があった。

対象ポートはDockerfile内においてEXPOSE宣言で開放されておりますでしょうか。 EXPOSEで開放されているポートが入力されていない場合、サーバとして起動しないことがございます。

とのこと。
これ、特にポート開放を必要とするサービスは入れない場合に、適当なポートをEXPOSE宣言しておくだけで良いのだろうか?例えば SSH デーモンを動かさずとも取り敢えずEXPOSE 22を設定しておくだけで正常起動の要件は満たされるのだろうか?

検証してみる。
以下のような、素の Ubuntu にポート22を開放するだけの Dockerfile を用意。

FROM ubuntu:18.04

EXPOSE 22

CMD echo 'Hello docker world!'

上記 Dockerfile からイメージをビルドして、自身の管理する Docker Hub に登録。(実際の試行ではxxxxxxを実在の Docker Hub アカウント名としています)

docker build . -t xxxxxx/ubuntu:18.04
docker push xxxxxx/ubuntu:18.04

Arukas のアプリ作成画面に戻り、先程登録したイメージxxxxxx/ubuntu:18.04を指定し、アプリを作成し、起動。(この時、Arukas 側のポート設定は不要です。)

アプリが正常に起動した。

結論

Arukas のアプリで利用するイメージは何らかの一つ以上のポートがEXPOSE宣言されている必要がある。
しかし、コンテナ内でそのポートを利用するサービスを動かしたり、 Arukas 側のポート設定で同じ番号のポートを開放する必要はない。

おまけ

因みに、SSH デーモンがちゃんと設定されたイメージを使用し、以下のように Arukas 側でもポート22を設定してあげれば、

作成後のアプリのポート22に対して動的なハイポート(~arukascloud.io:31XXX31XXX部分)が自動的にマッピングされるので、例えば以下のようなマッピングが行われた場合はssh [email protected] -p 31XXXとすればアプリに SSH 接続できます。(アプリを再起動するたびに URI やハイポートの値は動的に変わるので注意。)


  1. https://support.arukas.io/hc/ja/articles/210357188 によると、アプリケーションの設定内容に誤りがある場合は起動試行中のアプリケーションは15分以内に強制停止されるとのこと。