豆腐とコンソメ

豆腐とコンソメ

もろもろのプログラム勉強記録

Dockerをさわってみる(2):シンプルなWebアプリケーションを実行する

前回からの続き

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」がブラウザの表示されることが確認できます。

f:id:konoemario:20180322123752p:plain
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のレスポンスを返している感じですかね!

f:id:konoemario:20180322143631p:plain
localhost:8000にアクセスしたときの流れ

この状態を、dockerを使わずにVagrantで起動している仮想マシン上で実現しようとすると

  • pythonのインストール
  • Flaskのインストール
  • Flaskのプロジェクト作成
  • Hello Wolrdをレスポンスで返すよう修正
  • Webアプリケーションの起動

あたりの作業が必要になります。

せっかくなんでやってみますかね!


横道にそれてFlaskを使う環境を用意してみる

f:id:konoemario:20180322144751p:plain
横道にそれる豚

何はともあれ、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.

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

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」にアクセスすると 、以下が表示されます!

f:id:konoemario:20180322142035p:plain
http://localhost:5000にアクセス


道に戻り、dockerのイメージをつくってみる

さて、dockerを調べてたのになぁみたいな状態になっちゃったのでもとに戻ります。

一から、Flaskを使用する環境を使うと結構面倒なのですが、dockerの用意されているイメージを使うと、一瞬で環境をつくることができました。

また、仮想マシンに直接pythonをインストールする際、pythonのバージョン管理ができるようにpyenvを導入したりもしました。
これは、ひとつのサーバー上にバージョンが異なるアPythonプリケーションが動くようにという意図があります。
(とはいえひとつのサーバーに異なるバージョンのpythonアプリケーションが動いているっていうのはあんまり考えにくいかもしれませんが)

dockerであれば、pyenvを利用しなくともdockerで作成したコンテナ上に直接pythonをインストールしてもまったく問題なさそうです。
異なるバージョンのであれば、コンテナそのものを分けるってイメージですかね。

とはいえ、既存のtraining/webappについて、Hello WolrdではなくOhanky!を返すようにするにはどうしたらいいのかとか、さっぱりわかりません。

なので、既存イメージを利用するだけではなく、イメージを作成する、ということをしていこうと思います。

www.tohuandkonsome.site