前回からの続き
www.tohuandkonsome.site
引き続き、公式チュートリアルを進めていきたいと思います。
dockerでシンプルなWebアプリケーションを実行する
早速、Webアプリケーションを実行するdockerのコンテナを起動してみようと思います。
公式のコマンドに従い、以下を実行します。
dockerでWebアプリケーションを実行する
docker run -d -p 80:5000 training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
66d7c357bfa77920af4bd5c7fbc3082c70885afcdd6a2d01ed1122cb8028782e
実行した後にhttp://localhost
にアクセスしてみると、「Hello World」がブラウザの表示されることが確認できます。
localhost:8000
さて、何が起こったのでしょう。
起きたこと
まず、training/webapp
です。
ログをみると、そんなもんローカルにないから、リモートからとってくるぜ(pull)みたいな感じのことが書かれています。
どっからとってくるかというのは、「docker hub」というdockerのイメージ?を扱っているサイトです。
試しにdocker hubのアカウントを作って、training/webapp
を検索してみました。
https://hub.docker.com/r/training/webapp/
それっぽいやつが見つかりましたね。こちらをとってきているみたいです。
これをとってきたあとに、python app.py
を実行してます。
python app.py
ですが、Pythonの軽量Webフレームワークである「Flask」を起動しているコマンドです。
※「Flask」そのものは、以前使ったことがあるんだよ!
www.tohuandkonsome.site
このFlaskがポート5000番代で待ち受けていて、そこにリクエストを投げると、HelloWorldのレスポンスを返している感じですかね!
localhost:8000にアクセスしたときの流れ
この状態を、dockerを使わずにVagrantで起動している仮想マシン上で実現しようとすると
- pythonのインストール
- Flaskのインストール
- Flaskのプロジェクト作成
- Hello Wolrdをレスポンスで返すよう修正
- Webアプリケーションの起動
あたりの作業が必要になります。
せっかくなんでやってみますかね!
横道にそれてFlaskを使う環境を用意してみる
横道にそれる豚
何はともあれ、Pythonが必要になります。
Vagrantで起動している仮想マシン(Amazon Linux)には既にPythonの2系が入っていました。
pythonのバージョンの確認
$ python -V
Python 2.7.12
が、せっかくなんでpyhon3系を導入しようと思います。
そして、python3系ど導入するにあたっては、pythonのバージョン管理を行うことができるpyenv
を使ってpython3を導入したいと思います。
(どんどん横道に逸れていくね!)
インストールにあたって参考にさせていただいた記事。
Pyenvの使い方 - Qiita
Amazon LinuxでPython3系を使う - Qiita
なんだかよくわかりませんが、必要なライブラリは突っ込んでおきます!
pyenvに必要なライブラリをインストールする
$ sudo yum install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel
次にpyenvを導入します。
pyenvをインストールする
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
WARNING: seems you still have not added 'pyenv' to the load path.
export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
.bash_profile
にパスを通してね!って言われるので、言う通りにします。
.bash_profileに追記する
export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PATH
そしたら変更を反映させます。
環境変数を反映させる
$ source ~/.bash_profile
ここまできたら、pyenvを実行してみます。
pyenvの動作確認
$ pyenv -v
pyenv 1.2.2
ヒーハー!
大丈夫そうです。
続いて、Python3系をインストールします。
pyenv install <version>
で指定したVersionをインストールすることができます。
これはちょっと時間がかかりました。
Python3.6.1をインストールする
$ pyenv install 3.6.1
最後に、使用するバージョンを指定します。
Python3.6.1を使用するようにする
$ pyenv global 3.6.1
確認の意味を込めて、pythonのバージョンを確認します。
確認
$ python -V
Python 2.7.12
ありがとう!
ってかわってない!みたいなことがありました。
ぐぐってみますと、pyenv rehash
なるコマンドを叩けばいいとのこと。
なんだかわからないけれども
$ pyenv rehash
$ python -V
Python 3.6.1
無事、変更されました。
次に、Flaskを準備してみます。
こちらも公式チュートリアルに則って、先にコードから書いちゃいます。
Welcome | Flask (A Python Microframework)
作業ディレクトリとapp.pyを作成
$ mkdir flask
$ cd flask
$ vim app.py
唯一のPythonファイルapp.py
は公式そのまんまです。
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run(host='0.0.0.0')
中身は、/
にリクエストすると、Hello World
をレスポンスとして返す、ってことがなんとなくわかるかと思います。
次に、Flaskをインストールします。
インストールにはpythonのパッケージ管理を行うpip
を使います。Python3系なら?デフォルトで入ってるみたいです。
Flaskをインストール
$ pip install Flask
さくっとインストールしたら、起動してみましょう。
Flaskを起動する
$ python app.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
こんな感じで、Webアプリケーションが立ち上がることが確認できるかと思います。
さっそくアクセスしてみたいのですが、Vagrantで起動している仮想マシンのポート5000番を開ける必要があります。
Vagrantfileに一行追加する
config.vm.network "forwarded_port", guest: 5000, host: 5000
Vagrantの再起動
$ vagrant reload
再度、vagrant ssh
なりして仮想マシンに接続後、Flaskを立ち上げて、
「http://localhost:5000」にアクセスすると 、以下が表示されます!
http://localhost:5000にアクセス
道に戻り、dockerのイメージをつくってみる
さて、dockerを調べてたのになぁみたいな状態になっちゃったのでもとに戻ります。
一から、Flaskを使用する環境を使うと結構面倒なのですが、dockerの用意されているイメージを使うと、一瞬で環境をつくることができました。
また、仮想マシンに直接pythonをインストールする際、pythonのバージョン管理ができるようにpyenvを導入したりもしました。
これは、ひとつのサーバー上にバージョンが異なるアPythonプリケーションが動くようにという意図があります。
(とはいえひとつのサーバーに異なるバージョンのpythonアプリケーションが動いているっていうのはあんまり考えにくいかもしれませんが)
dockerであれば、pyenvを利用しなくともdockerで作成したコンテナ上に直接pythonをインストールしてもまったく問題なさそうです。
異なるバージョンのであれば、コンテナそのものを分けるってイメージですかね。
とはいえ、既存のtraining/webapp
について、Hello Wolrd
ではなくOhanky!
を返すようにするにはどうしたらいいのかとか、さっぱりわかりません。
なので、既存イメージを利用するだけではなく、イメージを作成する、ということをしていこうと思います。
www.tohuandkonsome.site