はじめに
ハンズオンや思いつきの用途で、環境をサクッと作って使い捨てたかったので
数ファイルと数秒で構築できるように作りました。
準備
- Dockerが動く環境
- インターネット接続
基礎的なことしかやらないので、Dockerさえ動けばなんとかなるはず。
私の実行環境はDocker for MacのPublic Betaです。
バージョン
$ docker --version
Docker version 1.12.0, build 8eab29e, experimental
ソース
ローカルディレクトリ構成
flask/
├ Dockerfile
├ requirements.txt
└ hello.py
Dockerfile
# ベースイメージの指定
FROM python:3.5.2-alpine
# ソースを置くディレクトリを変数として格納
ARG project_dir=/web/hello/
# 必要なファイルをローカルからコンテナにコピー
ADD requirements.txt $project_dir
ADD hello.py $project_dir
# requirements.txtに記載されたパッケージをインストール
WORKDIR $project_dir
RUN pip install -r requirements.txt
# (コンテナ内で作業する場合)必要なパッケージをインストール
RUN apk update
RUN apk add zsh vim tmux git tig
requirements.txt
$ pip install flask
の実行後に$ pip freeze > requirements.txt
したもの
requirements.txt
click==6.6
Flask==0.11.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.10
パッケージのバージョンが変わっても困らないのであれば
単純にコンテナ内で$ pip install flask
でもまったく問題なし。
hello.py
公式ページから拝借。
app.run
の引数は開発用途として修正。
hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello World!"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
手順
イメージ作成
イメージ作成
$ cd /path/to/flask/
$ docker build -t flask .
- '-t flask': 作成するイメージの名前を'flask'にする
- '.': カレントディレクトリにあるDockerfileを使用
コンテナ起動
コンテナ起動
$ docker run -p 5000:5000 -it flask /bin/sh
- '-p 5000:5000': hostの5000番ポートをコンテナの5000番ポートに向ける
- '-it': 現在の入力デバイスでコンテナを操作
- 'flask': イメージ名の指定
- '/bin/sh': 起動したコンテナでshコマンドを実行
Flask実行
hostやportはhello.py
内で既に指定されているため、実行のみ。
Flask実行
$ cd /path/to/hello/
$ python hello.py
ブラウザからlocalhost:5000
にアクセスすると、Hello World!
が表示されます。
むすび
今まではAnsibleでpyenvやvirtualenvを駆使して作ってたけど
どうせ捨てるし、バージョン管理周りはざっくりでいいと思う。
Pythonのインストールはベースイメージにおまかせなので
ちゃんとした開発をするならDockerfile読み解くなり自分で作るなりする。