Python
Flask
docker

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

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