はじめに
「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します!
現在、仕事では要求分析・要件定義を中心に上流工程をしていますが、プログラムも書きます!
Docker上にPython3系(2016年7月18日現在 3.5.2)のイメージを使い、CGIServerを設置し、ブラウザからアクセスします。
(Python3+Dockerの情報は少ないですね〜苦戦しました 泣)
フレームワークを入れる前にPythonのWebサーバとしての動きを確認します。
(WebアプリのHello Worldですかね)
参考(非常に助かりました)
1. ファイルを用意します。
dockerをインストールしている前提です。
下記4つのファイルを同じフォルダ内に用意します。
1-1. Dockerfike
1-2. CGIサーバ起動ファイル
1-3. index.html
1-4. Python3で書いたCGIプログラム
1-1. Dockerfileを作成
下記の任意のローカルフォルダに保存します。
# pythonはイメージから
FROM python:3.5.2
MAINTAINER Ryosuke Kamei <sr2smail@gmail.com>
# ユーザ作成
RUN groupadd web
RUN useradd -d /home/python -m python
WORKDIR /home/python
# サーバ設置ファイル
ADD cgiserver.py /home/python
# テスト用のHTML
ADD index.html /home/python
# cgi-binフォルダを作成
RUN mkdir cgi-bin
ADD cgitest.py /home/python/cgi-bin
RUN chmod 755 /home/python/cgi-bin/cgitest.py
# ポート番号を指定して、CGIサーバを起動
EXPOSE 8000
ENTRYPOINT ["/usr/local/bin/python", "/home/python/cgiserver.py"]
USER python
1-2. CGIサーバ起動ファイルを作成
(これだけで動いてしまう)
import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)
1-3. index.htmlを作成
トップページのHTMLです。フォームと送信ボタンがあります。
ここに入力した文字が次の画面で表示されます。
<!DOCTYPE html>
<html>
<head>
<title>CGI Sample</title>
</head>
<body>
<form action="/cgi-bin/cgitest.py" method="POST">
<input type="text" name="text" value="test" />
<input type="submit" name="submit" />
</form>
</body>
</html>
1-4. Python3で書いたCGIプログラム
index.htmlで入力した値を表示するプログラムです。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import cgi
html_body = """
<!DOCTYPE html>
<html>
<head>
<title>受信したデータを表示</title>
<style>
h1 {
font-size: 3em;
}
</style>
</head>
<body>
<h1>%s</h1>
</body>
</html>
"""
form = cgi.FieldStorage()
text = form.getvalue('text','')
print(html_body % (text))
2. Dockerファイルからコンテナをビルド
$ docker build -t {任意のコンテナ名} .
例
$ docker build -t python_cgi .
3. コンテナ起動(ローカルのMac側)
"-p 8000:8000"を指定するのがポイントです。
Dockerfileでも"EXPOSE 8000"を書いています。
$ docker run -d -p 8000:8000 {ビルド時につけたコンテナ名}
例
$ docker run -d -p 8000:8000 python_cgi
ブラウザでアクセス
http://192.168.99.100:8000/
送信ボタンを押すと、フォームに入力された値が表示されます!
4. Dockerfileの解説
4-1. pythonはイメージから
makeでインストールなどを試したのですが、やはりpythonの公式イメージを使う方が汎用的です(笑)。
FROM python:3.5.2
MAINTAINER Ryosuke Kamei <sr2smail@gmail.com>
4-2. ユーザ作成
CGIを動かす時にroot権限だとうまく動かないので、専用のユーザを作成します。
(かなりハマり、インフラ力ゼロを思い知りました)
# ユーザ作成
RUN groupadd web
RUN useradd -d /home/python -m python
4-3. ファイルを配置
各ファイルを配置します。
cgitest.pyは"cgi-bin"フォルダを作成し、その中に置きます。
さらに、権限を"755"にします。
それ以外は、ユーザほHOME直下に置きます。
(Pythonのパスが通っていれば、どこでも良いようです。びっくり!)
WORKDIR /home/python
# サーバ設置ファイル
ADD cgiserver.py /home/python
# テスト用のHTML
ADD index.html /home/python
# cgi-binフォルダを作成
RUN mkdir cgi-bin
ADD cgitest.py /home/python/cgi-bin
RUN chmod 755 /home/python/cgi-bin/cgitest.py
4-4. 仕上げ
EXPOSEでポート番号を指定し、ENTRYPOINTで"cgiserver.py"を起動し、USERで新しく作成したユーザ"python"を指定します。
# ポート番号を指定して、CGIサーバを起動
EXPOSE 8000
ENTRYPOINT ["/usr/local/bin/python", "/home/python/cgiserver.py"]
USER python
あとは、3で解説した通りに、コンテナを作成して、起動すれば、Webサーバとして動作します!