Windows上で手軽にGunicornを使ったPythonサーバのテストができる環境が欲しくなったのでDockerをこねくりまわして作ってみる。Windows上なのでBoot2Dockerを使う。Pythonサーバは今回はTornado+GunicornをNginxで動かす。今回はなんとか動作確認できるまでにこぎつけるようにしたので、細かい部分はもっとうまい書き方があるかもしれない。
以下の二つのファイル(PythonスクリプトとNginx設定ファイル)がWindowsのユーザディレクトリの真下の適当な名前のディレクトリに入っているとする。そんな場所に置いているのは、WindowsのユーザディレクトリがDockerにマウントされるようになっていてユーザディレクトリから浅いところだと都合がいいから(c:\Users\ - /c/Users/)。
hello.py
hello.conf(Nginxの設定ファイル)
Boot2Dockerをインストールして立ち上げる。とりあえずポピュラーなubuntuをサーバ環境として使うことにする。
> docker pull ubuntu:latest
落としたubuntuイメージからコンテナを作って、ubuntu上で最低限のものをインストールする。あと不必要なnginxのファイルを消しておく。
> docker run -it --name ubuntu0 ubuntu bash
apt-get update
apt-get install -y nginx
apt-get install -y python3-pip
rm /etc/nginx/sites-enabled/default
上記が済んだらctrl+dでコンテナ内からexit。このコンテナを新しいイメージとしてコミットする。
> docker commit ubuntu0 py_im
これで私的Pythonサーバ開発の環境が用意できた。このイメージはpipが入っているのでいろんなPython開発の環境を手早く用意できるだろう。ここからはTornadoとGunicornを使う今回の目的に向けて整えていく。
DockerでPythonスクリプトとNginx設定ファイルが置かれたディレクトリへ移動する。
> cd /c/Users/john/hello
そのディレクトリにDockerfileを用意する。Dockerfileとはコンテナ内で実行するコマンドなどを記述したテキストファイル。
Dockerfileを書いたのでビルドする。
> docker build -t py_im0 .
p0というコンテナ名でpy_im0がオリジナルイメージのコンテナを走らせる。Dockerのポートからコンテナのポートへアクセスを提供してもらうように設定する。
> docker run -d -p 80:80 --name p0 py_im0
コンテナ内部でNginxを走らせる。
> docker exec p0 nginx
Windowsのブラウザでアクセスしてみる(IPはデフォルトで192.168.59.103)。

動作確認終了。Pythonスクリプトを更新したときにコンテナのビルド以降を再実施すれば手軽にテストが実行できる。
あとはプロジェクト固有のDockerへの命令(コンテナではなくDocker自体)をスクリプトとしてまとめるなど。
最後に改めてなぜDockerを使ったかを。
Windows上でUNIXサーバがほしくなった場合、Dockerが出てくる以前の選択肢はVMWareやVirtualBoxで仮想マシンを用意することだった。ただ仮想マシンはその中でおこなった操作が基本的に残り、変更以前の状態を用意するのはイメージを用意したりマシンを立ち上げなおしたりでなにかしら手間がかかった。
Dockerではすでに起動しているLinuxのカーネルを使ってコンテナのOS(仮想マシンでのゲストOS的なもの)が動作するので立ち上げなおしの手間はほとんどないし、OSイメージの用意やチューンのコマンドもテキストファイルにまとめておいて実行できる。うまくまとめればワンタッチで手早く使い捨ての環境が用意できるということだ。
パッケージの依存などを気にしながらテストを行いたい場合、ある程度使っていていろんなパッケージが入り乱れている仮想マシンより、使い捨てを繰り返していて最低限のパッケージしか入っていないコンテナ環境のほうがエラー時のデバッグがしやすい。そんなわけで今回はDockerを選んだ。
参考******
https://docs.docker.com/installation/windows/
http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
以下の二つのファイル(PythonスクリプトとNginx設定ファイル)がWindowsのユーザディレクトリの真下の適当な名前のディレクトリに入っているとする。そんな場所に置いているのは、WindowsのユーザディレクトリがDockerにマウントされるようになっていてユーザディレクトリから浅いところだと都合がいいから(c:\Users\ - /c/Users/)。
hello.py
import os
import tornado.web
import tornado.wsgi
class HelloHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello.")
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
}
application = tornado.web.Application([
("/", HelloHandler),
], **settings)
wsgi_app = tornado.wsgi.WSGIAdapter(application)
hello.conf(Nginxの設定ファイル)
server {
listen 80 default;
server_name example.org;
access_log /var/log/nginx/example.log;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Boot2Dockerをインストールして立ち上げる。とりあえずポピュラーなubuntuをサーバ環境として使うことにする。
> docker pull ubuntu:latest
落としたubuntuイメージからコンテナを作って、ubuntu上で最低限のものをインストールする。あと不必要なnginxのファイルを消しておく。
> docker run -it --name ubuntu0 ubuntu bash
apt-get update
apt-get install -y nginx
apt-get install -y python3-pip
rm /etc/nginx/sites-enabled/default
上記が済んだらctrl+dでコンテナ内からexit。このコンテナを新しいイメージとしてコミットする。
> docker commit ubuntu0 py_im
これで私的Pythonサーバ開発の環境が用意できた。このイメージはpipが入っているのでいろんなPython開発の環境を手早く用意できるだろう。ここからはTornadoとGunicornを使う今回の目的に向けて整えていく。
DockerでPythonスクリプトとNginx設定ファイルが置かれたディレクトリへ移動する。
> cd /c/Users/john/hello
そのディレクトリにDockerfileを用意する。Dockerfileとはコンテナ内で実行するコマンドなどを記述したテキストファイル。
FROM py_im
ADD * /usr/
WORKDIR /usr/
RUN pip3 install gunicorn
RUN pip3 install tornado
EXPOSE 80
RUN cp hello.conf /etc/nginx/conf.d/
RUN /etc/init.d/nginx reload
CMD gunicorn hello:wsgi_app
Dockerfileを書いたのでビルドする。
> docker build -t py_im0 .
p0というコンテナ名でpy_im0がオリジナルイメージのコンテナを走らせる。Dockerのポートからコンテナのポートへアクセスを提供してもらうように設定する。
> docker run -d -p 80:80 --name p0 py_im0
コンテナ内部でNginxを走らせる。
> docker exec p0 nginx
Windowsのブラウザでアクセスしてみる(IPはデフォルトで192.168.59.103)。

動作確認終了。Pythonスクリプトを更新したときにコンテナのビルド以降を再実施すれば手軽にテストが実行できる。
あとはプロジェクト固有のDockerへの命令(コンテナではなくDocker自体)をスクリプトとしてまとめるなど。
最後に改めてなぜDockerを使ったかを。
Windows上でUNIXサーバがほしくなった場合、Dockerが出てくる以前の選択肢はVMWareやVirtualBoxで仮想マシンを用意することだった。ただ仮想マシンはその中でおこなった操作が基本的に残り、変更以前の状態を用意するのはイメージを用意したりマシンを立ち上げなおしたりでなにかしら手間がかかった。
Dockerではすでに起動しているLinuxのカーネルを使ってコンテナのOS(仮想マシンでのゲストOS的なもの)が動作するので立ち上げなおしの手間はほとんどないし、OSイメージの用意やチューンのコマンドもテキストファイルにまとめておいて実行できる。うまくまとめればワンタッチで手早く使い捨ての環境が用意できるということだ。
パッケージの依存などを気にしながらテストを行いたい場合、ある程度使っていていろんなパッケージが入り乱れている仮想マシンより、使い捨てを繰り返していて最低限のパッケージしか入っていないコンテナ環境のほうがエラー時のデバッグがしやすい。そんなわけで今回はDockerを選んだ。
参考******
https://docs.docker.com/installation/windows/
http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
スポンサーサイト