Esercitazione: Creare un'app multi-contenitore (anteprima) in App Web per contenitori
Nota
I contenitori sidecar (anteprima) avranno esito positivo nelle app multi-contenitore in servizio app. Per iniziare, vedere Esercitazione: Configurare un contenitore sidecar per un contenitore personalizzato in app Azure Servizio (anteprima).
App Web per contenitori offre un modo flessibile per usare le immagini Docker. In questa esercitazione si apprenderà come creare un'app multi-contenitore usando WordPress e MySQL. Questa esercitazione verrà completata in Cloud Shell, ma gli stessi comandi possono essere eseguiti anche in locale con l'interfaccia della riga di comando di Azure (2.0.32 o versioni successive).
In questa esercitazione apprenderai a:
- Convertire una configurazione Docker Compose per l'uso con App Web per contenitori
- Distribuire un'app multi-contenitore in Azure
- Aggiungere impostazioni dell'applicazione
- Usare l'archiviazione permanente per i contenitori
- Connettersi a Database di Azure per MySQL
- Risolvere gli errori
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Prerequisiti
Per completare questa esercitazione è necessario avere una buona conoscenza di Docker Compose.
Scaricare l'esempio
Per questa esercitazione si userà il file Compose di Docker, ma modificato in modo da includere Database di Azure per MySQL, l'archiviazione persistente e Redis. Il file di configurazione è disponibile negli Esempi di Azure. Nell'esempio seguente si noti che depends_on
è un'opzione non supportata e viene ignorata. Per le opzioni di configurazione supportate, vedere Opzioni di Docker Compose.
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
In Cloud Shell creare una directory di esercitazione e passare a questa directory.
mkdir tutorial
cd tutorial
Eseguire quindi il comando seguente per clonare il repository dell'app di esempio nella directory di esercitazione. Quindi, passare alla directory multicontainerwordpress
.
git clone https://github.com/Azure-Samples/multicontainerwordpress
cd multicontainerwordpress
Creare un gruppo di risorse
Un gruppo di risorse è un contenitore logico in cui vengono distribuite e gestite risorse di Azure come app Web, database e account di archiviazione. Ad esempio, si può scegliere in un secondo momento di eliminare l'intero gruppo di risorse in un unico semplice passaggio.
In Cloud Shell creare un gruppo di risorse con il comando az group create
. L'esempio seguente crea un gruppo di risorse denominato myResourceGroup nella località Stati Uniti centro-meridionali. Per visualizzare tutte le località supportate per il servizio app in Linux nel livello Standard, eseguire il comando az appservice list-locations --sku S1 --linux-workers-enabled
.
az group create --name myResourceGroup --location "South Central US"
In genere, il gruppo di risorse e le risorse vengono creati in un'area vicina alla località dell'utente.
Al termine del comando, un output JSON visualizza le proprietà del gruppo di risorse.
Creare un piano di servizio app di Azure
In Cloud Shell creare un piano di servizio app nel gruppo di risorse con il comando az appservice plan create
.
L'esempio seguente crea un piano di servizio app denominato myAppServicePlan
nel piano tariffario Standard (--sku S1
) e in un contenitore Linux (--is-linux
).
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku S1 --is-linux
Al termine della creazione del piano di servizio app, Cloud Shell visualizza informazioni simili all'esempio seguente:
{ "adminSiteName": null, "appServicePlanName": "myAppServicePlan", "geoRegion": "South Central US", "hostingEnvironmentProfile": null, "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan", "kind": "linux", "location": "South Central US", "maximumNumberOfWorkers": 1, "name": "myAppServicePlan", < JSON data removed for brevity. > "targetWorkerSizeId": 0, "type": "Microsoft.Web/serverfarms", "workerTierName": null }
Docker Compose con contenitori WordPress e MySQL
Creare un'app Docker Compose
In Cloud Shell creare un'app Web multi-contenitore nel piano di servizio app myAppServicePlan
con il comando az webapp create. Non dimenticare di sostituire <app-name> con un nome di app univoco.
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Dopo la creazione dell'app Web, Cloud Shell visualizza un output simile all'esempio seguente:
{ "additionalProperties": {}, "availabilityState": "Normal", "clientAffinityEnabled": true, "clientCertEnabled": false, "cloningInfo": null, "containerSize": 0, "dailyMemoryTimeQuota": 0, "defaultHostName": "<app-name>.azurewebsites.net", "enabled": true, < JSON data removed for brevity. > }
Passare all'app
Passare all'app distribuita all'indirizzo http://<app-name>.azurewebsites.net
. Il caricamento dell'app può richiedere alcuni minuti. Se si riceve un errore, attendere qualche minuto e quindi aggiornare il browser. Se si verificano problemi, per la risoluzione esaminare i log dei contenitori.
La creazione di un'app multi-contenitore in App Web per contenitori è stata completata. Ora si configurerà l'app per l'uso di Database di Azure per MySQL. Non installare WordPress in questo momento.
Connettersi al database di produzione
Non è consigliabile usare contenitori di database in un ambiente di produzione. I contenitori locali non sono scalabili. In questo caso si userà Database di Azure per MySQL, che è scalabile.
Creare un server Database di Azure per MySQL
Creare un server Database di Azure per MySQL con il comando az mysql server create
.
Nel comando seguente sostituire il nome del server MySQL in cui viene visualizzato il <segnaposto mysql-server-name> (i caratteri validi sono a-z
, 0-9
e -
). Poiché questo nome fa parte del nome host del server MySQL (<mysql-server-name>.database.windows.net
) è necessario che sia univoco a livello globale.
az mysql server create --resource-group myResourceGroup --name <mysql-server-name> --location "South Central US" --admin-user adminuser --admin-password My5up3rStr0ngPaSw0rd! --sku-name B_Gen5_1 --version 5.7
La creazione del server può richiedere alcuni minuti. Al termine della creazione del server MySQL, Cloud Shell visualizza informazioni simili all'esempio seguente:
{ "administratorLogin": "adminuser", "administratorLoginPassword": null, "fullyQualifiedDomainName": "<mysql-server-name>.database.windows.net", "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>", "location": "southcentralus", "name": "<mysql-server-name>", "resourceGroup": "myResourceGroup", ... }
Configurare il firewall del server
Creare una regola del firewall per il server MySQL per consentire le connessioni client usando il comando az mysql server firewall-rule create
. Quando sia l'IP iniziale che l'IP finale sono impostati su 0.0.0.0, il firewall viene aperto solo per le altre risorse di Azure.
az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
Suggerimento
È possibile rendere ancora più restrittiva la regola del firewall usando solo gli indirizzi IP in uscita usati dall'app.
Creare il database di WordPress
az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress
Al termine della creazione del database, Cloud Shell visualizza informazioni simili all'esempio seguente:
{ "additionalProperties": {}, "charset": "latin1", "collation": "latin1_swedish_ci", "id": "/subscriptions/12db1644-4b12-4cab-ba54-8ba2f2822c1f/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>/databases/wordpress", "name": "wordpress", "resourceGroup": "myResourceGroup", "type": "Microsoft.DBforMySQL/servers/databases" }
Configurare le variabili di database in WordPress
Per connettere l'app WordPress a questo nuovo server MySQL occorre configurare alcune variabili di ambiente specifiche di WordPress, incluso il percorso della CA SSL definito da MYSQL_SSL_CA
. Nell'immagine personalizzata più avanti viene fornito il certificato Baltimore CyberTrust Root di DigiCert.
Per apportare queste modifiche, usare il comando az webapp config appsettings set in Cloud Shell. Le impostazioni delle app applicano la distinzione tra maiuscole e minuscole e sono separate da spazi.
az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WORDPRESS_DB_HOST="<mysql-server-name>.mysql.database.azure.com" WORDPRESS_DB_USER="adminuser" WORDPRESS_DB_PASSWORD="My5up3rStr0ngPaSw0rd!" WORDPRESS_DB_NAME="wordpress" MYSQL_SSL_CA="BaltimoreCyberTrustroot.crt.pem"
Al termine della creazione delle impostazioni app, Cloud Shell visualizza informazioni simili all'esempio seguente:
[ { "name": "WORDPRESS_DB_HOST", "slotSetting": false, "value": "<mysql-server-name>.mysql.database.azure.com" }, { "name": "WORDPRESS_DB_USER", "slotSetting": false, "value": "adminuser" }, { "name": "WORDPRESS_DB_NAME", "slotSetting": false, "value": "wordpress" }, { "name": "WORDPRESS_DB_PASSWORD", "slotSetting": false, "value": "My5up3rStr0ngPaSw0rd!" }, { "name": "MYSQL_SSL_CA", "slotSetting": false, "value": "BaltimoreCyberTrustroot.crt.pem" } ]
Per altre informazioni sulle variabili di ambiente, vedere Configurare le variabili di ambiente.
Usare un'immagine personalizzata per MySQL TLS/SSL e altre configurazioni
Per impostazione predefinita, TLS/SSL viene usato da Database di Azure per MySQL. WordPress richiede una configurazione aggiuntiva per l'uso di TLS/SSL con MySQL. L'immagine ufficiale di WordPress non contiene la configurazione aggiuntiva, ma per comodità è stata preparata un'immagine personalizzata. Nella pratica, si aggiungeranno le modifiche desiderate alla propria immagine.
L'immagine personalizzata si basa sull'immagine ufficiale di WordPress dall'hub Docker. In questa immagine personalizzata sono state apportate le modifiche seguenti per Database di Azure per MySQL:
- Aggiunge il file di certificato Baltimore Cyber Trust Root per SSL a MySQL.
- Usa l'impostazione app per il certificato dell'autorità di certificazione SSL per MySQL nel file wp-config.php di WordPress.
- Aggiunge la definizione WordPress per MYSQL_CLIENT_FLAGS necessaria per SSL in MySQL.
Per Redis (da usare in una sezione successiva) sono state apportate le modifiche seguenti:
- Aggiunge l'estensione PHP per Redis v4.0.2.
- Aggiunge l'utilità di decompressione necessaria per l'estrazione dei file.
- Aggiunge il plug-in WordPress Redis Object Cache 1.3.8.
- Usa l'impostazione app per il nome host Redis nel file wp-config.php di WordPress.
Per usare l'immagine personalizzata è necessario aggiornare il file docker-compose-wordpress.yml. In Cloud Shell aprire un editor di testo e modificare per image: wordpress
usare image: mcr.microsoft.com/azuredocs/multicontainerwordpress
. Il contenitore del database non è più necessario. Rimuovere le sezioni db
, environment
, depends_on
e volumes
dal file di configurazione. Il file dovrà essere simile al codice seguente:
version: '3.3'
services:
wordpress:
image: mcr.microsoft.com/azuredocs/multicontainerwordpress
ports:
- "8000:80"
restart: always
Aggiornare l'app con la nuova configurazione
In Cloud Shell riconfigurare l'app Web multi-contenitore con il comando az webapp config container set. Non dimenticare di sostituire <app-name> con il nome dell'app Web creata in precedenza.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Al termine della riconfigurazione dell'app, Cloud Shell visualizza informazioni simili all'esempio seguente:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM=" } ]
Passare all'app
Passare all'app distribuita all'indirizzo http://<app-name>.azurewebsites.net
. Ora l'app usa Database di Azure per MySQL.
Aggiungere l'archiviazione permanente
L'app multi-contenitore è ora in esecuzione in App Web per contenitori. Tuttavia, se si installa WordPress adesso e si riavvia l'app in un secondo momento, si scoprirà che l'installazione di WordPress non è più presente. Questo accade perché la configurazione Docker Compose attualmente punta a un percorso di archiviazione all'interno del contenitore. I file installati nel contenitore non vengono mantenuti dopo il riavvio dell'app. In questa sezione si aggiungerà l'archiviazione permanente al contenitore WordPress.
Configurare le variabili di ambiente
Per usare l'archiviazione permanente, è necessario abilitare questa impostazione all'interno del servizio app. Per apportare questa modifica, usare il comando az webapp config appsettings set in Cloud Shell. Le impostazioni delle app applicano la distinzione tra maiuscole e minuscole e sono separate da spazi.
az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE
Al termine della creazione delle impostazioni app, Cloud Shell visualizza informazioni simili all'esempio seguente:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_NAME", "slotSetting": false, "value": "wordpress" }, { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" } ]
Modificare il file di configurazione
In Cloud Shell aprire il file docker-compose-wordpress.yml
in un editor di testo.
L'opzione volumes
esegue il mapping del file system a una directory all'interno del contenitore. ${WEBAPP_STORAGE_HOME}
è una variabile di ambiente nel servizio app mappata all'archiviazione permanente per l'app. Si userà questa variabile di ambiente nell'opzione volumes, in modo che i file di WordPress vengano installati nell'archiviazione permanente anziché nel contenitore. Apportare al file le modifiche seguenti:
Nella sezione wordpress
aggiungere un'opzione volumes
in modo che rispecchi il codice seguente:
version: '3.3'
services:
wordpress:
image: mcr.microsoft.com/azuredocs/multicontainerwordpress
volumes:
- ${WEBAPP_STORAGE_HOME}/site/wwwroot:/var/www/html
ports:
- "8000:80"
restart: always
Aggiornare l'app con la nuova configurazione
In Cloud Shell riconfigurare l'app Web multi-contenitore con il comando az webapp config container set. Non dimenticare di sostituire <app-name> con un nome di app univoco.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Dopo l'esecuzione del comando, l'output restituito è simile all'esempio seguente:
[ { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" }, { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Passare all'app
Passare all'app distribuita all'indirizzo http://<app-name>.azurewebsites.net
.
Ora il contenitore WordPress usa Database di Azure per MySQL e l'archiviazione permanente.
Aggiungere il contenitore Redis
L'immagine ufficiale di WordPress non include le dipendenze per Redis. Queste dipendenze e la configurazione aggiuntiva necessaria per l'uso di Redis con WordPress sono state preparate per comodità degli utenti in questa immagine personalizzata. Nella pratica, si aggiungeranno le modifiche desiderate alla propria immagine.
L'immagine personalizzata si basa sull'immagine ufficiale di WordPress dall'hub Docker. In questa immagine personalizzata sono state apportate le modifiche seguenti per Redis:
- Aggiunge l'estensione PHP per Redis v4.0.2.
- Aggiunge l'utilità di decompressione necessaria per l'estrazione dei file.
- Aggiunge il plug-in WordPress Redis Object Cache 1.3.8.
- Usa l'impostazione app per il nome host Redis nel file wp-config.php di WordPress.
Aggiungere il contenitore Redis alla fine del file di configurazione in modo che risulti simile all'esempio seguente:
version: '3.3'
services:
wordpress:
image: mcr.microsoft.com/azuredocs/multicontainerwordpress
ports:
- "8000:80"
restart: always
redis:
image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
environment:
- ALLOW_EMPTY_PASSWORD=yes
restart: always
Configurare le variabili di ambiente
Per usare Redis è necessario abilitare l'impostazione WP_REDIS_HOST
all'interno del servizio app. Si tratta di un'impostazione necessaria perché WordPress possa comunicare con l'host Redis. Per apportare questa modifica, usare il comando az webapp config appsettings set in Cloud Shell. Le impostazioni delle app applicano la distinzione tra maiuscole e minuscole e sono separate da spazi.
az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WP_REDIS_HOST="redis"
Al termine della creazione delle impostazioni app, Cloud Shell visualizza informazioni simili all'esempio seguente:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_USER", "slotSetting": false, "value": "adminuser" }, { "name": "WP_REDIS_HOST", "slotSetting": false, "value": "redis" } ]
Aggiornare l'app con la nuova configurazione
In Cloud Shell riconfigurare l'app Web multi-contenitore con il comando az webapp config container set. Non dimenticare di sostituire <app-name> con un nome di app univoco.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file compose-wordpress.yml
Dopo l'esecuzione del comando, l'output restituito è simile all'esempio seguente:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Passare all'app
Passare all'app distribuita all'indirizzo http://<app-name>.azurewebsites.net
.
Completare i passaggi e installare WordPress.
Connettere WordPress a Redis
Accedere all'amministratore di WordPress. Nel riquadro di spostamento a sinistra selezionare Plug-in e quindi selezionare Plug-in installati.
Tutti i plug-in vengono visualizzati qui
Nella pagina dei plug-in individuare Redis Object Cache e fare clic su Activate (Attiva).
Fare clic su Settings (Impostazioni).
Fare clic sul pulsante Enable Object Cache (Abilita cache oggetti).
WordPress si connette al server Redis. Lo stato della connessione viene visualizzato nella stessa pagina.
WordPress è ora connesso a Redis. A questo punto, l'app pronta per la produzione usa Database di Azure per MySQL, l'archiviazione permanente e Redis. È ora possibile aumentare il numero di istanze per il piano di servizio app.
Trovare i log dei contenitori Docker
Se si verificano problemi relativi all'uso di più contenitori, è possibile accedere ai log dei contenitori passando a: https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
L'output sarà simile all'esempio seguente:
[ { "machineName":"RD00XYZYZE567A", "lastUpdated":"2018-05-10T04:11:45Z", "size":25125, "href":"https://<app-name>.scm.azurewebsites.net/api/vfs/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log", "path":"/home/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log" } ]
Saranno disponibili un log per ogni contenitore e un log aggiuntivo per il processo padre. Copiare il valore href
corrispondente nel browser per visualizzare il log.
Pulire la distribuzione
Dopo l'esecuzione dello script di esempio, è possibile usare il comando seguente per rimuovere il gruppo di risorse e tutte le risorse ad esso associate.
az group delete --name myResourceGroup
Passaggi successivi
Questa esercitazione ha descritto come:
- Convertire una configurazione Docker Compose per l'uso con App Web per contenitori
- Distribuire un'app multi-contenitore in Azure
- Aggiungere impostazioni dell'applicazione
- Usare l'archiviazione permanente per i contenitori
- Connettersi a Database di Azure per MySQL
- Risolvere gli errori
Passare all'esercitazione successiva per informazioni su come proteggere l'app con un dominio e un certificato personalizzati.
In alternativa, consultare altre risorse: