Självstudier: Skapa en app med flera containrar (förhandsversion) med Web App for Containers

Kommentar

Sidovagnscontainrar (förhandsversion) lyckas med appar med flera containrar i App Service. Kom igång genom att läsa Självstudie: Konfigurera en sidovagnscontainer för anpassad container i Azure App Service (förhandsversion).

Med Web App for Containers får du ett flexibelt sätt att använda Docker-avbildningar. I den här självstudien lär du dig hur du skapar en app med flera container med hjälp av WordPress och MySQL. Du genomför den här självstudiekursen i Cloud Shell men du kan även köra dessa kommandon lokalt med kommandoradsgränssnittet Azure CLI (2.0.32 eller senare).

I den här självstudien lär du dig att:

  • Konvertera en Docker Compose-konfiguration så att den fungerar med Web App for Containers
  • Distribuera en app med flera containrar till Azure
  • Lägga till appinställningar
  • Använda beständig lagring för containrarna
  • Ansluta till Azure Database for MySQL
  • Felsöka fel

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

För att slutföra den här självstudien behöver du erfarenhet av Docker Compose.

Hämta exemplet

I den här självstudien använder du skrivfilen från Docker, men du ändrar den så att den inkluderar Azure Database for MySQL, beständig lagring och Redis. Konfigurationsfilen finns på Azure Samples (Azure-exempel). Observera att i exemplet nedan är det ett alternativ som depends_on inte stöds och ignoreras. Mer information om konfigurationsalternativ som stöds finns i Alternativ för 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:

Skapa en självstudiekatalog i Cloud Shell och byt sedan till den.

mkdir tutorial

cd tutorial

Kör sedan följande kommando för att klona lagringsplatsen för exempelprogrammet till din självstudiekatalog. Ändra sedan till katalogen multicontainerwordpress.

git clone https://github.com/Azure-Samples/multicontainerwordpress

cd multicontainerwordpress

Skapa en resursgrupp

En resursgrupp är en logisk container där Azure-resurser, till exempel webbappar, databaser och lagringskonton, distribueras och hanteras. Du kan exempelvis välja att ta bort hela resursgruppen i ett enkelt steg längre fram.

Skapa i Cloud Shell en resursgrupp med kommandot az group create. I följande exempel skapas en resursgrupp med namnet myResourceGroup på platsen South Central US (USA, södra centrala). Om du vill se alla platser som stöds för App Service på Linux på Standard-nivån kör du kommandot az appservice list-locations --sku S1 --linux-workers-enabled.

az group create --name myResourceGroup --location "South Central US"

Du skapar vanligtvis din resursgrupp och resurserna i en region nära dig.

När kommandot har slutförts visar JSON-utdata resursgruppens egenskaper.

Skapa en Azure App Service-plan

Skapa i Cloud Shell en App Service-plan i resursgruppen med kommandot az appservice plan create.

