53
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

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

Embed Size (px)

Citation preview

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

Yoichi KawasakiAzure Technology Solution Professional

Asia Intelligent Cloud Global Black Belt

Microsoft Corporation

Slides for Azure Webinar: Azure PaaS App + DevOps

アジェンダ• 本セミナーの目的

• Web App for ContainersとApp Service on Linux

• Azure Database for MySQL/PostgreSQL

• アプリのコンテナ化+フルマネージド化対応

• 継続的デリバリー(CD)

本日とりあげるPHPアプリみんな大好きWordpress、最も有名なLAMPスタックアプリの1つ

https://wordpress.org/

ふつうのLAMPアプリの構成

アプリ + Web/Appサーバ

アプリ + Web/Appサーバ

アプリ + Web/Appサーバ

アプリ + Web/Appサーバ

Balancer

Web/App Servers Database Servers

本番運用、色々と考えなければいけない

• 災害対策(DR)

• 冗長化対策

• 高負荷対策

• パッチあてなどUpdate とランタイムの更新

• CI/CD

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予定

本セミナーの目的アプリをコンテナ化しフルマネージド化するための一連の流れをご理解いただくこと

Container

Web App for Containers

VM

PHP App + Apache2

VM

PHP App + Apache2

Container

Web App for Containers

VM

PHP App + Apache2

VM

PHP App + Apache2

Container

PHP App + Apache2

VM VM

アプリのDockerコンテナ化

Azure PaaSでフルマネージド化

Web App for Containers と

App Service on Linux

コンテナを使う理由?

• アプリケーションのポータビリティ• 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを

移動できる

• 起動時間の短縮• 仮想マシンよりもオーバーヘッドが少なく起動が高速

• 高密度なリソース利用が可能• 構成が仮想化よりも単純であるため高密度なリソース利用が可能

App Serviceを使う理由?• フルマネージドなアプリ実行環境

• これまではWindows + IISのマネージド環境• パッチあてなどUpdate とランタイムの更新は Azureが行う

• 高速なプロビジョニング• 数秒でアプリ実行環境が完成

• 柔軟なスケーリング• スケールアップ・スケールアウトも数クリック、オートスケールも可能

• 簡単なデプロイメント• 既存のコードレポジトリ(Git/Github)やCIツール・サービス(Jenkins, VSTS,

TravisCI/CircleCIなど) と連携した CI/CD が容易に実現可能

お客様からの強いリクエスト

https://feedback.azure.com/forums/169385-web-apps/suggestions/8362119-support-linux-for-paas

Web App for Containers

App Service on Linux

• フルマネージドサービス、Platform-as-a-Service (PaaS)

• 柔軟なスケールアップ・ダウン + オートスケール

• お客様からの強い要望により実現

• Linux VMで動いているコンテナベースのアプリをターゲット

• オンプレからのLift and Shiftがとても容易

2017年9月正式リリース

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

Web App for Containers• Bring Your Own Container

• アプリケーション入りの皆さんのカスタムイメージをデプロイして実行する

イメージのソース Azure Container Registry

Docker Hub

プライベートレジストリ

Azure Database for

MySQL/PostgreSQL

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)

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!

16Azure regions available today

MySQL / PostrgreSQL サービスの構成基盤• Azure SQL Database と共通基盤• これまでの運用実績、ノウハウをフィードバック「枯れた」基盤で運用• Virtual Machine 上ではなく、”Service Fabric” 上に実装

https://azure.microsoft.com/ja-jp/services/service-fabric/

Po

wer

BI, A

pp

Serv

ices,

Data

Facto

ry,

An

aly

tics,

ML, C

og

nit

ive, B

ot…

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, MonitoringDatabase

Services

Platform

Service Fabric

サービスの概念と接続イメージ

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で管理• 接続制御はファイアウォールの

ルールベースで実施• エンジンはコミュニティバージョン

セキュリティの仕組み

データ保護

• 標準でデータベースとバックアップ データを暗号化 (AES 256)

アクセス管理

• 規定SSL 接続

• サーバー ファイアウォール

• (IPホワイトリスト方式)

ID 管理

• PostgreSQL / MySQL ネイティブ認証

その他運用面でのメリット

• 自動的にパッチ適用で運用の心配を減らす

• メトリック監視とアラート機能を提供

• サーバーログは最大7日分まで保存(ポータル、Rest API, Azure CLIで確認可能)

• 最大35日分のバックアップを保持でポイントインタイムリカバリ可能

• サーバーパラメータの設定も可能

アプリをDockerコンテナ化して

フルマネージドサービスに移行

Container

Web App for Containers

VM

PHP App + Apache2

VM

PHP App + Apache2

Container

PHP App + Apache2

VM VM

アプリのDockerコンテナ化

Azure PaaSでフルマネージド化

フルマネージド化対応までの流れ

1. アプリのDockerコンテナ化

2. MySQL接続部をAzure DB for MySQLに対応

3. 作成したコンテナイメージをコンテナレジストリにpush(Docker Hub / Azure Container Registry)

4. Web App for Container の プロビジョニング +コンテナイメージのデプロイメント

サンプルコード

本ウェビナーの説明で使用する設定ファイルコードは全てGITHUBにアップしてあります。ご自分の環境でお試しになりたい方は下記レポジトリよりgit clone/ダウンロードしてお使いください。

https://github.com/yokawasa/WordPress

git clone https://github.com/yokawasa/WordPress.git

アプリのDockerコンテナ化

Dockerfileの作成• Dockerコンテナーの構成内容をまとめて記述するファイル

Best practices for writing Dockerfileshttps://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

FROM python:3.4-alpine ADD . /code WORKDIR /codeRUN pip install -r requirements.txtCMD ["python", "app.py"]

サンプルDockerfile (Pythonアプリapp.pyの環境)

標準的なWordpress用Dockerfile

ベースイメージはphp:7.0-apacheその他追加パッケージのインストール

推奨PHP設定(OPcache )

ファイル・ディレクトリ関連設定

docker-entrypoint.shシェルを介して実行する設定内容を記述。ここではWordpress用パラメータ設定ファイル(wp-config.php)の初期設定等https://github.com/yokawasa/WordPress/blob/master/Docker

file

Wordpressアプリ環境の構成内容を記述ベースはDocker公式のWordpressイメージhttps://github.com/docker-library/wordpress/tree/master/php7.0/apache

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!”, ポートは2222https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ssh-support

4. 永続化データと/homeディレクトリWEBSITES_ENABLE_APP_SERVICE_STORAGEをtrueにすることで/homeディレクトリはストレージにマウントされる

Web Appコンテナ用WordpressアプリのDockerfile

https://github.com/yokawasa/WordPress/blob/master/Dockerfile.weba

pp

Web AppへのSSHログインのための設定

永続化ディレクトリ(/home)にアプリコード展開とログ出力するための設定

アプリのコンテナイメージ化と実行

コンテナをビルドする (image_name:tag=wordpress-app:0.0.1)

コンテナをローカルで走らせてテスト

環境変数でMySQL接続情報とストレージ永続有効化設定をセット

[参考] Docker-compose.ymlに整理するとアプリ + MySQLコンテナの実行用ファイルWordpressアプリコンテナの実行用設定ファイル

docker-compose_remotedb.yml

docker-compose_localdb.yml

docker-compose -f docker-compose_remotedb.yml up

次のようにdocker-composeで実行

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

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

MySQL接続先を変更して実行テスト

MySQL接続先を前のステップで作成したAzure DB for MySQLに変更

して問題なくWordpressアプリが実行されることを確認する

myadmin****

yoichikademo01.mysql.database.azure.com

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

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のパラメータにスペース区切りで複数設定可)

継続的デリバリー(CD)

最も単純なデプロイメントの流れ

Local PC Container Registry

• 開発、ビルド、テスト• コンテナイメージ作成

コンテナイメージをRegistryにプッシュ

Web AppがコンテナイメーをRegistryからプル

https://hub.docker.com/

deployment slot

• dev

• Staging

• production

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

Commits code Build/CI CD pipelineContainer Registry

CircleCI – パイプライン設定内容パイプライン処理で必要なパッケージをインストール

コンテナイメージのビルド

イメージのテスト

Docker Hubにイメージプッシュ

Web Appのベースコンテナを新しいイメージに設定変更

設定ファイル: https://github.com/yokawasa/WordPress/blob/master/.circleci/config.yml

CircleCI – 環境変数設定

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可能

APPENDIX

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環境

Azure Container RegistryAzure上のファーストクラスDockerプライベートレジストリ

https://azure.microsoft.com/en-us/services/container-registry/

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/

Jenkinsを使ったCI

https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin

Azure Databaseマイグレーションパス• https://datamigration.microsoft.com/