nginx+web.py+mysqlを動かす
3つのアプリを合体して動かしましょう。 うまく動いたら、Pythonアプリを改造するなり冗長構成を考えるなりしてみてください。 なお、Pythonアプリのソースコードの解説を書いておきました。 改造する人は参考にしてください。 コンテナ群のカスタマイズ方法については、 下の方に少しだけ書いておきました
dockerコンテナの作成
04_docker/04-04_debian-nginx-web.py-mysql/docker ディレクトリに移動し、 build.sh スクリプトを実行してください
cd 04_docker/04-04_debian-nginx-web.py-mysql/docker
sh build.sh
build.sh のなかでは debian-web-2tier-web.py というコンテナイメージを作成しています (名前で察せるとおり debian ベースです)。
コンテナ内でのサーバプロセスは systemd経由ではなく、
04_docker/04-04_debian-nginx-web.py-mysql/docker/files/entrypoint.sh
で直接起動していきます。 起動するソフトウエアを追加・削除する場合は、このファイルを変更し、 コンテナを再生成、 (以下で説明するスクリプト群で)コンテナ群を再起動してください
コンテナ群の起動
となりのディレクトリ(../scripts/)つまり 04_docker/04-04_debian-nginx-web.py-mysql/scripts/ ディレクトリに移動し、 順番に実行していきます
cd 04_docker/04-04_debian-nginx-web.py-mysql/scripts/
このディレクトリには、たくさんのスクリプトが並んでいます
21_start.sh
31_mysql-init.sh
39_mysql-dump.sh
71_enter-web.sh
72_enter-mysql.sh
81_stop.sh
99_status.sh
scripts/
まずは
sh 21_start.sh
を実行してコンテナ群を起動していきます。
このスクリプトの実体は、このディレクトリ直下の scripts/ 以下のファイル群です。 21_start.sh は scripts/sbin/start.sh を実行する wrapper です。 scripts/sbin/start.sh は、
- 仮想ネットワーク(ネットワークアドレスは 172.30.0.0/16)を作成
- 2つのコンテナ(上で作成した debian-web-2tier-web.py と mysql)を起動
しています。起動したコンテナ2つは 172.30.0.0/16 のネットワークに接続されます。
docker ps で2つのコンテナが動いていることを確認してください。
そしてip addr
コマンドを実行すると 172.30.0.0/16 のネットワークが作成されていることが分かります
... lo eth0 docker0 と続きますが、省略 ...
38: br-f55060f8aef5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:90:22:45:72 brd ff:ff:ff:ff:ff:ff
inet 172.30.0.1/16 brd 172.30.255.255 scope global br-f55060f8aef5
... 省略 ...
mysql にデータを入れる
mysql コンテナには何もデータが入っていないので、データを入れます
sh 31_mysql-init.sh
を実行すれば mysql のデータベース test にデータを入れます。 確かに入ったか?を確認するには
sh 39_mysql-dump.sh
を実行してください。 いつぞやの演習で使っていた研究室売店のデータ:-)が表示されるはずです
EC2のフィルタを開ける
インターネット側からHTTPでアクセスするためにはフィルタを開ける必要があります
- デフォルトではSSH( 22/tcp )だけが許されています
- 世界中から(ソースIPアドレス = 0.0.0.0/0) 80/tcp を許可してください
このフィルタを開ける設定を、 AWSではセキュリティグループの設定と呼びます。 先に進む前に セキュリティグループを設定してください。
動作確認
mysql にデータも入れたので接続してみましょう
EC2のパブリックIP(の 80/tcp)に対し、手元のPCのブラウザでアクセスしてみましょう
http://パブリックIP/
へアクセスすると
Welcome to our server exercise program !
と表示されたでしょうか? (注: この画面を返しているのは www.py です。 nginx -> www.py 部分はOKと確認できましたが、 この段階では mysql と連携できているかは不明)
http://パブリックIP/shop.html
にアクセスすると、 いつぞやの演習でつかった検索画面がでるはずです。 検索してみましょう。なにか答えが返りましたか? (注: この画面は mysql にクエリをした結果を www.py が返しています。 この検索が動けば mysql と連携できています)
現在の状態を確認する
sh 99_status.sh
ちなみに 71_enter-web.sh と 72_enter-mysql.sh は、 それぞれ実行中の debian-web-2tier-web.py コンテナと mysql コンテナにログインするためのスクリプトです
停止する
sh 81_stop.sh
構成図
この構成図のように動いていますが、 コンテナその1 debian-web-2tier-web.py では nginx と www.py (Python アプリ)の2つを動かしています。 コンテナその2 は mysql 公式のイメージを使って mysql を動かしています。 最初はEC2に相当するコンテナを一つだけ作り、 全サーバを一つのコンテナに入れようかとも思ったのですが、 意外とmysqlの設定が面倒なのと、 インストール作業にはストレージがけっこう必要で8GBではダメだったから:-)、 お手軽にmysql公式コンテナを使いました。 結果、コンテナが二つという半端な構成になりましたとさ
カスタマイズするには?
- nginx のカスタマイズはコンテナ内の/etc/nginx以下のファイルを編集する必要があります
- nginxの設定方法はこちらを参照
- まず
docker/files/etc/nginx/
以下に設定を一式用意してください - Dockerfileに
copy files/etc/nginx /etc/nginx
を追加し、docker/files/etc/nginx/
以下をコンテナ内へコピーします
- www.py はPythonアプリのソースコードの解説を参照
- mysql は公式イメージそのものです。 docker run のオプションで変更できる変数(環境変数)で少しだけカスタマイズできます。 でも、それらは認証情報やデータを書くディレクトリの指定などサーバの基本設定です。 データベースの中身は直接 SQL を叩いて、ぐりぐりいじってください
演習問題
- docker社の設計思想では「1アプリ1コンテナにするべき」とされています。
つまり、この構成図なら、コンテナが3つ(nginx, www.py, mysql)必要で、
各コンテナでは、それぞれ一つのソフトウエアだけを動かすことが期待されています。
以下の仕様に変更して3つのコンテナで動かしてください
- mysql と nginx は docker hub にある公式イメージを利用
- www.py コンテナは前節のコンテナを利用