I följande exempel skapas en App Service-plan med namnet myAppServicePlan i prisnivån Standard (--sku S1) och i en Linux-container (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku S1 --is-linux

När App Service-planen har skapats visas information av Cloud Shell. Informationen ser ut ungefär som i följande exempel:

{
  "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 med WordPress- och MySQL-containrar

Skapa en Docker Compose-app

I Cloud Shell skapar du en webbapp med flera containrar i myAppServicePlan App Service-planen med kommandot az webapp create. Glöm inte att ersätta <appnamn> med ett unikt appnamn.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

När webbappen har skapats visar en Cloud Shell utdata liknande den i följande exempel:

{
  "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. >
}

Bläddra till appen

Bläddra till den distribuerade appen på (http://<app-name>.azurewebsites.net). Det kan ta några minuter att läsa in appen. Om du får ett fel väntar du ytterligare ett par minuter och uppdaterar sedan webbläsaren. Om du har problem och vill felsöka kan du granska containerloggarna.

Exempelapp med flera containrar i Web App for Containers

Grattis! Du har skapat en app med flera containrar i Web App for Containers. Därefter konfigurerar du appen för att använda Azure Database for MySQL. Installera inte WordPress just nu.

Ansluta till produktionsdatabasen

Det är inte rekommenderat att använda databascontainrar i en produktionsmiljö. Lokala containrar är inte skalbara. I stället använder du Azure Database for MySQL som kan skalas.

Skapa en Azure Database för MySQL-server

Skapa en Azure Database for MySQL-server med kommandot az mysql server create.

I följande kommando ersätter du mySQL-servernamnet där platshållaren mysql-server-name> visas< (giltiga tecken är a-z, 0-9och -). Det här namnet är en del av MySQL-serverns värdnamn (<mysql-server-name>.database.windows.net) och den måste vara globalt unik.

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

Det kan ta några minuter att skapa servern. När MySQL-servern skapas visar Cloud Shell information som ser ut ungefär så här:

{
  "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",
  ...
}

Konfigurera serverbrandväggen

Skapa en brandväggsregel för MySQL-servern för att tillåta klientanslutningar med hjälp av kommandot az mysql server firewall-rule create. När både start-IP och slut-IP har angetts till 0.0.0.0 öppnas brandväggen endast för andra Azure-resurser.

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

Dricks

Du kan begränsa brandväggsregeln ännu mer genom att endast använda de utgående IP-adresser som används av din app.

Skapa WordPress-databasen

az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress

När databasen skapas visar Cloud Shell information som ser ut ungefär så här:

{
  "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"
}

Konfigurera databasvariabler i WordPress

För att ansluta WordPress-appen till den nya MySQL-servern konfigurerar du ett par WordPress-specifika miljövariabler, inklusive sökvägen för certifikatutfärdare för SSL som definieras av MYSQL_SSL_CA. Baltimore CyberTrust Root från DigiCert tillhandahålls i den anpassade avbildningen nedan.

Du kan göra dessa ändringar med hjälp av kommandot az webapp config appsettings set i Cloud Shell. Appinställningar är skifteslägeskänsliga och avgränsas med blanksteg.

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"

När appinställningen har skapats visar Cloud Shell information som ser ut ungefär som i följande exempel:

[
  {
    "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"
  }
]

Mer information om miljövariabler finns i Konfigurera miljövariabler.

Använda en anpassad avbildning för MySQL TLS/SSL och andra konfigurationer

Som standard används TLS/SSL av Azure Database for MySQL. WordPress kräver ytterligare konfiguration för att använda TLS/SSL med MySQL. WordPress "officiella avbildning" ger inte den ytterligare konfigurationen, men en anpassad avbildning har förberetts för din bekvämlighet. I vanliga fall skulle du ha lagt till önskade ändringar i en egen avbildning.

Den anpassade avbildningen är baserad på den officiella avbildningen av WordPress från Docker Hub. Följande ändringar har gjorts i den här anpassade avbildningen för Azure Database for MySQL:

Följande ändringar har gjorts för Redis (används i ett senare avsnitt):

Om du vill använda den anpassade avbildningen uppdaterar du filen docker-compose-wordpress.yml. I Cloud Shell öppnar du en textredigerare och ändrar image: wordpress till att använda image: mcr.microsoft.com/azuredocs/multicontainerwordpress. Du behöver inte längre databascontainern. Ta bort avsnittet db, environment, depends_on och volumes från konfigurationsfilen. Din fil ska se ut som följande kod:

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     ports:
       - "8000:80"
     restart: always

Uppdatera appen med ny konfiguration

I Cloud Shell konfigurerar du om webappen med flera containrar med kommandot az webapp config container set. Glöm inte att ersätta <appnamn> med namnet på webbappen som du skapade tidigare.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

När webbappen har konfigurerats om visar Cloud Shell information liknande den i följande exempel:

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM="
  }
]

Bläddra till appen

Bläddra till den distribuerade appen på (http://<app-name>.azurewebsites.net). Appen använder nu Azure Database for MySQL.

Exempelapp med flera containrar i Web App for Containers

Lägga till beständig lagring

Din app med flera containrar körs nu i Web App for Containers. Men om du installerar WordPress nu och startar om appen senare märker du att WordPress-installationen är borta. Det beror på att Docker Compose-konfigurationen för närvarande pekar på en lagringsplats inne i containern. Filerna som installeras i containern bevaras inte när appen startas om. I det här avsnittet lägger du till beständig lagring i WordPress-containern.

Konfigurera miljövariabler

Om du vill använda beständig lagring aktiverar du den här inställningen i App Service. Du kan göra denna ändring med hjälp av kommandot az webapp config appsettings set i Cloud Shell. Appinställningar är skifteslägeskänsliga och avgränsas med blanksteg.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE

När appinställningen har skapats visar Cloud Shell information som ser ut ungefär som i följande exempel:

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_NAME",
    "slotSetting": false,
    "value": "wordpress"
  },
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  }
]

Ändra konfigurationsfilen

Öppna filen docker-compose-wordpress.yml i en textredigerare i Cloud Shell.

