はじめに
「優しいIT」という理念の基、ITコンサルタントをしている亀井亮介と申します!
現在、仕事では要求分析・要件定義を中心に上流工程をしていますが、プログラムも書きます!
Docker上にPythonのフレームワーク"bottle"をインストールし、ブラウザからアクセスするところまでを解説します!
バージョンアップ記事
Docker上でPython3+bottle環境を構築し、MySQLと連携する【とりあえず動かす編】
この記事ではインストールまででしたが、上記の記事はdocker-composeを使って一発で環境構築をしています!
Docker + Python3 + bottleの情報って少なく苦戦しました〜
参考(Special Thanks!!!)
1. ファイルを用意
dockerをインストールしている前提です。
下記2つのファイルを同じフォルダ内に用意します。
1-1. Dockerfike
1-2. bottle起動ファイル
1-1. Dockerfileを作成(ローカルのMac側)
下記の任意のローカルフォルダに保存します。
# 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と合わせます。
from bottle import route, run
@route('/')
def hello():
return "Hello World!!!!!!!\n"
run(host='0.0.0.0', port=8080, debug=True)
2. Dockerファイルからコンテナをビルド
$ docker build -t {任意のコンテナ名} .
例
$ docker build -t python_bottle .
3. コンテナ起動(ローカルのMac側)し、動作確認
"-p 8080:8080"を指定するのがポイントです。
Dockerfileでも"EXPOSE 8080"を指定し、server.pyのrunメソッドでも"port=8080"とします。
$ docker run -d -p 8080:8080 {ビルド時につけたコンテナ名}
例
$ docker run -d -p 8080:8080 python_bottle
ホスト側のポートを調べる
$ 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の公式イメージを使う方が汎用的です(笑)。
# 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権限だとうまく動かないので、専用のユーザを作成します。
(かなりハマり、インフラ力ゼロを思い知りました)
# ユーザ作成
RUN groupadd web
RUN useradd -d /home/bottle -m bottle
4-3. ファイルを配置し、bottleをインストール
各ファイルを配置します。
# bottleを使ったサーバ起動ファイルをコピー
ADD server.py /home/bottle/server.py
# bottleをインストール
RUN pip install bottle
4-4. 仕上げ
EXPOSEでポート番号を指定し、ENTRYPOINTで"server.py"を起動し、USERで新しく作成したユーザ"bottle"を指定します。
# ポートはserver.pyと合わせて8080にし、サーバ起動ファイルを新しく作成した"bottle"ユーザで起動
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/python", "/home/bottle/server.py"]
USER bottle
あとは、3で解説した通りに、コンテナを作成して、起動すれば、Webサーバとして動作します!