web app for containers + mysqlでコンテナ対応したphpアプリを作ろう!
TRANSCRIPT
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)
ふつうのLAMPアプリの構成
アプリ + Web/Appサーバ
アプリ + Web/Appサーバ
アプリ + Web/Appサーバ
アプリ + Web/Appサーバ
Balancer
Web/App Servers Database Servers
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でフルマネージド化
コンテナを使う理由?
• アプリケーションのポータビリティ• 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを
移動できる
• 起動時間の短縮• 仮想マシンよりもオーバーヘッドが少なく起動が高速
• 高密度なリソース利用が可能• 構成が仮想化よりも単純であるため高密度なリソース利用が可能
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 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日分のバックアップを保持でポイントインタイムリカバリ可能
• サーバーパラメータの設定も可能
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のパラメータにスペース区切りで複数設定可)
最も単純なデプロイメントの流れ
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
デプロイメントサイクルと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
CircleCI – パイプライン設定内容パイプライン処理で必要なパッケージをインストール
コンテナイメージのビルド
イメージのテスト
Docker Hubにイメージプッシュ
Web Appのベースコンテナを新しいイメージに設定変更
設定ファイル: https://github.com/yokawasa/WordPress/blob/master/.circleci/config.yml
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可能
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