Desplegar aplicaciones multi-contenedor en Azure Container Instances

El otro día te mostré un ejemplo bastante sencillo sobre Azure Container Instances, donde desplegaba un único contenedor a través de un Azure CLI de usar y tirar. En este post quiero que veas que aquí también es posible desplegar aplicaciones multi-contenedor.

Definición de tus contenedores en ACI mediante YAML

La forma más cómoda de desplegar una aplicación es, sin duda, a través de YAML. En esta demo tengo dos contenedores: una aplicación con React.js, que hace de front end, y una API, que hace de back end, en Node.js. El front end escucha por el puerto 3000 y el back end por el 3001. Teniendo en cuenta esto, mi archivo YAML sería de la siguiente manera:

apiVersion: 2018-10-01
location: northeurope
name: 911scenarioaci
properties:
  containers:
  - name: frontend    
    properties:
      image: ACR_NAME.azurecr.io/911frontend
      environmentVariables:
          - name: 'REACT_APP_API_URL'
            value: 'http://YOUR_DNS_NAME.northeurope.azurecontainer.io:3001/api'
      resources:
        requests:
          cpu: 1
          memoryInGb: 1.5
      ports:
      - port: 3000
  - name: backend
    properties:
      image: YOUR_DNS_NAME.azurecr.io/911backend
      resources:
        requests:
          cpu: 1
          memoryInGb: 1.5
      ports:
      - port: 3001
  osType: Linux
  ipAddress:
    type: Public
    dnsNameLabel: YOUR_DNS_NAME
    ports:
    - protocol: tcp
      port: '3000'
    - protocol: tcp
      port: '3001'
  imageRegistryCredentials:
  - server: ACR_NAME.azurecr.io
    username: ACR_USER_NAME
    password: ACR_PASSWORD
tags: null
type: Microsoft.ContainerInstance/containerGroups

Lo primero que debo especificar es la versión de la API, que a día de hoy es la 2018-10-01 (puedes ver aquí cuál es la última versión en el momento de leer este post). También debes añadir en qué localización quieres desplegar este grupo de contenedores, así como el nombre del mismo. Después vienen las propiedades de los dos contenedores, donde se indica qué imagen quieres usar, los recursos que necesita el contenedor, así como sus puertos. En este ejemplo he utilizado imágenes privadas en Azure Container Registry y es por ello que necesito pasar como parte del archivo las credenciales del registro, a través de la propiedad imageRegistryCredentials. Como estoy haciendo uso de una aplicación React.js es necesario publicar el back end para que la misma pueda llegar a él. Si existiera una comunicación interna entre ambos contenedores sería posible hablar entre ellos a través de localhost. Por último, en el apartado ipAddress indico que la misma va a ser pública, cuál es el nombre DNS que quiero para acceder a mis contenedores, así como los puertos que necesito abrir.

Desplegar los contenedores con el archivo YAML

Para que puedas ver claro todo el proceso, he creado el siguiente script:

#Delete all images
docker rmi $(docker images -a -q)

#Build images in my docker-compose.yml file
docker-compose build

ACR_NAME=<MY_ACR_NAME>
#$ACR_NAME="<MY_ACR_NAME>" - PowerShell

#Login in my Azure Container Registry
az acr login --name ${ACR_NAME}

LOGIN_SERVER=$(az acr show --name ${ACR_NAME} --query loginServer --output tsv)
#$LOGIN_SERVER=$(az acr show --name ${ACR_NAME} --query loginServer --output tsv) - PowerShell

#tag images
docker tag 911frontend ${LOGIN_SERVER}/911frontend
docker tag 911backend ${LOGIN_SERVER}/911backend

#push images to the ACR
docker push ${LOGIN_SERVER}/911frontend
docker push ${LOGIN_SERVER}/911backend

#List images
az acr repository list --name ${ACR_NAME} --output table

RESOURCE_GROUP="Azure-Discovery-Day-Bcn"
#$RESOURCE_GROUP="Azure-Discovery-Day-Bcn" - PowerShell

#Multi-container using a file
az container create -g ${RESOURCE_GROUP} --file deploy-aci.yaml

#Delete my multi-container app
az container delete -n 911scenarioaci -g ${RESOURCE_GROUP} -y

Primero elimino todas las imágenes que tengo en mi local, genero backend y frontend, guardo el nombre de mi ACR en una variable y me conecto a él. Recupero el nombre del servidor para poder tagear las imágenes que acabo de crear y las publico en mi registro privado. Listo las imágenes que ya están publicadas y por fin despliego mi aplicación multi-container a través de az container create, donde esta vez le especifico los requisitos a través de mi archivo YAML. Por último, puedes eliminar tu grupo de contenedores con az container delete cuando termines.

¡Saludos!