Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!

1,477 views

Published on

Web App for Containers は、アプリスタックのホストに Docker コンテナーを使用するため皆さんが今Linux上で利用しているOSSベースのアプリもアプリスタックごとDockerコンテナ化することでそのまま Web App for Containersで利用することができます。本ウェビナーでは簡単なMySQL + PHPアプリ(Wordpress)を題材に、アプリをコンテナ化し Web App for Containersにデプロイするまでの一連の流れを解説し、CIツールを使った継続的なデプロイ方法についてご紹介します。今回、AzureのフルマネージドMySQLサービスであるAzure DB for MySQLを利用して完全マネージドな環境でのアプリ実行を実現します。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!

  1. 1. Web App for Containers + MySQLで コンテナ対応したPHPアプリを作ろう! Yoichi Kawasaki Azure Technology Solution Professional Asia Intelligent Cloud Global Black Belt Microsoft Corporation Slides for Azure Webinar: Azure PaaS App + DevOps
  2. 2. アジェンダ • 本セミナーの目的 • Web App for ContainersとApp Service on Linux • Azure Database for MySQL/PostgreSQL • アプリのコンテナ化+フルマネージド化対応 • 継続的デリバリー(CD)
  3. 3. 本日とりあげるPHPアプリ みんな大好きWordpress、最も有名なLAMPスタックアプリの1つ https://wordpress.org/
  4. 4. ふつうのLAMPアプリの構成 アプリ + Web/Appサーバ アプリ + Web/Appサーバ アプリ + Web/Appサーバ アプリ + Web/Appサーバ Balancer Web/App Servers Database Servers
  5. 5. 本番運用、色々と考えなければいけない • 災害対策(DR) • 冗長化対策 • 高負荷対策 • パッチあてなどUpdate とランタイムの更新 • CI/CD
  6. 6. Web App for Containers 2017年9月正式リリース MySQL 5.6/5.7 (CommunityVersion) PostgreSQL 9.5/9.6 (Community Version) Azure Database for MySQL Azure Database for PostgreSQL 現在Public Preview中 近々GA予定
  7. 7. 本セミナーの目的 アプリをコンテナ化しフルマネージド化するための一連の流れを ご理解いただくこと Container Web App for Containers VM PHP App + Apache2 VM PHP App + Apache2
  8. 8. Container Web App for Containers VM PHP App + Apache2 VM PHP App + Apache2 Container PHP App + Apache2 VM VM ① ② ③ アプリのDockerコンテナ化 Azure PaaSでフルマネージド化
  9. 9. Web App for Containers と App Service on Linux
  10. 10. コンテナを使う理由? • アプリケーションのポータビリティ • 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを 移動できる • 起動時間の短縮 • 仮想マシンよりもオーバーヘッドが少なく起動が高速 • 高密度なリソース利用が可能 • 構成が仮想化よりも単純であるため高密度なリソース利用が可能
  11. 11. App Serviceを使う理由? • フルマネージドなアプリ実行環境 • これまではWindows + IISのマネージド環境 • パッチあてなどUpdate とランタイムの更新は Azureが行う • 高速なプロビジョニング • 数秒でアプリ実行環境が完成 • 柔軟なスケーリング • スケールアップ・スケールアウトも数クリック、オートスケールも可能 • 簡単なデプロイメント • 既存のコードレポジトリ(Git/Github)やCIツール・サービス(Jenkins, VSTS, TravisCI/CircleCIなど) と連携した CI/CD が容易に実現可能
  12. 12. お客様からの強いリクエスト https://feedback.azure.com/forums/169385-web-apps/suggestions/8362119-support-linux-for-paas
  13. 13. Web App for Containers App Service on Linux • フルマネージドサービス、Platform-as-a-Service (PaaS) • 柔軟なスケールアップ・ダウン + オートスケール • お客様からの強い要望により実現 • Linux VMで動いているコンテナベースのアプリをターゲット • オンプレからのLift and Shiftがとても容易 2017年9月正式リリース
  14. 14. Azure App Services on Linux • Web App with built-in images • Node.js, PHP, .NET Core, Rubyなどランタイムス タックを選択してアプリケーションをデプロイ • Windows Web App と同じ方法で利用可能 https://github.com/azure-app-service
  15. 15. Web App for Containers • Bring Your Own Container • アプリケーション入りの皆さんのカスタムイメージを デプロイして実行する イメージのソース  Azure Container Registry  Docker Hub  プライベートレジストリ
  16. 16. Azure Database for MySQL/PostgreSQL
  17. 17. Azure Database for PostgreSQL Azure Database for MySQL • フルマネージドサービス, PaaS • 可用性担保のためのレプリカ、ストレージ費用は追加不要 • インスタンス チューニングではなく 必要なスループット プランを必要なときに選択 • ダウンタイム無しでスケールアップ、スケールダウンも自在 • 自動バックアップ、 ポイントインタイムリカバリ(PITR)可能 ( 35日間) • 常時暗号化でバックアップも運用 DB も保護 • 既存のドライバ、ライブラリ、ツールと完全互換 使い慣れたツール、アプリケーションでからすぐに利用可能 (マイクロソフト製のツールやドライバなどは不要) MySQL PostgreSQL New! Public Preview MySQL 5.6/5.7 (Community Version) PostgreSQL 9.5/9.6 (Community Version)
  18. 18. AZURE DATABASE FOR MYSQL & POSTGRESQL REGION AVAILABILITY TODAY West US, North Central US, East US, East US2, South Central US, West Europe, North Europe, Japan West, Japan East, East Asia, SE Asia, India West, India Central, Canada Central, Canada East, Brazil More coming soon! 16 Azure regions available today
  19. 19. MySQL / PostrgreSQL サービスの構成基盤 • Azure SQL Database と共通基盤 • これまでの運用実績、ノウハウをフィードバック「枯れた」基盤で運用 • Virtual Machine 上ではなく、”Service Fabric” 上に実装 https://azure.microsoft.com/ja-jp/services/service-fabric/ PowerBI,AppServices,DataFactory, Analytics,ML,Cognitive,Bot… Global Azure with 38 Regions Azure Compute SQL Data Warehouse Azure Storage SQL Database MySQLPREVIEW PostgreSQLPREVIEW Flexible: On-demand scaling, Resource governance Trusted: HA/DR, Backup/Restore, Security, Audit, Isolation Intelligent: Advisors, Tuning, Monitoring Database Services Platform Service Fabric
  20. 20. サービスの概念と接続イメージ Azure リージョン Azure Resource Manager Application Postgres Client Database Tools (Pgadmin, psql) Postgres Client Database Tools (MySQL Workbench, mysql Client) MySQL Client Azure Database Mgmt Service Application MySQL Client REST API Azureポータ ル カスタム管理 アプリAzure CLI • 論理 DB : “インスタンス” ではない • 標準で冗長化され、自動フェイルオー バーを実装 • Database は“エンドポイント”に対し てREST APIで管理 • 接続制御はファイアウォールの ルールベースで実施 • エンジンはコミュニティバージョン
  21. 21. セキュリティの仕組み データ保護 • 標準でデータベースと バックアップ データを 暗号化 (AES 256) アクセス管理 • 規定SSL 接続 • サーバー ファイアウォール • (IPホワイトリスト方式) ID 管理 • PostgreSQL / MySQL ネイティブ認証
  22. 22. その他運用面でのメリット • 自動的にパッチ適用で運用の心配を減らす • メトリック監視とアラート機能を提供 • サーバーログは最大7日分まで保存(ポータル、Rest API, Azure CLIで確認可能) • 最大35日分のバックアップを保持でポイントインタ イムリカバリ可能 • サーバーパラメータの設定も可能
  23. 23. アプリをDockerコンテナ化して フルマネージドサービスに移行
  24. 24. Container Web App for Containers VM PHP App + Apache2 VM PHP App + Apache2 Container PHP App + Apache2 VM VM ① ② ③ アプリのDockerコンテナ化 Azure PaaSでフルマネージド化
  25. 25. フルマネージド化対応までの流れ 1. アプリのDockerコンテナ化 2. MySQL接続部をAzure DB for MySQLに対応 3. 作成したコンテナイメージをコンテナレジストリに push(Docker Hub / Azure Container Registry) 4. Web App for Container の プロビジョニング + コンテナイメージのデプロイメント
  26. 26. サンプルコード 本ウェビナーの説明で使用する設定ファイルコードは全て GITHUBにアップしてあります。ご自分の環境でお試しに なりたい方は下記レポジトリよりgit clone/ダウンロード してお使いください。 https://github.com/yokawasa/WordPress git clone https://github.com/yokawasa/WordPress.git
  27. 27. アプリのDockerコンテナ化 Dockerfileの作成 • Dockerコンテナーの構成内容をまとめて記述するファイル Best practices for writing Dockerfiles https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/ FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] サンプルDockerfile (Pythonアプリapp.pyの環境)
  28. 28. 標準的なWordpress用Dockerfile ベースイメージはphp:7.0-apache その他追加パッケージのインストール 推奨PHP設定(OPcache ) ファイル・ディレクトリ関連設定 docker-entrypoint.sh シェルを介して実行する設定内容を記述。 ここではWordpress用パラメータ設定 ファイル(wp-config.php)の初期設定等https://github.com/yokawasa/WordPress/blob/master/Docker Wordpressアプリ環境の構成内容を記述 ベースはDocker公式のWordpressイメージ https://github.com/docker-library/wordpress/tree/master/php7.0/apache
  29. 29. Web App用カスタムコンテナのための 設定ポイント https://blogs.msdn.microsoft.com/waws/2017/09/08/things-you-should-know-web-apps-and-linux/ 1. パラメータは環境変数から読み込むように設定 DB接続先やアプリ内の可変パラメータなど 2. 外部公開用ポートの自動バインド 外部公開可能なポートは1つのみ。ポートは自動で検知されコンテナにバインドされる。 WEBSITES_PORT環境変数で明示的に指定可 3. SSHの設定 Azureポータル内のクライアントからのみコンテナイメージにSSHログインが可能。rootユーザー パスワードは“Docker!”, ポートは2222 https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ssh-support 4. 永続化データと/homeディレクトリ WEBSITES_ENABLE_APP_SERVICE_STORAGEをtrueにすることで/homeディレクトリは ストレージにマウントされる
  30. 30. Web Appコンテナ用WordpressアプリのDockerfile https://github.com/yokawasa/WordPress/blob/master/Dockerfile.weba pp Web AppへのSSHログインのための設定 永続化ディレクトリ(/home)にアプリ コード展開とログ出力するための設定
  31. 31. アプリのコンテナイメージ化と実行 コンテナをビルドする (image_name:tag=wordpress-app:0.0.1) コンテナをローカルで走らせてテスト 環境変数でMySQL接続情報とストレージ永続有効化設定をセット
  32. 32. [参考] Docker-compose.ymlに整理すると アプリ + MySQLコンテナの実行用ファイルWordpressアプリコンテナの実行用設定ファイル docker-compose_remotedb.yml docker-compose_localdb.yml docker-compose -f docker-compose_remotedb.yml up 次のようにdocker-composeで実行
  33. 33. Azure DB for MySQLの作成 Azureポータル、Azure CLI、REST API経由で作成可能 ここではAzure CLIでの作成方法をご紹介 DBアカウント作成 az mysql server create --name <dbaccountname> --resource-group <groupname> --location <region> --admin-user <adminuser> --admin-password <password> --performance-tier <Tier:Basic|Standard> --compute-units <unit#> → サーバ名: <dbaccountname>.mysql.database.azure.com 例)DBアカウントyoichikademo01作成 (Basic帯, リージョン:西日本, adminユーザ:myadmin) az mysql server create --name yoichikademo01--resource-group myrgroup --location japanwest --admin-user myadmin --admin-password *** --performance-tier Basic --compute-units 50
  34. 34. Azure DB for MySQLの設定 1. ファイアウォールの設定(ここではテストのため便宜上全てのIPレンジを許可) az mysql server firewall-rule create --resource-group <group> --server <dbaccountname> --name AllowFullRangeIP --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255 mysqlコマンドでテストアクセス (DBアカウントyoicikademo01へのアクセス ) mysql -u myadmin@yoichikademo01 -p -h yoichikademo01.mysql.database.azure.com 2. ssl-enforcement パラメーターを無効化(以降のアプリのテスト簡略化のため・・・) az mysql server update --resource-group <group> --name <dbaccountname> --ssl-enforcement Disabled https://docs.microsoft.com/en-us/cli/azure/mysql
  35. 35. MySQL接続先を変更して実行テスト MySQL接続先を前のステップで作成したAzure DB for MySQLに変更 して問題なくWordpressアプリが実行されることを確認する myadmin **** yoichikademo01.mysql.database.azure.com
  36. 36. Docker HubにイメージをPUSH Docker HubにPUSH (image-name:tag=wordpress-app:0.0.1) Docker Hubにイメージが PUSHされていることを確認 <dockerhub-user>/<imagename>:<tag> = yoichikawasaki/wordpress-app:0.0.1
  37. 37. Web App for Containerプロビジョニング Azure CLIによる設定 https://docs.microsoft.com/en-us/azure/app-service/containers/tutorial-custom-docker-image Web App for Containerの作成(プロビジョニング時にコンテナを指定) # App Settingsに環境変数をセット (--settingsのパラメータにスペース区切りで複数設定可)
  38. 38. 継続的デリバリー(CD)
  39. 39. 最も単純なデプロイメントの流れ Local PC Container Registry • 開発、ビルド、テスト • コンテナイメージ作成 コンテナイメージを Registryにプッシュ Web Appが コンテナイメーを Registryからプル https://hub.docker.com/ deployment slot • dev • Staging • production
  40. 40. AzureでのCI/CDオプション Web AppのWebhookとコンテナレジストリ連携 • Docker Hub/Azure Container RegistryにイメージPUSHでWebhookキックされてWeb Appのコンテナ入れ替える、お手軽な手法 • https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ci-cd 自動化を支えるCI/CDツール群 • Visual Studio Team Services • Jenkins • TravisCI / CircleCI
  41. 41. デプロイメントサイクルとCI/CD Commits code Build/CI CD pipelineContainer Registry commits code Build/CI CD pipelineAzure Container Registry Code Repository Build + Testing Release Commits code Build/CI CD pipelineContainer Registry
  42. 42. Commits code Build/CI CD pipelineContainer Registry
  43. 43. CircleCI – パイプライン設定内容 パイプライン処理で必要な パッケージをインストール コンテナイメージのビルド イメージのテスト Docker Hubにイメージ プッシュ Web Appのベースコンテナ を新しいイメージに設定変更 設定ファイル: https://github.com/yokawasa/WordPress/blob/master/.circleci/config.yml
  44. 44. CircleCI – 環境変数設定
  45. 45. Azure PaaSでフルマネージド化した構成 Docker Container Web App for Containers アプリ + Web/Appサーバ • 必要なものは全てコンテナイメージ化 されたコンテナインスタンスをWeb Appで走らせる • Web Appの特徴 • フルマネージド • 高速なプロビジョニング • オートスケール • 豊富な運用管理+DevOps機能 • 既存のドライバ、ライブラリと完全互換で それまで同様の使い方が可能 • Azure DB for MySQLの特徴 • フルマネージドデータベース • 標準冗長化+自動フェイルオーバー • ダウンタイム無し scale up/down可 • 自動バックアップ/Point in time recovery可能
  46. 46. APPENDIX
  47. 47. Azureのコンテナ関連サービス Azure Container Service Service Fabric App ServiceAzure Container Instance IaaS Low Level PaaS High Level PaaS • Azure Container Service • IaaSベースのサービス、複数のVMを使ってクラスタを構成。Kubernetes, DCOS Docker, Swarmを 使ってコンテナのスケールとオーケストレーションが簡単できるサービス • Azure Container Instance • VMいらずで、シングルコマンドで簡単かつ高速に実行可能なコンテナインスタンス。秒単位課金 • Azure Service Fabric • マイクロサービス向けのオーケストレーターとランタイム。大規模サービス向け • App Service (Web App for Containers + App Service on Linux) • アプリ実行に必要なさまざま機能が用意されたPaaS環境
  48. 48. Azure Container Registry Azure上のファーストクラスDockerプライベートレジストリ https://azure.microsoft.com/en-us/services/container-registry/
  49. 49. App Service Jenkins Plugins https://azure.microsoft.com/en-us/blog/annoucing-jenkins-deploy-to-azure-app- service-plugin-and-new-managed-disk-support-for-azure-storage-plugin/
  50. 50. Jenkinsを使ったCI https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin
  51. 51. Azure Databaseマイグレーションパス • https://datamigration.microsoft.com/

×