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.

App multi-contenitore di esempio in App Web per 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-9e -). 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:

Per Redis (da usare in una sezione successiva) sono state apportate le modifiche seguenti:

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.

App multi-contenitore di esempio in App Web per contenitori

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:

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.

Selezionare i plug-in di WordPress

Tutti i plug-in vengono visualizzati qui

Nella pagina dei plug-in individuare Redis Object Cache e fare clic su Activate (Attiva).

Attivare Redis

Fare clic su Settings (Impostazioni).

Fare clic su Impostazioni.

Fare clic sul pulsante Enable Object Cache (Abilita cache oggetti).

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 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: