Edited at

Docker上でPython3+軽量フレームワークbottleを動かす

More than 3 years have passed since last update.


はじめに

「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します!

現在、仕事では要求分析・要件定義を中心に上流工程をしていますが、プログラムも書きます!

Docker上にPythonのフレームワーク"bottle"をインストールし、ブラウザからアクセスするところまでを解説します!


バージョンアップ記事

Docker上でPython3+bottle環境を構築し、MySQLと連携する【とりあえず動かす編】

この記事ではインストールまででしたが、上記の記事はdocker-composeを使って一発で環境構築をしています!

Docker + Python3 + bottleの情報って少なく苦戦しました〜


参考(Special Thanks!!!)

joshua connerさんのGitHub


1. ファイルを用意

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

下記2つのファイルを同じフォルダ内に用意します。

1-1. Dockerfike

1-2. bottle起動ファイル


1-1. Dockerfileを作成(ローカルのMac側)

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


Dockerfile

# Pythonは公式イメージ

FROM python:3.5.2

# オリジナルはJoshua Conner氏
# MAINTAINER Joshua Conner <joshua.conner@gmail.com>
MAINTAINER Ryosuke Kamei <sr2smail@gmail.com>

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

# bottleを使ったサーバ起動ファイルをコピー
ADD server.py /home/bottle/server.py

# bottleをインストール
RUN pip install bottle

# ポートはserver.pyと合わせて8080にし、サーバ起動ファイルを新しく作成した"bottle"ユーザで起動
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/python", "/home/bottle/server.py"]
USER bottle


1-2. bottle起動ファイルを作成(ローカルのMac側)

ポイントはrunメソッドの引数、Dockerを使う場合

host='0.0.0.0'にします!

ポート番号はDockerfileと合わせます。


server.py

from bottle import route, run

@route('/')
def hello():
return "Hello World!!!!!!!\n"

run(host='0.0.0.0', port=8080, debug=True)



2. Dockerファイルからコンテナをビルド


ローカル(ローカルのMac側)でDockerfileからビルド

$ docker build -t {任意のコンテナ名} .


$ docker build -t python_bottle .


3. コンテナ起動(ローカルのMac側)し、動作確認

"-p 8080:8080"を指定するのがポイントです。

Dockerfileでも"EXPOSE 8080"を指定し、server.pyのrunメソッドでも"port=8080"とします。


ローカル(Mac側)でコンテナ起動

$ docker run -d -p 8080:8080 {ビルド時につけたコンテナ名}


$ docker run -d -p 8080:8080 python_bottle

ホスト側のポートを調べる


プロセスコマンド(ローカルのMac側)

$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f07324bb0187 python_bottle "/usr/local/bin/pytho" 3 seconds ago Up 3 seconds 0.0.0.0:32772->8080/tcp suspicious_dubinsky

"0.0.0.0:32772->8080/tcp"となっているので、ローカル側のポートは"32772"です。毎回ランダムに変わるので注意(固定にする方法あるはず)してください。

ブラウザでアクセス

http://192.168.99.100:32772/


4. Dockerfileの解説

4-1. pythonはイメージから

makeでインストールなどを試したのですが、やはりpythonの公式イメージを使う方が汎用的です(笑)。


Dockerfile

# Pythonは公式イメージ

FROM python:3.5.2

# オリジナルはJoshua Conner氏
# MAINTAINER Joshua Conner <joshua.conner@gmail.com>
MAINTAINER Ryosuke Kamei <sr2smail@gmail.com>


4-2. ユーザ作成

CGIを動かす時にroot権限だとうまく動かないので、専用のユーザを作成します。

(かなりハマり、インフラ力ゼロを思い知りました)


Dockerfile

# ユーザ作成

RUN groupadd web
RUN useradd -d /home/bottle -m bottle

4-3. ファイルを配置し、bottleをインストール

各ファイルを配置します。


Dockerfile

# bottleを使ったサーバ起動ファイルをコピー

ADD server.py /home/bottle/server.py

# bottleをインストール
RUN pip install bottle


4-4. 仕上げ

EXPOSEでポート番号を指定し、ENTRYPOINTで"server.py"を起動し、USERで新しく作成したユーザ"bottle"を指定します。


Dockerfile

# ポートはserver.pyと合わせて8080にし、サーバ起動ファイルを新しく作成した"bottle"ユーザで起動

EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/python", "/home/bottle/server.py"]
USER bottle

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