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!

Bootcamp DevOps
Si tienes ganas de meterte en el área de DevOps, formo parte del
equipo de docentes del Bootcamp DevOps Lemoncode, ¿Te animas a
aprender con nosotros?