Edited at

Dockerコンテナ内のFlaskサーバにアクセス(Python)


概要

PythonのライブラリFlaskを用いてミニマルなサーバをたて、それをDockerコンテナ上で動かし、ローカルのパソコンからアクセスする方法について説明します。

私自身Dockerについて勉強中のため、かなり初心者向けの内容になっております。


準備するもの

以下のようなディレクトリを用意します。

数字が振られているファイルについては、後ほど中身を説明します。

/docker-python

┣ Dockerfile (1)
┗ web
┣ main.py (2)
┗ templates
┗ index.html (3)


(1) Dockerfile

FROM centos:7

#IUSリポジトリを追加
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm
#Python3.5をインストール
RUN yum install -y python35u python35u-libs python35u-devel python35u-pip
#Pythonのライブラリrequestsをpip
RUN python3.5 -m pip install requests
#PythonのライブラリFlaskをpip
RUN python3.5 -m pip install flask

COPY web /var/www/html/web/

#コンテナ起動時にFlaskサーバを立ち上げ
CMD ["python3.5", "/var/www/html/web/main.py"]

Pythonと必要ライブラリをインストールし、実行時にサーバを立ち上げる設定をしています。


(2)main.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def show_page():
return render_template('index.html', msg='Hello, ', additional_msg="from Python")

app.run(host='0.0.0.0',port=5000,debug=True)

全ての要求("/")に対して、index.htmlのページを返します。

注意が必要なのは、最終行のhost='0.0.0.0'の部分です。

最初私はこの部分を適当な番号を指定していたのですが、どうやら0.0.0.0でなければ外部からのアクセスができないようなので、必ずこの番号にする必要があります。


(3)index.html

<!DOCTYPE html>

<html>
<head>
<meta charset="utf-8">
<title>Hello from Python</title>
<style>
#firstMsg{
font-size: 30px;
font-family:Impact;
color:blue
}
#secondMsg{
font-size: 30px;
font-family:Impact;
color:yellow
}
</style>
</head>
<body bgcolor="black">
<p id="firstMsg">
{{msg}}
</p>
<p id="secondMsg">
{{additional_msg}}
</p>
</body>
</html>

main.pyで{msg}{additional_msg}に値が埋め込まれます。


Dockerコマンド

上のフォルダが作成できたら、Dockerのコマンドを打っていきます。


イメージの作成

Dockerfileのある場所にcdして、

docker build . -t docker-python -q

のコマンドを打ってDockerイメージの作成をします。

.でカレントディレクトリにあるDockerfileを指定して、-tオプションで名前をつけて、-qオプションでログを抑制しています。

Successfully tagged docker-python:latestのメッセージが出たら、

docker images

コマンドを打ち、イメージが作成されたことを確認します。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker-python latest 8febc583700e 27 minutes ago 529MB

上記のように出れば、うまく作成できています。


コンテナの立ち上げ

作成したイメージを基に、コンテナを立ち上げます。

docker run -it -p 5000:5000 docker-python

Dockerfileに、起動時にはFlaskサーバを立ち上げるように記述したため、以下のような出力がされると思います。

 * Serving Flask app "main" (lazy loading)

* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!

これでサーバが立ち上がりました。


実行

パソコンのブラウザから、http://localhost:5000/を叩くと、以下のような画面が出てきます。

Screen Shot 2018-10-06 at 15.11.37.png

非常に地味ですが、なんとかサーバを立ち上げることができました。