LoginSignup
19
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-18

はじめに

「優しい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サーバとして動作します!

19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17