• 日本語
    • 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)演習

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

タグ

5G AI AIエンジニア Apache AvintonAcacemy AvintonAcademy on Campus Avinton データプラットフォーム DQN James Cauchi Kunernetes LPIC-2 LTE MVI試験 PostgreSQL SDGs Society 5.0 SSD TensorFlow インタビュー インターン インターンシップ エリクソン クラウトネイティブ サーバークラスター データ データサイエンス データサイエンティスト データベース ビックデータ ファンダフルリレーマラソン ボランティア モブワーク 中瀬幸子 企業説明会 大学&専門学校 大学&専門学校 学習 就職活動 強化学習、機械学習 教育 環境構築 田中 研之輔 社員紹介 第一級陸上特殊無線技士 講義
© 2023 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • プロジェクトコーディネーター職紹介
    • 求人一覧
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan