Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Python3で動作するCGIServerをDocker上に構築

More than 3 years have passed since last update.

はじめに

「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します!
現在、仕事では要求分析・要件定義を中心に上流工程をしていますが、プログラムも書きます!
Docker上にPython3系(2016年7月18日現在 3.5.2)のイメージを使い、CGIServerを設置し、ブラウザからアクセスします。
(Python3+Dockerの情報は少ないですね〜苦戦しました 泣)

フレームワークを入れる前にPythonのWebサーバとしての動きを確認します。
(WebアプリのHello Worldですかね)

参考(非常に助かりました)

python3でCGIを動かしてみた。

1. ファイルを用意します。

dockerをインストールしている前提です。

下記4つのファイルを同じフォルダ内に用意します。
1-1. Dockerfike
1-2. CGIサーバ起動ファイル
1-3. index.html
1-4. Python3で書いたCGIプログラム

1-1. Dockerfileを作成

下記の任意のローカルフォルダに保存します。

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サーバ起動ファイルを作成

(これだけで動いてしまう)

cgiserver.py
import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

1-3. index.htmlを作成

トップページのHTMLです。フォームと送信ボタンがあります。
ここに入力した文字が次の画面で表示されます。

index.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で入力した値を表示するプログラムです。

cgitest.py
#!/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ファイルからコンテナをビルド

ローカル(Mac側)でDockerfileからビルド
$ docker build -t {任意のコンテナ名} .$ docker build -t python_cgi .

3. コンテナ起動(ローカルのMac側)

"-p 8000:8000"を指定するのがポイントです。
Dockerfileでも"EXPOSE 8000"を書いています。

ローカル(Mac側)でコンテナ起動
$ 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の公式イメージを使う方が汎用的です(笑)。

Dockerfile
FROM python:3.5.2
MAINTAINER Ryosuke Kamei <sr2smail@gmail.com>

4-2. ユーザ作成
CGIを動かす時にroot権限だとうまく動かないので、専用のユーザを作成します。
(かなりハマり、インフラ力ゼロを思い知りました)

Dockerfile
# ユーザ作成
RUN groupadd web
RUN useradd -d /home/python -m python

4-3. ファイルを配置

各ファイルを配置します。
cgitest.pyは"cgi-bin"フォルダを作成し、その中に置きます。
さらに、権限を"755"にします。
それ以外は、ユーザほHOME直下に置きます。
(Pythonのパスが通っていれば、どこでも良いようです。びっくり!)

Dockerfile
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"を指定します。

Dockerfile
# ポート番号を指定して、CGIサーバを起動
EXPOSE 8000
ENTRYPOINT ["/usr/local/bin/python", "/home/python/cgiserver.py"]
USER python

あとは、3で解説した通りに、コンテナを作成して、起動すれば、Webサーバとして動作します!

RyosukeKamei
「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します! 現在、仕事では要求分析から要件定義を中心に上流工程をしていますが、プログラムも書きます!2016年現在、ベンダーマネジメントが主な業務です! 「資格試験勉強をすればするほど、社会貢献ができる?」ウェブサイトを運営しており、並行してシステム構築中 http://korejoap.info/ 子供が3人いまーす
http://sr2s.org/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away