ArukasにTornadoアプリのコンテナを上げるまで

 さくらのArukasにPythonのTornadoフレームワークを使ったアプリのコンテナを上げようと思った。なのでHelloWorld程度のものを実際に上げるまでをメモとして。


 まずはDockerイメージを作る環境が必要なのでその準備から。ぼくはつい最近までWindowsでDockerを使っていたが、ネットワークの不調からちょっとそれが面倒になった。なのでLinuxMintにDockerを入れたものを開発環境として用意した。DockerのLinuxMintへのインストールは下記コマンドで一発。
> sudo curl -sSL https://get.docker.com/ | sh


 Dockerを用意したらつづいて肝心のWebアプリ。Tornadoでサクッとしたものを用意した。あとでArukasの管理画面からDB接続文字列を入れるので、テストに使うハンドラはありきたりなHelloWorldメッセージではなく、環境変数を読み込んで出力するように。
import os


import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write(os.environ['db_conn'])

def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])


settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
}

def main():
app = make_app()
app.listen(80)
tornado.ioloop.IOLoop.current().start()

if __name__ == '__main__':
main()


 アプリが用意できたら次はDockerfile。Webアプリのプロセスはsupervisorを使ってデーモン管理。そうすれば自動で再起動設定とかもできる。
FROM ubuntu


RUN apt-get update
RUN apt-get install -y supervisor && \
apt-get install -y python3-pip
RUN pip3 install motor && \
pip3 install tornado

COPY . /usr/
WORKDIR /usr/

EXPOSE 80
CMD /usr/bin/supervisord -c supervisord.conf


 ついでにsupervisor.conf。これは最低限なので必要に応じて追記。
[supervisord]

nodaemon = true

[program:demoniacmadness]
command = python3 demon.py


 ここまできたらDockerfileに従ってDockerイメージをビルド・・・する前にDocker Hubへ行ってアカウントを取得しておく。イメージの名前に自分のアカウント名を入れる必要があるので。
https://hub.docker.com

 Docker Hubアカウントを入手したら改めてイメージ作成。Dockerfileのあるディレクトリで下記コマンド。
> docker build -t yourAcountName/imageName ./

 Dockerイメージの作成が終わったらそれをHubへプッシュする。まずログイン。
> docker login

 ログインできたらプッシュ。
> docker push yourAcountName/imageName

 あとはArukasで設定するだけ。imageに↑でプッシュしたyourAcountName/imageNameを入れる。最初のほうで書いたWebアプリが環境変数を読み込むものにしておいたので、環境変数を任意のキー、値で設定。その他必要事項をポイポイ入れて保存、そして再生ボタンでデプロイ開始。

アプリ名などがアレなのは当時読んでいたキルケゴールの本から取ったことによる。

 デプロイがこれを書いている時点で相当なネックだった。混雑からか4時間ぐらいトライしていたが全然成功しなかった。ただデプロイが失敗したことがわかるだけなので、混雑によるものかDockerイメージ内の設定ミスかもわからないし。まあまだ無料だし有料化するころにはそういうクオリティになってるだろう。

 デプロイがうまくいったらブラウザでアクセスしてみる。


 Webアプリのコンテナの土台ができたので、ここにぼくの必要な機能を実装していく。
comment: 0