• 日本語
    • English (英語)
Avinton JapanAvinton JapanAvinton JapanAvinton Japan
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

Docker Compose(Nginx + Flask + MySQL)演習

  • ルーティング
  • データベースの命名規則
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • 三目並べ – 3.勝敗がつくようにしよう
  • クリーンコード(Clean Code)
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • インフラストラクチャー(サーバー、コンポーネント、RAID)
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • YOLOv8を用いた物体検出
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • 軽量版Kubernetesディストリビューション – k0s クラスターの構築
  • ファイル操作コマンド
  • グループとユーザー
  • 困った時に使うコマンド
  • 一般グループのユーザーとグループ
  • プライバシーポリシー
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • ファイル検索コマンド
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • データ分析基礎 – Part1
  • 三目並べ – 0.導入
  • テキスト処理
  • データベースへのデータロード
  • 機械学習概要1
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • ファイル管理
  • SSHを使用してホストOSからゲストOSに接続する
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • 機械学習概要2
  • データ分析基礎 – Part 2
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • フロントエンドのWeb開発について
  • ダイナミックルーティング
  • 三目並べ – 1.ゲーム盤を作ろう
  • 【Python入門】Python Numpy チュートリアル
  • Amazon EC2 インスタンスの初期設定をしよう
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • Apache NiFi Exercise
  • Apache NiFi データパイプライン基礎
  • Apache NiFiの環境設定
  • Apache Spark 基礎
  • Apache SparkとApache Zeppelinの概要と環境構築
  • Apache Superset maptoolの使い方
  • Apache Superset 基礎
  • Apache Superset 概要と環境構築
  • Apache Zeppelin 基本機能
  • APIのデモンストレーション
  • Avinton Academy コンテンツガイド
  • AWS CLIをインストールしてコマンド操作しよう
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • CCNA
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • CISCO 1800ルータセットアップ
  • CSV import & export – Node.js, mySQL – 1
  • CSV import & export – Node.js, mySQL – 2
  • Docker Compose(Nginx + Flask + MySQL)演習
  • Docker Engineのubuntu上へのinstall
  • Docker 概要とセットアップ
  • Docker, Kubernetesの学び方について
  • Dockerコンテナイメージの最適化/ベストプラクティス
  • DockerとApacheを使ってWebサーバーを構築しよう
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • ESP32-CAMのサンプルアプリケーションを実行する
  • 01 – Sparkfun Inventor’s Kit の準備
  • 02 – Sparkfun Inventor’s KitでLチカ
  • 03 ポテンショメータでLEDの点滅間隔をアナログ入力する
  • 04 フォトレジスタで明るさに反応するシステムをつくる
  • 05 LCDに文字列を表示する
  • 06 – BME280とLCDを組み合わせて温度計をつくる
  • ESP32とArduino IDE/PlatfromIOでHello Worldアプリケーションの実行
  • ESP32と超音波センサー HC-SR04 で物体の距離を計測する
  • ESXi – Switchの追加とVLAN
  • ESXi – VyOS
  • ESXi – 小規模ネットワーク 構築
  • Gitとは
  • VS CodeでGitHub Copilotを設定する
  • VSCode リモート開発環境
  • GNS3のセットアップ
  • Kubernetesクラスター上へのOpenVINOモデルサーバーを使用したサンプルアプリケーションのデプロイ
  • Linuxとは
  • NAT
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – Socket.IO編
  • NVIDIA Cumulus VX + GNS3でBGPネットワークのシミュレーション
  • OpenCVのテストプログラム
  • PacketTracerのセットアップ
  • Pandasによる構造化データ分析
  • PCからルータ、スイッチへのSSH接続設定
  • PostGIS exercise
  • PostgreSQL – Python – Apache – Bootstrap
  • MySQLとMySQL Workbench のセットアップ
  • PostgreSQL Setup
  • PostgreSQL – インデックスを利用したパフォーマンス改善方法
  • PostgreSQL – パーティショニングを利用したパフォーマンス改善方法
  • PostgreSQLによるデータ分析
  • postgreSQLへのshp fileのimport
  • Python2.7とOpenCVのインストール
  • Python3.8 と OpenCV のインストール (Ubuntu20.04LTS)
  • Pythonでデータベースを操作する
  • Pythonで画像を分類するプログラムを作成する
  • Pythonによるマルチスレッドプログラミング実践
  • Raspberry Pi 4B のセットアップ
  • Raspberry PiとBME280を使用して温度と湿度、気圧を読み取る
  • REDIS
  • Redux基礎 – 主要な概念と用語
  • Ruby on Rails を MySQLでセットアップ
  • Ruby on Railsによる簡単なウェブアプリケーション
  • SampleアプリケーションのKubernetes上へのデプロイ
  • Scala 基礎
  • scikit-learnとは
  • Spark SQL エクササイズ
  • SparkMLによるKaggle Titanic生存者予測
  • SparkMLによる住宅価格予測
  • SQL 便利な関数
  • Ubuntuの基本設定
  • uhubctlでUSBデバイスのオンオフをコントロール
  • Terraform入門 2 – Terraformのstate管理
  • Terraform入門 1 – TerraformでAWS上にEC2インスタンスを作成する
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • viエディタ
  • VLAN
  • VMware ESXi サーバー構築
  • Webアプリ開発に欠かせないGoogle Chrome DevToolsの基本
  • Windows Server 2012 R2 Hyper-V
  • YOLOv5を用いた物体検出