Alternativet volumes mappar filsystemet till en katalog i containern. ${WEBAPP_STORAGE_HOME} är en miljövariabel i App Service som är mappad till beständig lagring för din app. Du använder miljövariabeln i volymalternativet så att WordPress-filerna installeras i den beständiga lagringen i stället för containern. Gör följande ändringar i filen:

I avsnittet wordpress lägger du till ett volumes-alternativ så att det ser ut som i följande kod:

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

Uppdatera appen med ny konfiguration

I Cloud Shell konfigurerar du om webappen med flera containrar med kommandot az webapp config container set. Glöm inte att ersätta <appnamn> med ett unikt appnamn.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

När kommandot körs visas utdata som ser ut ungefär som i följande exempel:

[
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  },
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

Bläddra till appen

Bläddra till den distribuerade appen på (http://<app-name>.azurewebsites.net).

Nu används Azure Database for MySQL och beständig lagring i WordPress-containern.

Lägga till Redis-container

Den officiella avbildningen för WordPress innehåller inte beroenden för Redis. Dessa beroenden och ytterligare konfiguration som behövs för att använda Regis med WordPress har förberetts för dig i den här anpassade avbildningen. I vanliga fall skulle du ha lagt till önskade ändringar i en egen avbildning.

Den anpassade avbildningen är baserad på den officiella avbildningen av WordPress från Docker Hub. Följande ändringar har gjorts i den här anpassade avbildningen för Redis:

Lägg till Redis-containern i slutet av konfigurationsfilen som i följande exempel:

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

Konfigurera miljövariabler

Aktivera inställningen WP_REDIS_HOST i App Service så att du kan använda Redis. Det här är en obligatorisk inställning för att WordPress ska kunna kommunicera med Redis-värden. Du kan göra denna ändring med hjälp av kommandot az webapp config appsettings set i Cloud Shell. Appinställningar är skifteslägeskänsliga och avgränsas med blanksteg.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WP_REDIS_HOST="redis"

När appinställningen har skapats visar Cloud Shell information som ser ut ungefär som i följande exempel:

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_USER",
    "slotSetting": false,
    "value": "adminuser"
  },
  {
    "name": "WP_REDIS_HOST",
    "slotSetting": false,
    "value": "redis"
  }
]

Uppdatera appen med ny konfiguration

I Cloud Shell konfigurerar du om webappen med flera containrar med kommandot az webapp config container set. Glöm inte att ersätta <appnamn> med ett unikt appnamn.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file compose-wordpress.yml

När kommandot körs visas utdata som ser ut ungefär som i följande exempel:

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

Bläddra till appen

Bläddra till den distribuerade appen på (http://<app-name>.azurewebsites.net).

Utför stegen och installera WordPress.

Ansluta WordPress till Redis

Logga in på WordPress-administratören. I det vänstra navigeringsfältet väljer du Plugin-program och sedan Installerade plugin-program.

Välj WordPress-plugin-program

Visa alla plugin-program här

På sidan för plugin-program letar du rätt på Redis Object Cache och klickar på Aktivera.

Aktivera Redis

Klicka på Inställningar.

Klicka på Inställningar

Klicka på Enable Object Cache (Aktivera Object Cache).

Klicka på Enable Object Cache (Aktivera Object Cache)

WordPress ansluter till Redis-servern. Anslutningens status visas på samma sida.

WordPress ansluter till Redis-servern. Anslutningsstatusen visas på samma sida.

Gratulerar! Du har anslutit WordPress till Redis. Den produktionsklara appen använder nu Azure Database for MySQL, beständig lagring och Redis. Nu kan du skala ut din App Service-plan till flera instanser.

Hitta loggar för Docker-containrar

Om du stöter på problem när du använder flera containrar kan du se loggar för containrarna genom att gå till: https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Utdata ser ut ungefär som i följande exempel:

[
   {
      "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"
   }
]

Du ser en logg för varje container och ytterligare en logg för den överordnade processen. Kopiera respektive href-värde till webbläsaren om du vill visa loggen.

Rensa distribution

När exempelskriptet har körts kan följande kommando användas för att ta bort resursgruppen och alla resurser som är kopplade till den.

az group delete --name myResourceGroup

Nästa steg

I den här självstudiekursen lärde du dig att:

  • Konvertera en Docker Compose-konfiguration så att den fungerar med Web App for Containers
  • Distribuera en app med flera containrar till Azure
  • Lägga till appinställningar
  • Använda beständig lagring för containrarna
  • Ansluta till Azure Database for MySQL
  • Felsöka fel

Gå vidare till nästa självstudie för att lära dig hur du skyddar din app med en anpassad domän och ett certifikat.

Eller kolla in andra resurser: