少し学んだDocker-Composeで以前個別にDockerコンテナを生成して構築した構成を再現します。
構築イメージ
以前もDockerコンテナで構築したアプリをDocker-Composeで構築しなおします。
イメージは再掲です。
設定ファイルやソースは今回の記事には一部しか載せていないので、詳細は必要であれば以下を参照してください。
ほぼそのまま使いまわしてます。
コンテナの生成・起動
ディレクトリ構造
/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になっていればコンテナ自体は起動できています。
ブラウザから確認してみます。
これで環境構築は完了してます。すごい!!
なお補足ですが、ネットワークは「compose_default」がデフォルトで作成されるようです。
ーーーーーーーーーーーーーーーーー
実践的にはセキュリティや可用性、永続データの扱いなど、いろいろと考慮しなければいけないことはありますが、数時間かかった環境構築作業が必要なファイルがそろえば1コマンドで実行できるようになりました。
ほんとにすごいなぁ、Dockerfileを元からあるもの使ったとは言え簡単に実行できすぎて記事が想定よりあっさりめになってしまった
今回はここまで。
・ソース類
docker/compose at master · wantanblog/docker · GitHub
※本記事は本書の内容に沿っているわけではありません。