Home Avintonアカデミー Docker Compose(Nginx + Flask + MySQL)演習
Docker Compose

Composeとは、複数のコンテナを定義し実行する Dockerアプリケーションのためのツールです。ComposeはYAMLファイルを使い、アプリケーションのサービスを設定します。

本演習では、Composeを使って、3つのサービスから構成されるウェブアプリケーションを定義するcompose.yamlファイルを作成し、実行します。対象レベルとしては、Docker Composeについて少し学んだことのある人向けです。本演習を通してComposeの理解を深めていただければと思います。

本記事では、Docker compose v2の使用を想定して記述しています。Docker compose v2では、Docker CLIのコマンドとしてdocker composeを使用できます。Docker-compose v1をお使いの方は、docker-composeコマンドを使用してください。互換性があるので問題なく実行できます。※Announcing Compose V2 General Availability

準備

  • Dockerのセットアップ(Docker 概要とセットアップ)
  • レポジトリ(https://github.com/docker/awesome-compose)のクローン
    nginx-flask-mysqlディレクトリを使用します。
  • Buildkitの有効化
    今回使用するレポジトリには、heredocs構文を使用したDockerfileが含まれます。そのため、Buildkitを有効にする必要があります。最近のバージョンではデフォルトで有効になっています。

    • Build images with BuildKit
    • Introduction to heredocs in Dockerfiles
  • 既にディレクトリ内にcompose.yamlファイルが存在するので、削除するか、名前変更をしてください。

アプリケーションの概要

今回使用するウェブアプリケーション(nginx-flask-mysql)の概要を簡単に紹介します。

pythonを使用して(backend/hello.py)、MySQLに接続し、テーブルを作成します。そのテーブルに保存した内容をFlaskウェブフレームワークを使用してポート8000で公開、そして、リバースプロキシサーバーとしてnginxを使用して、ポート80番で公開します。

Docker Compose(Nginx + Flask + MySQL)演習

本演習では、Composeファイルに以下3つのサービスを定義します。

  • db: MySQLデータベース
  • backend:pythonスクリプト
  • proxy: nginxリバースプロキシサーバー

nginx-flask-mysqlディレクトリの構成としては次のようになっています。

1
2
3
4
5
6
7
8
9
10
11
├── backend
│   ├── Dockerfile
│   ├── hello.py
│   └── requirements.txt
├── compose.yaml
├── db
│   └── password.txt
├── proxy
│   ├── conf
│   └── Dockerfile
└── README.md

Composeファイルの作成

以下に示すcompose.yamlを基に、下記要件を満たすようにComposeファイルを作成してください。進め方を参考にしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
  db:
    image:
 
  backend:
    build:
 
  proxy:
    build:
 
volumes:
  db-data:
 
secrets:
  db-password:
 
networks:
  backnet:
  frontnet:

要件

Composeファイル内に定義すべきアプリケーションの要件を以下に示します。

  • dbサービスのDockerイメージはmysql:8を使用
  • dbサービスにおけるMySQLのrootユーザーのパスワードは db/password.txtファイルを使用
  • dbサービスにおけるMySQLのAuthentication Pluginは、mysql_native_passwordを使用
    commandを以下のよう定義してください。

1
command: '--default-authentication-plugin=mysql_native_password'

  • dbサービスに保存されたテーブルデータをdockerボリュームを使用して永続化
  • proxyサービスのポート番号は、80番をホスト側に公開(backendサービスのポートはホスト側に公開しない)
    ※ backendサービスのポートは、開発段階では確認用として、ポート8000番をホスト側に公開してください。ただし、最終的には、proxyサービスがホスト側に公開するので、backendサービスのポートをホスト側に公開する必要はありません。
  • 2つのカスタムネットワーク(backnet, frontnet)を使用
    • db,backend間: backnet
    • backend,proxy間: frontnet
      ※Composeのネットワークについてはこちら(Networking in Compose)を参照ください。
  • コンテナが停止すると常に再起動するように設定
  • サービスの起動順序は、db,backend,proxyの順とする。
    また、dbサービスにおいて、以下のようなhealthcheckを定義し、service_healthyをbackendサービス起動の条件としてください。

1
2
3
4
5
healthcheck:
  test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 --password="$$(cat /run/secrets/db-password)" --silent']
  interval: 3s
  retries: 5
  start_period: 30s

進め方について

上記要件を踏まえて、以下ステップを参考にComposeファイルを作成してみてください。

1. backendサービス単体を定義し、ホストにポート番号8000で公開
localhost:8000にアクセスすると、エラーが表示されるはずです。

2. dbサービス単体を定義し、エラーなく起動することを確認
db
サービスの設定に関しては、backend/hello.pyを参考にして設定すると良いでしょう。

3. dbサービスとbackendサービスを起動
localhost:8000
にアクセスすると、以下が表示されるばずです。

1
2
3
4
Hello Blog post #1
Hello Blog post #2
Hello Blog post #3
Hello Blog post #4

4. proxyサービスの追加
localhost:80にアクセスすると、上記と同じものが表示されるはずです。

5. 残りの要件を満たすように設定

Composeファイルの書き方や、docker composeコマンドについては以下公式ドキュメントのページを参考にしてください。

  • Compose specification
  • Overview of docker compose CLI

 

トラブルシューティング

ログの確認

サービスが正しく起動しない場合は、ログを確認して原因を調査しましょう。以下コマンドが使用できます。

  • docker compose logs <SERVICE>
  • docker logs <CONTAINER>

 

Dockerオブジェクトの情報取得

docker inspect <NAME>で、Dockerオブジェクト(コンテナ、ネットワーク、ボリュームなど)の情報を見ることができます。例えば、volumeのマウント先や、環境変数の設定などが正しく設定されているのかを確認できます。

ボリュームについて

ボリュームは、コンテナ内の任意のディレクトリやファイルにマウントすることで、コンテナ内のデータを保存し永続化します。このボリュームの性質上、仮に、サービスにエラーが発生した場合も、そのエラー時の間違ったデータがボリュームに保存されます。この状態で、新たにコンテナを作成した場合、この間違ったデータが保存されるボリュームがコンテナ内にマウントされてしまいます。

この状態を避けるために、基本的に開発中は、コンテナ起動前にボリュームを削除することをおすすめします。以下コマンドを使用できます。

  • docker compose down -v
    -vオプションによりdocker compose up時に作成されたコンテナ、ネットワークの削除に加えて、ボリュームの削除が可能です。
  • docker volume rm <VOLUME>

アプリケーションの実行

Docker composeコマンドを使用して、アプリケーションを実行してください。
また、以下コマンドにより各サービスの稼動を確認してください。

1
2
3
4
5
6
7
$ docker compose ps
 
           Name                         Command                State                        Ports                  
-------------------------------------------------------------------------------------------------------------------
nginx-flask-mysql_backend_1   flask run                     Up             0.0.0.0:8000->8000/tcp,:::8000->8000/tcp
nginx-flask-mysql_db_1        docker-entrypoint.sh mysqld   Up (healthy)   3306/tcp, 33060/tcp                    
nginx-flask-mysql_proxy_1     nginx -g daemon off;          Up             0.0.0.0:80->80/tcp,:::80->80/tcp    

そして、ブラウザで http://localhost:80/ を開き(または、curl localhost:80)以下のように表示されるかを確認してください。

1
2
3
4
Hello Blog post #1
Hello Blog post #2
Hello Blog post #3
Hello Blog post #4

チャレンジ問題

上記演習において、Flaskのサーバー機能を使用していました。Flaskのサーバー機能は開発用であり、本番環境向けではないため、WSGIサーバーを使用するのが一般的です。backendサービスのログにおいても、以下のような警告が表示されているはずです。

  • WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

そこで、Python WSGIサーバーであるGunicornライブラリーを使用して、この警告を出ないようにしてください。

まとめ

本演習では、Docker composeを使い、ウェブアプリケーション(nginx-flask-mysql)を定義するcompose.yamlファイルを作成し、実行しました。演習を通して、compose.yamlファイルの書き方、composeコマンドの使い方を学ぶことが出来たと思います。

今回使用したawesome-composeレポジトリはDockerの公式ドキュメントで紹介されているレポジトリです。多くのDocker composeの例があるので、是非学習に役立ててください。

あなたも、Avintonでこのような最先端技術を習得し活用してみませんか?

社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?

採用情報

採用情報

採用情報

Categories

  • 相互学習
  • 採用
  • 社員インタビュー
  • 学習&資格取得
  • 技術解説
  • イベント告知
  • 学内説明会&講義
  • 産学連携
  • 就職活動
  • イベントレポート
  • その他
  • 技術ブログ&インタビュー
  • mainpage
  • New Graduates Interviews
  • 中途エンジニア
  • カテゴリーなし
  • ニュースリリース&イベント

Avinton SDGs

SDGsへの貢献

Search

タグ

AIエンジニア AI導入 Apatch AvintonAcademy CKA DevOps KiX Kubernetes Notion PM&PMO PyTorch SDGs Innnovation Hub UI YOLOv5 アカウントマネージャー インタビュー インフラエンジニア エッジAIカメラ セキュリティエンジニア ソフトスキル ツール開発 データサイエンティスト ネットワークエンジニア フルスタックエンジニア フロントエンド ベテランエンジニア ボランティア マイクロサービス モーフィング ローカルイベント 中瀬幸子、サーバークラスター 中途採用 人材育成 協働パートナー 国際自動制御連盟 地域創生 基本情報技術者 強化学習 技術 新卒、キャリア 新卒採用 田中研之輔 社会貢献 経団連 顔認証
© 2023 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan