概要
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/
を叩くと、以下のような画面が出てきます。
非常に地味ですが、サーバを立ち上げることができました。