SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】Docker-ComposeでNginx+NginxUnit(Flask)+MongoDB構成のWebアプリを構築

少し学んだDocker-Composeで以前個別にDockerコンテナを生成して構築した構成を再現します。

構築イメージ

以前もDockerコンテナで構築したアプリをDocker-Composeで構築しなおします。
イメージは再掲です。

f:id:wantanBlog:20200419210012p:plain

設定ファイルやソースは今回の記事には一部しか載せていないので、詳細は必要であれば以下を参照してください。
ほぼそのまま使いまわしてます。

www.wantanblog.com



コンテナの生成・起動

ディレクトリ構造
/home/ec2-user/docker_work/compose
 ┣docker-compose.yml
 ┣mongo/
 ┃ ┣mongoDfile
 ┃ ┗setup.js
 ┣nginx/
 ┃ ┣default.conf
 ┃ ┗nginxDfile
 ┗unit/
     ┣app/
     ┃ ┣main.py
     ┃ ┗templates/
     ┃    ┗index.html
     ┣ conf.json
     ┗unitDfile

原則は以下の直下でコマンドを実行します。

/home/ec2-user/docker_work/compose
docker-compose.yml

・docker-compose.yml

version: '3.7'
services:
 webserver:
  build:
   context: ./nginx
   dockerfile: nginxDfile
  depends_on:
        - apserver
  ports:
   - "8080:80"
 apserver:
  build:
   context: ./unit
   dockerfile: unitDfile
  depends_on:
        - dbserver
  ports:
   - "8082"
 dbserver:
  build:
   context: ./mongo
   dockerfile: mongoDfile
  ports:
   - "28003:27017"

コンテナの起動は参照順にするため、以下の順序でコンテナが起動されるように「depends_on:」を設定します。

DBサーバ(dbserver)⇒APサーバ(apserver)⇒webサーバ(webserver)

あとはそれぞれのサーバのDockerfileを作成済みなので、それをビルドしています。

コンテナ間の接続部の修正

どのようなアプリを構築するかにもよりますが、必要に応じてコンテナの接合部は確認した方がよいと思います。
私の場合は以下の点を以前の記事から修正しました。

・default.conf(Nginx)

server {
    listen       80;
    server_name  localhost;

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /sample/ {
        proxy_pass   http://compose_apserver_1:8082/;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

proxy_pass」のコンテナ名の部分は今回のNignxUnitコンテナのものに修正する必要があります。
compose_apserver_1」←この部分。


・main.py(NginxUnit)

from flask import Flask, render_template
from pymongo import MongoClient

application = Flask(__name__)

#デフォルトルート
@application.route('/')
def index():
    client = mongo_init()
    sample = client.test.doc.find()
    return render_template('index.html',contents=sample)

def mongo_init():
    host = 'compose_dbserver_1'
    port = 27017
    db = 'test'
    user = 'wantan'
    pwd = 'wantan'
    client = MongoClient(host, port)
    client[db].authenticate(user, pwd)
    return client

こちらはNginxUnitにのせるアプリ本体のソース部分で、MongoDBのホストを修正しています。
compose_dbserver_1」←この部分。

コンテナの起動と確認

コンテナの起動は簡単で、以下のコマンドです。

docker-compose up -d

今回の場合はイメージの生成から行うため実行中は少し待ちます。

起動が完了したら、コンテナの状態を確認しておきます。

docker-compose ps

・出力結果

Name Command State Ports

---------------------------------------------------------------------------------------

compose_apserver_1 /usr/local/bin/docker-entr ... Up 0.0.0.0:32777->8082/tcp
compose_dbserver_1 docker-entrypoint.sh mongo ... Up 0.0.0.0:28003->27017/tcp
compose_webserver_1 nginx -g daemon off; Up 0.0.0.0:8080->80/tcp

state」がすべてUpになっていればコンテナ自体は起動できています。

ブラウザから確認してみます。

f:id:wantanBlog:20200422235613p:plain

これで環境構築は完了してます。すごい!!


なお補足ですが、ネットワークは「compose_default」がデフォルトで作成されるようです。


ーーーーーーーーーーーーーーーーー

実践的にはセキュリティや可用性、永続データの扱いなど、いろいろと考慮しなければいけないことはありますが、数時間かかった環境構築作業が必要なファイルがそろえば1コマンドで実行できるようになりました。

ほんとにすごいなぁ、Dockerfileを元からあるもの使ったとは言え簡単に実行できすぎて記事が想定よりあっさりめになってしまった
今回はここまで。


・ソース類
docker/compose at master · wantanblog/docker · GitHub


※本記事は本書の内容に沿っているわけではありません。