Composeで3層ウェブアーキテクチャを構成するtmtkTech2019.3.15ツイートTopicsはじめに実習まとめこんにちは。データサイエンスチームのtmtkです。Composeの使い方をお伝えします。Composeは複数のDockerコンテナを一つのホストマシンに立ち上げることができるツールです。公式ドキュメントでは用途の例として開発環境の構築やCI、CDへの応用が挙げられています。3層ウェブアプリケーションは、ウェブサーバ、アプリケーションサーバ、データベースサーバの3層から構築されるウェブアプリケーションです。Composeの使い方を体得することを目的にしています。18.04が入っているサーバを用意します。AWSのEC2インスタンスをつかってもいいですし、手元のパソコンで仮想マシンを構築してもいいです。DockerのインストールDockerの公式ドキュメントのとおりにDockerをインストールします。Linuxも実行しておきます。Composeをインストールします。Composeの作業用のディレクトリを作っておきます。dockercompose_techblogデータベースサーバを立てるデータベースサーバとして、MySQLが動くコンテナを構築します。Hubのmysqlのページを参照しながら、MySQLサーバを構築します。ページの説明どおりにMySQLのコンテナを動かしてみます。5.7のコンテナにdatabaseという名前をつけ、ルートユーザのパスワードを「my-secret-pw」にして立ち上げます。mysql:5.7コンテナ内で作業するために、コンテナ内でBashを立ち上げます。/bin/bashコンテナ内でMySQLに接続し、データベースの操作方法を確認します。sec)test_databaseという名前でデータベースを作成し、そこにtest_tableというテーブルを作成し、上のようなデータを入れることができました。動作確認ができたので、コンテナ内のMySQLとBashから抜けます。exitexit立ち上げたDockerのコンテナを終了しておきます。Hubのページに以下のような説明があります。.sql.gzファイルはコンテナ起動時に実行されるということが書いてあります。variable.この情報をつかって、先ほど試したMySQLのコンテナイメージをベースに、自分専用のコンテナイメージを作成します。具体的には、コンテナが立ち上がるとtest_databaseデータベース、test_tableテーブル、それに上と同様のデータが作成されるようにします。データベースサーバ用のディレクトリを作成します。database先ほど試した操作を再現するシェルスクリプトを作成します。init.shとして次のような内容のファイルをつくります。--execute="$COMMAND"このシェルスクリプトがコンテナの起動時に実行されるように、Dockerfileを作成します。Dockerfileとして次の内容のファイルを作ります。/docker-entrypoint-initdb.d/このDockerfileからコンテナイメージをビルドします。rmコマンドで削除します。database先ほどビルドしたコンテナイメージからコンテナを起動します。databaseデータベースコンテナが準備できました。親ディレクトリに戻っておきます。..アプリケーションサーバの構築ここからはアプリケーションサーバを構築していきます。その前に、先ほど起動したデータベースサーバへの接続方法を確認しておきましょう。networkコマンドを使います。ネットワークの一覧を確認します。lsdatabaseコンテナはこの中でbridgeネットワークにあります。IPアドレスを調べます。bridgeこのコマンドの出力を調べると、私の環境ではdatabaseコンテナのIPアドレスは172.17.0.2となっていました。Pythonからこのデータベースに接続する方法を確認します。3からデータベースに接続するために、必要なものをインストールします。3処理系を起動し、データベースに接続するテストを行います。90))データベースサーバへの接続とデータの取得が確認できました。アプリケーションサーバで実行するプログラムを作成します。アプリケーションサーバのコンテナ用の作業ディレクトリを作成し、移動します。app_serverここに、app_server.pyとして以下の内容のファイルを作成します。page.format(body=body)HTTPリクエストがあるとデータベースサーバに接続し、データを取得し、それをテーブルに載せたHTMLを返すFlaskによるウェブアプリケーションです。これを実行するコンテナを定義するDockerfileを作成します。Dockerfileとして以下の内容を保存します。doneアプリケーションサーバのコンテナの準備ができました。親ディレクトリに戻ります。Composeを試すここまででデータベースサーバとアプリケーションサーバが準備できました。Composeを試してみます。docker-compose.ymlとして、以下を保存します。databaseとネットワークの設定をしています。Composeを使って、データベースサーバとアプリケーションサーバの二つのコンテナをビルド・起動します。logsで確認できます。logsアプリケーションサーバにアクセスしてみます。networkコマンドを使います。lsコマンドを実行すると、dockercompose_techblog_defaultというネットワークがあることがわかると思います。次のコマンドの出力をみれば、アプリケーションサーバのIPアドレスがわかります。dockercompose_techblog_default私の環境の場合は172.18.0.3でした。cURLコマンドかブラウザでアプリケーションサーバの動作を確認します。Page</title></head><body><table><tr><th>name</th><th>english</th><th>mathmatics</th></tr><tr><td>Ichiro</td><td>10</td><td>10</td><tr><td>Jiro</td><td>20</td><td>40</td><tr><td>Saburo</td><td>30</td><td>90</td></table></body></html>アプリケーションサーバが正常に動作していることがわかります。ウェブサーバを構築する3層ウェブアプリケーションを実現するため、ウェブサーバを構築します。作業用ディレクトリをつくり、移動します。Hubにあるnginxのイメージを使うことにします。nginxの設定ファイルは/etc/nginx/conf.d/default.confにあるので、ホスト側に設定ファイルをコピーしておきます。default.conf.bakコピーした設定ファイルを確認すると、以下のような内容になっていることがわかります。#}}nginxをリバースプロキシとして動作させる設定ファイルを作ります。このファイルをコピーします。することで、アプリケーションサーバへのアクセスをウェブサーバが代理することができます。最後に、Dockerfileを作成します。以下の内容でDockerfileを作成します。/etc/nginx/conf.d/default.confこれでウェブサーバの準備ができました。親ディレクトリに戻ります。Composeで構築するさきほど作成したdocker-compose.ymlを編集し、ウェブサーバを追加することで、3層ウェブアプリケーションを実現します。docker-compose.ymlにweb_serverの項目を追加し、以下のようにします。defaultホストへのポート80番のアクセスをweb_serverコンテナに転送する設定にしています。コンテナたちをビルド・起動します。-dcURLやブラウザからウェブサーバにアクセスし、動作確認をします。http://localhost無事に動作が確認できました。logsでログを確認すると、ウェブサーバへのアクセスがnginxのアクセスログとして取得できていることが確認できます。logsコマンドを使います。以下はweb_serverのログを見る例です。Composeから立ち上げたコンテナを終了します。down念のため、起動したまま残っているコンテナがないか確認します。killで終了させることができます。*some_container_name*Dockerを使っているとコンテナイメージがディスクを圧迫することがあります。pruneを使うと、終了したが削除されていないコンテナや、使われてないDockerイメージを削除できるので、必要に応じて使うといいでしょう。Composeで3層ウェブアプリケーションを作成する手順を説明しました。Dockerのコマンドはたくさんあってややこしいですが、この記事で実際的な使い方とともに説明したことが少しでも役に立てば幸いです。EC2#Docker#Pythontmtkデータ分析と機械学習とソフトウェア開発をしています。アルゴリズムとデータ構造が好きです。