Tutorial: Creación de una aplicación de varios contenedores (versión preliminar) en Web App for Containers

Nota:

Los contenedores sidecar (versión preliminar) se realizarán correctamente en aplicaciones de varios contenedores en App Service. Para empezar, consulte Tutorial: Configuración de un contenedor sidecar para un contenedor personalizado en Azure App Service (versión preliminar).

Web App for Containers proporciona una manera flexible de utilizar imágenes de Docker. En este tutorial, aprenderá a crear una aplicación de varios contenedor usando WordPress y MySQL. Completará este tutorial en Cloud Shell, pero también puede ejecutar estos comandos localmente con la herramienta de la línea de comandos de la CLI de Azure (versión 2.0.32 o posterior).

En este tutorial, aprenderá a:

  • Convertir una configuración de Docker Compose para trabajar con Web App for Containers
  • Implementar una aplicación de varios contenedor en Azure
  • Agregar la configuración de la aplicación
  • Utilizar el almacenamiento persistente para los contenedores
  • Conexión a Azure Database for MySQL
  • Solución de errores

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Para completar este tutorial, se necesita experiencia con Docker Compose.

Descarga del ejemplo

Para este tutorial, utilice el archivo compose de Docker, pero tendrá que modificarlo para incluir Azure Database for MySQL, almacenamiento persistente y Redis. El archivo de configuración se pueden encontrar en los ejemplos de Azure. En el ejemplo siguiente, tenga en cuenta que depends_on es una opción no admitida y se omite. Para ver las opciones de configuración que se admiten, consulte Opciones de 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:

En Cloud Shell, cree un directorio de tutorial y luego cambie a él.

mkdir tutorial

cd tutorial

A continuación, ejecute el comando siguiente para clonar el repositorio de la aplicación de ejemplo en el directorio de tutorial. Después, cambie al directorio multicontainerwordpress.

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

cd multicontainerwordpress

Crear un grupo de recursos

Un grupo de recursos es un contenedor lógico en el que los recursos de Azure, como aplicaciones web, bases de datos y cuentas de almacenamiento, se implementen y administren. Por ejemplo, más adelante puede elegir eliminar todo el grupo de recursos en un solo paso.

En Cloud Shell, cree un grupo de recursos con el comando az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación Centro-sur de EE. UU. Para ver todas las ubicaciones de App Service que se admiten en Linux en el nivel Estándar, ejecute el comando az appservice list-locations --sku S1 --linux-workers-enabled.

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

Generalmente se crean el grupo de recursos y los recursos en una región cercana.

Cuando finaliza el comando, una salida de JSON muestra las propiedades del grupo de recursos.

Crear un plan de Azure App Service

En Cloud Shell, cree un plan de App Service en el grupo de recursos con el comando az appservice plan create.

En el ejemplo siguiente se crea un plan de App Service denominado myAppServicePlan en el plan de tarifa Estándar (--sku S1) y en un contenedor Linux (--is-linux).

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

Cuando se ha creado el plan de App Service, Cloud Shell muestra información similar al ejemplo siguiente:

{
  "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 contenedores de WordPress y MySQL

Creación de una aplicación de Docker Compose

En Cloud Shell, cree una aplicación web de varios contenedores en el plan de App Service myAppServicePlan con el comando az webapp create. No olvide reemplazar <app-name> por un nombre de aplicación único.

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

Cuando se haya creado la aplicación web, Cloud Shell mostrará información similar a la del ejemplo siguiente:

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

Navegación hasta la aplicación

Vaya a la aplicación implementada en (http://<app-name>.azurewebsites.net). La aplicación puede tardar unos minutos en cargarse. Si recibe un error, deje pasar unos minutos, y actualice el explorador. Si tiene problemas y desea encontrar soluciones a los mismos, consulte los registros de contenedor.

Aplicación de varios contenedores de ejemplo en Web App for Containers

Enhorabuena, ha creado una aplicación de varios contenedores en Web App for Containers. A continuación va a configurar la aplicación para usar Azure Database for MySQL. No instale aún WordPress.

Conexión a la base de datos de producción

No se recomienda utilizar contenedores de base de datos en un entorno de producción. Los contenedores locales no son escalables. En su lugar, deberá usar Azure Database for MySQL que sí se puede escalar.

Creación de un servidor de Azure Database for MySQL

Cree un servidor de Azure Database for MySQL con el comando az mysql server create.

En el siguiente comando, reemplace el nombre del servidor MySQL en el lugar en el que vea el marcador de posición <mysql-server-name> (los caracteres válidos son a-z, 0-9 y -). Este nombre forma parte del nombre de host del servidor MySQL (<mysql-server-name>.database.windows.net), por lo que es preciso que sea globalmente único.

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 creación del servidor puede tardar unos minutos en llevarse a cabo. Cuando se haya creado el servidor MySQL, Cloud Shell muestra información similar a la del siguiente ejemplo:

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

Configuración del firewall del servidor

Cree una regla de firewall para que el servidor MySQL permita conexiones de cliente con el comando az mysql server firewall-rule create. Cuando tanto la dirección IP de inicio como final están establecidas en 0.0.0.0., el firewall solo se abre para otros recursos de 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

Sugerencia

Puede ser incluso más restrictivo con su regla de firewall usando solo las direcciones IP de salida que utiliza su aplicación.

Creación de la base de datos de WordPress

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

Cuando se haya creado la base de datos, Cloud Shell muestra información similar a la del siguiente ejemplo:

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

Configuración de las variables de la base de datos de WordPress

Para conectar la aplicación de WordPress a este nuevo servidor MySQL, tendrá que configurar algunas variables de entorno específicas de WordPress, incluida la ruta de acceso de la entidad emisora de certificados SSL definida por MYSQL_SSL_CA. El Baltimore CyberTrust Root de DigiCert se proporciona en la imagen personalizada a continuación.

Para realizar estos cambios, use el comando az webapp config appsettings set en Cloud Shell. La configuración de la aplicación distingue mayúsculas de minúsculas y la separación se realiza mediante espacios.

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"

Cuando se haya creado la configuración de aplicación, Cloud Shell muestra información similar al ejemplo siguiente:

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

Para más información acerca de las variables de entorno, consulte Configuración de variables de entorno.

Uso de una imagen personalizada para TLS/SSL de MySQL y otras configuraciones

De forma predeterminada, Azure Database for MySQL usa TLS/SSL. En WordPress se necesita configuración adicional para usar TLS/SSL con MySQL. La "imagen oficial" de WordPress no proporciona la configuración adicional, pero se ha preparado una imagen personalizada para su comodidad. En la práctica, debe agregar los cambios deseados a su propia imagen.

La imagen personalizada se basa en la "imagen oficial" de WordPress de Docker Hub. Los siguientes cambios se realizaron en esta imagen personalizada para Azure Database for MySQL:

Los siguientes cambios se realizaron para Redis (para su uso en una sección posterior):

Para usar la imagen personalizada, deberá actualizar el archivo docker-compose-wordpress.yml. En Cloud Shell, abra un editor de texto y cambie image: wordpress para usar image: mcr.microsoft.com/azuredocs/multicontainerwordpress. Ya no necesita el contenedor de la base de datos. Elimine las secciones db, environment, depends_on, y volumes del archivo de configuración. El archivo debería tener el aspecto del siguiente código:

version: '3.3'

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

Actualización de la aplicación con una configuración nueva

En Cloud Shell, vuelva a configurar la aplicación web de varios contenedores con el comando az webapp config container set. No olvide reemplazar <app-name > por el nombre de la aplicación web que creó anteriormente.

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

Cuando se haya vuelto a configurar la aplicación, Cloud Shell muestra información similar a la del ejemplo siguiente:

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

Navegación hasta la aplicación

Vaya a la aplicación implementada en (http://<app-name>.azurewebsites.net). La aplicación está ahora usando Azure Database for MySQL.

Aplicación de varios contenedores de ejemplo en Web App for Containers

Incorporación de almacenamiento persistente

La aplicación de varios contenedores se está ejecutando ahora en Web App for Containers. Sin embargo, si instala WordPress ahora y reinicia la aplicación más adelante, se encontrará con que la instalación de WordPress ha desaparecido. Esto se debe a que la configuración de Docker Compose apunta en la actualidad a una ubicación de almacenamiento dentro de su contenedor. Los archivos instalados en el contenedor no se conservan más allá del reinicio de la aplicación. En esta sección, va a agregar almacenamiento persistente a un contenedor de WordPress.

Configuración de las variables de entorno

Para usar el almacenamiento persistente, tendrá que habilitar este valor dentro de App Service. Para realizar este cambio, use el comando az webapp config appsettings set en Cloud Shell. La configuración de la aplicación distingue mayúsculas de minúsculas y la separación se realiza mediante espacios.

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

Cuando se haya creado la configuración de aplicación, Cloud Shell muestra información similar al ejemplo siguiente:

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

Modificación del archivo de configuración

En Cloud Shell, abra el archivo docker-compose-wordpress.yml en un editor de texto.

La opción volumes asigna el sistema de archivos a un directorio dentro del contenedor. ${WEBAPP_STORAGE_HOME} es una variable de entorno en App Service que se asigna al almacenamiento persistente para la aplicación. Deberá usar esta variable de entorno en la opción de volúmenes para que los archivos de WordPress se instalen en el almacenamiento persistente en lugar del contenedor. Realice las modificaciones siguientes en el archivo:

En la sección wordpress, agregue una opción volumes para que tenga un aspecto como el del siguiente código:

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

Actualización de la aplicación con una configuración nueva

En Cloud Shell, vuelva a configurar la aplicación web de varios contenedores con el comando az webapp config container set. No olvide reemplazar <app-name> por un nombre de aplicación único.

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

Una vez que el comando se ejecute, muestra un resultado similar al ejemplo siguiente:

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

Navegación hasta la aplicación

Vaya a la aplicación implementada en (http://<app-name>.azurewebsites.net).

El contenedor de WordPress está utilizando Azure Database for MySQL y almacenamiento persistente.

Incorporación del contenedor de Redis

La "imagen oficial" de WordPress no incluye las dependencias para Redis. Estas dependencias y la configuración adicional necesaria para utilizar Redis con WordPress se han preparado para usted en esta imagen personalizada. En la práctica, debe agregar los cambios deseados a su propia imagen.

La imagen personalizada se basa en la "imagen oficial" de WordPress de Docker Hub. En esta imagen personalizada para Redis se han realizado los siguientes cambios:

Agregue el contenedor de Redis a la parte inferior del archivo de configuración para que se parezca al siguiente ejemplo:

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

Configuración de las variables de entorno

Para usar Redis, tendrá que habilitar este valor, WP_REDIS_HOST, dentro de App Service. Se trata de un valor obligatorio para que WordPress se comunique con el host de Redis. Para realizar este cambio, use el comando az webapp config appsettings set en Cloud Shell. La configuración de la aplicación distingue mayúsculas de minúsculas y la separación se realiza mediante espacios.

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

Cuando se haya creado la configuración de aplicación, Cloud Shell muestra información similar al ejemplo siguiente:

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

Actualización de la aplicación con una configuración nueva

En Cloud Shell, vuelva a configurar la aplicación web de varios contenedores con el comando az webapp config container set. No olvide reemplazar <app-name> por un nombre de aplicación único.

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

Una vez que el comando se ejecute, muestra un resultado similar al ejemplo siguiente:

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

Navegación hasta la aplicación

Vaya a la aplicación implementada en (http://<app-name>.azurewebsites.net).

Complete los pasos e instale WordPress.

Conexión de WordPress a Redis

Inicie sesión en el administrador de WordPress. En el panel de navegación izquierdo, seleccione Pluginsy, a continuación, Plugins instalados.

Selección Plugins de WordPress

Mostrar todos los complementos aquí

En la página Plugins, busque Redis Object Cache y haga clic en Activar.

Activación de Redis

Haga clic en Configuración.

Haga clic en Configuración

Haga clic en el botón Enable Object Cache.

Haga clic en el botón

WordPress se conecta al servidor de Redis. El estado de la conexión aparece en la misma página.

WordPress se conecta al servidor Redis. El estado de conexión aparece en la misma página.

Enhorabuena, ha conectado WordPress a Redis. La aplicación preparada para el entorno de producción está utilizando ahora Azure Database for MySQL, el almacenamiento persistente y Redis. Ahora puede escalar horizontalmente su Plan de App Service para varias instancias.

Búsqueda de registros de Docker Container

Si experimenta problemas utilizando varios contenedores, puede acceder a los registros de contenedor a través de: https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Verá un resultado similar al del siguiente ejemplo:

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

Verá un registro para cada contenedor y un registro adicional para el proceso primario. Copie el respectivo valor href en el explorador para ver el registro.

Limpieza de la implementación

Después de ejecutar el script de ejemplo, se puede usar el comando siguiente para quitar el grupo de recursos y todos los recursos asociados.

az group delete --name myResourceGroup

Pasos siguientes

En este tutorial, ha aprendido a:

  • Convertir una configuración de Docker Compose para trabajar con Web App for Containers
  • Implementar una aplicación de varios contenedor en Azure
  • Agregar la configuración de la aplicación
  • Utilizar el almacenamiento persistente para los contenedores
  • Conexión a Azure Database for MySQL
  • Solución de errores

Pase al tutorial siguiente para aprender a proteger la aplicación con un dominio personalizado y un certificado.

O bien, eche un vistazo a otros recursos: