Tutorial: Implementación de un grupo de varios contenedores mediante Docker Compose

En este tutorial, usará Docker Compose para definir y ejecutar una aplicación de varios contenedores de forma local y, a continuación, implementarla como un grupo de contenedores en Azure Container Instances.

Ejecute los contenedores en Azure Container Instances a petición cuando desarrolle aplicaciones nativas en la nube y quiera cambiar sin problemas entre el desarrollo local y la implementación en la nube. La integración entre Docker y Azure habilita esta capacidad. Puede usar los comandos nativos de Docker para ejecutar una única instancia de contenedor o un grupo de varios contenedores en Azure.

Importante

No se admiten todas las características de Azure Container Instances. Proporcione comentarios sobre la integración entre Docker y Azure mediante la creación de una incidencia en el repositorio de GitHub de integración de Docker ACI.

Sugerencia

Puede usar la extensión de Docker para Visual Studio Code para obtener una experiencia integrada para desarrollar, ejecutar y administrar contenedores, imágenes y contextos.

En este artículo:

  • Creación de una instancia de Azure Container Registry
  • Clonar el código fuente de la aplicación desde GitHub
  • Usar Docker Compose para compilar una imagen y ejecutar una aplicación de varios contenedores de forma local.
  • Inserir la imagen de la aplicación en el registro de contenedor.
  • Crear un contexto de Azure para Docker.
  • Llevar la aplicación a Azure Container Instances.

Requisitos previos

Creación de una instancia de Azure Container Registry

Antes de crear el registro de contenedor, necesita un grupo de recursos en donde implementarlo. Un grupo de recursos es una colección lógica en la que se implementan y administran todos los recursos de Azure.

Para crear un grupo de recursos, use el comando az group create. En el siguiente ejemplo, se crea un grupo de recursos denominado myResourceGroup en la región eastus:

az group create --name myResourceGroup --location eastus

Cuando se haya creado el grupo de recursos, cree un registro de contenedor de Azure con el comando az acr create. El nombre del registro de contenedor debe ser único dentro de Azure y contener entre 5 y 50 caracteres alfanuméricos. Reemplace <acrName> por un nombre único para el registro:

az acr create --resource-group myResourceGroup --name <acrName> --sku Basic

Esta es la salida parcial de una nueva instancia de Azure Container Registry denominada mycontainerregistry082:

{
  "creationDate": "2020-07-16T21:54:47.297875+00:00",
  "id": "/subscriptions/<Subscription ID>/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/mycontainerregistry082",
  "location": "eastus",
  "loginServer": "mycontainerregistry082.azurecr.io",
  "name": "mycontainerregistry082",
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroup",
  "sku": {
    "name": "Basic",
    "tier": "Basic"
  },
  "status": null,
  "storageAccount": null,
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries"
}

En el resto del tutorial se hace referencia a <acrName> como marcador de posición del nombre del registro de contenedor que eligió en este paso.

Inicio de sesión en el registro de contenedor

Debe iniciar sesión en la instancia de Azure Container Registry antes de insertar imágenes en ella. Use el comando az acr login para completar la operación. Debe especificar el nombre único que eligió para el registro de contenedor cuando lo creó.

az acr login --name <acrName>

Por ejemplo:

az acr login --name mycontainerregistry082

El comando devuelve Login Succeeded una vez completado:

Login Succeeded

Obtención del código de la aplicación

La aplicación de ejemplo que se usa en este tutorial es una aplicación básica para votar. La aplicación consta de un componente web front-end y de una instancia back-end de Redis. El componente web se empaqueta en una imagen de contenedor personalizada. La instancia de Redis usa una imagen sin modificar de Docker Hub.

Use git para clonar la aplicación en su entorno de desarrollo:

git clone https://github.com/Azure-Samples/azure-voting-app-redis.git

Cambie al directorio clonado.

cd azure-voting-app-redis

En el directorio se encuentra el código fuente de la aplicación, un archivo de Docker Compose creado previamente y un archivo docker-compose.yaml.

Modificación del archivo de Docker Compose

Abra el archivo docker-compose.yaml en un editor de texto. El archivo configura los servicios azure-vote-back y azure-vote-front.

version: '3'
services:
  azure-vote-back:
    image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
    container_name: azure-vote-back
    environment:
      ALLOW_EMPTY_PASSWORD: "yes"
    ports:
        - "6379:6379"

  azure-vote-front:
    build: ./azure-vote
    image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "8080:80"

En la configuración azure-vote-front, realice los dos cambios siguientes:

  1. Actualice la propiedad image en el servicio azure-vote-front. Use como prefijo del nombre de la imagen el nombre del servidor de inicio de sesión de Azure Container Registry, <acrName>.azurecr.io. Por ejemplo, si el registro se denomina myregistry, el nombre del servidor de inicio de sesión es myregistry.azurecr.io (todo en minúsculas) y la propiedad de imagen es myregistry.azurecr.io/azure-vote-front.
  2. Cambie la asignación de ports a 80:80. Guarde el archivo.

El archivo actualizado debe ser parecido al siguiente:

version: '3'
services:
  azure-vote-back:
    image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
    container_name: azure-vote-back
    environment:
      ALLOW_EMPTY_PASSWORD: "yes"
    ports:
        - "6379:6379"

  azure-vote-front:
    build: ./azure-vote
    image: myregistry.azurecr.io/azure-vote-front
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "80:80"

Al realizar estas sustituciones, la imagen de azure-vote-front que se crea en el paso siguiente se etiqueta para Azure Container Registry y se puede extraer para ejecutarse en Azure Container Instances.

Sugerencia

No tiene que usar Azure Container Registry para este escenario. Por ejemplo, puede elegir un repositorio privado en Docker Hub para hospedar la imagen de la aplicación. Si elige un registro diferente, actualice la propiedad de imagen correctamente.

Ejecución local de una aplicación de varios contenedores

Ejecute el archivo docker-compose up, que usa el archivo docker-compose.yaml para compilar la imagen de contenedor, descargue la imagen de Redis e inicie la aplicación:

docker-compose up --build -d

Cuando haya finalizado, use el comando docker images para ver las imágenes creadas. Se han descargado o creado tres imágenes. La imagen azure-vote-front contiene la aplicación de front-end y usa la imagen uwsgi-nginx-flask como base. La imagen redis se usa para iniciar una instancia de Redis.

$ docker images

REPOSITORY                                TAG        IMAGE ID            CREATED             SIZE
myregistry.azurecr.io/azure-vote-front    latest     9cc914e25834        40 seconds ago      944MB
mcr.microsoft.com/oss/bitnami/redis       6.0.8      3a54a920bb6c        4 weeks ago          103MB
tiangolo/uwsgi-nginx-flask                python3.6  788ca94b2313        9 months ago        9444MB

Ejecute el comando docker ps para ver los contenedores en ejecución:

$ docker ps

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
82411933e8f9        myregistry.azurecr.io/azure-vote-front     "/entrypoint.sh /sta…"   57 seconds ago      Up 30 seconds       443/tcp, 0.0.0.0:80->80/tcp   azure-vote-front
b62b47a7d313        mcr.microsoft.com/oss/bitnami/redis:6.0.8  "/opt/bitnami/script…"   57 seconds ago      Up 30 seconds       0.0.0.0:6379->6379/tcp          azure-vote-back

Para ver la aplicación en ejecución, escriba http://localhost:80 en un explorador web local. Se carga la aplicación de ejemplo, como se muestra en el ejemplo siguiente:

Imagen de la aplicación de votación

Después de probar la aplicación local, ejecute docker-compose down para detener la aplicación y quitar los contenedores.

docker-compose down

Inserción de imágenes en Container Registry

Para implementar la aplicación en Azure Container Instances, es preciso que inserte la imagen de azure-vote-front en el registro de contenedor. Ejecute docker-compose push para insertar la imagen:

docker-compose push

La inserciones en el registro puede tardar unos minutos.

Para comprobar que la imagen está almacenada en el registro, ejecute el comando az acr repository show:

az acr repository show --name <acrName> --repository azure-vote-front

Creación de un contexto de Azure

Para usar los comandos de Docker para ejecutar contenedores en Azure Container Instances, primero inicie sesión en Azure:

docker login azure

Cuando se le solicite, escriba o seleccione sus credenciales de Azure.

Cree un contexto ACI; para ello, ejecute docker context create aci. Este contexto asocia Docker con una suscripción de Azure y un grupo de recursos para que pueda crear y administrar las instancias de contenedor. Por ejemplo, para crear un contexto llamado myacicontext:

docker context create aci myacicontext

Cuando se le solicite, seleccione el id. de suscripción de Azure y después seleccione un grupo de recursos existente o cree un nuevo grupo de recursos. Si elige un nuevo grupo de recursos, se creará con un nombre generado por el sistema. Las instancias de contenedores de Azure, al igual que otros recursos de Azure, se deben implementar en un grupo de recursos. Los grupos de recursos le permiten organizar y administrar los recursos relacionados de Azure.

Ejecute docker context ls para confirmar que agregó el contexto de ACI a los contextos de Docker:

docker context ls

Implementación de una aplicación en Azure Container Instances

A continuación, cambie al contexto de ACI. Los comandos de Docker subsiguientes se ejecutarán en este contexto.

docker context use myacicontext

Ejecute docker compose up para iniciar la aplicación en Azure Container Instances. La imagen de azure-vote-front se extrae del registro de contenedor y el grupo de contenedores se crea en Azure Container Instances.

docker compose up

Nota

Los comandos de Docker Compose disponibles actualmente en un contexto de ACI son docker compose up y docker compose down. No hay ningún guion entre docker y compose en estos comandos.

En poco tiempo, se implementa el grupo de contenedores. Salida del ejemplo:

[+] Running 3/3
 ⠿ Group azurevotingappredis  Created                          3.6s
 ⠿ azure-vote-back            Done                             10.6s
 ⠿ azure-vote-front           Done                             10.6s

Ejecute docker ps para ver los contenedores en ejecución y la dirección IP asignada al grupo de contenedores.

docker ps

Salida del ejemplo:

CONTAINER ID                           IMAGE                                         COMMAND             STATUS              PORTS
azurevotingappredis_azure-vote-back    mcr.microsoft.com/oss/bitnami/redis:6.0.8                         Running             52.179.23.131:6379->6379/tcp
azurevotingappredis_azure-vote-front   myregistry.azurecr.io/azure-vote-front                            Running             52.179.23.131:80->80/tcp

Para ver la aplicación en ejecución en la nube, escriba la dirección IP mostrada en un explorador web local. En este ejemplo, escriba 52.179.23.131. Se carga la aplicación de ejemplo, como se muestra en el ejemplo siguiente:

Imagen de la aplicación de votación en ACI

Para ver los registros del contenedor de front-end, ejecute el comando docker logs. Por ejemplo:

docker logs azurevotingappredis_azure-vote-front

También puede usar Azure Portal u otras herramientas de Azure para ver las propiedades y el estado del grupo de contenedores que ha implementado.

Cuando termine de probar la aplicación, detenga la aplicación y los contenedores con docker compose down:

docker compose down

Este comando elimina el grupo de contenedores de Azure Container Instances.

Pasos siguientes

En este tutorial, ha usado Docker Compose para pasar de ejecutar una aplicación de varios contenedores localmente a ejecutarla en Azure Container Instances. Ha aprendido a:

  • Creación de una instancia de Azure Container Registry
  • Clonar el código fuente de la aplicación desde GitHub
  • Usar Docker Compose para compilar una imagen y ejecutar una aplicación de varios contenedores de forma local.
  • Inserir la imagen de la aplicación en el registro de contenedor.
  • Crear un contexto de Azure para Docker.
  • Llevar la aplicación a Azure Container Instances.

También puede usar la extensión de Docker para Visual Studio Code para obtener una experiencia integrada para desarrollar, ejecutar y administrar contenedores, imágenes y contextos.

Si quiere aprovechar más características de Azure Container Instances, use las herramientas de Azure para especificar un grupo de varios contenedores. Por ejemplo, consulte los tutoriales para implementar un grupo de contenedores mediante la CLI de Azure con un archivo YAML, o bien realice la implementación con una plantilla de Azure Resource Manager.