Configuración de Docker administrado por ECS - AWS Elastic Beanstalk

Configuración de Docker administrado por ECS

Un archivo Dockerrun.aws.json es un archivo JSON específico de Elastic Beanstalk que describe cómo implementar un conjunto de contenedores Docker como una aplicación de Elastic Beanstalk. Puede utilizar un archivo Dockerrun.aws.json de la v2 para un entorno Docker administrado por ECS.

Dockerrun.aws.json describe los contenedores que se van a implementar en cada instancia de contenedor (instancia Amazon EC2 que aloja contenedores de Docker) del entorno, así como los volúmenes de datos que se van a crear en la instancia del host para los contenedores que se van a montar.

Se puede usar un archivo Dockerrun.aws.json tal como está o incluirlo en un solo archivo junto con el código fuente adicional. El código fuente archivado con un Dockerrun.aws.json se implementa en instancias de contenedor de Amazon EC2; y está accesible en el directorio /var/app/current/. Utilice la sección volumes del archivo de configuración para proporcionar volúmenes de archivo para los contenedores de Docker que se ejecutan en la instancia del host. Utilice la sección mountPoints de las definiciones de contenedor integradas para mapear estos volúmenes a puntos de montaje que pueden utilizar las aplicaciones de los contenedores de Docker.

Dockerrun.aws.json v2

El archivo Dockerrun.aws.json incluye tres secciones:

AWSEBDockerrunVersion

Especifica el número de versión como el valor 2 para los entornos Docker administrados por ECS.

containerDefinitions

Una matriz de definiciones de contenedor, detalladas a continuación.

volumes

Crea volúmenes a partir de carpetas de la instancia de contenedor de Amazon EC2 o a partir del paquete de código fuente (implementado en /var/app/current). Monte estos volúmenes en rutas que estén dentro de los contenedores de Docker utilizando mountPoints en la definición de contenedor.

nota

Elastic Beanstalk configura volúmenes adicionales para los logs, uno para cada contenedor. Estos los deben montar los contenedores de Docker para poder escribir logs en la instancia del host. Para obtener más información, consulte Formato de definición de contenedor.

Los volúmenes se especifican en el siguiente formato:

"volumes": [ { "name": "volumename", "host": { "sourcePath": "/path/on/host/instance" } } ],
autenticación

(opcional) La ubicación en Amazon S3 de un archivo .dockercfg que contiene los datos de autenticación de un repositorio privado. Usa el siguiente formato:

"authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" },

Para obtener más información, consulte Uso de imágenes de un repositorio privado.

El siguiente fragmento es un ejemplo que ilustra la sintaxis del archivo Dockerrun.aws.json para una instancia con dos contenedores.

{ "AWSEBDockerrunVersion": 2, "volumes": [ { "name": "php-app", "host": { "sourcePath": "/var/app/current/php-app" } }, { "name": "nginx-proxy-conf", "host": { "sourcePath": "/var/app/current/proxy/conf.d" } } ], "containerDefinitions": [ { "name": "php-app", "image": "php:fpm", "environment": [ { "name": "Container", "value": "PHP" } ], "essential": true, "memory": 128, "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "nginx-proxy", "image": "nginx", "essential": true, "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80 } ], "links": [ "php-app" ], "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "nginx-proxy-conf", "containerPath": "/etc/nginx/conf.d", "readOnly": true }, { "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" } ] } ] }

Uso de imágenes de un repositorio privado

Añada la información sobre el bucket de Amazon S3; que contiene el archivo de autenticación en el parámetro authentication del archivo Dockerrun.aws.json. Asegúrese de que el parámetro authentication contiene un bucket de Amazon S3 y una clave válidos. El bucket de Amazon S3; debe estar alojado en la misma región que el entorno que lo está utilizando. Elastic Beanstalk no descargará archivos de los buckets de Amazon S3 alojados en otras regiones.

Para obtener información sobre cómo generar y cargar el archivo de autenticación, consulte Uso de imágenes de un repositorio privado.

Formato de definición de contenedor

Las secciones de definición de contenedor y volúmenes de Dockerrun.aws.json utilizan el mismo formato que las secciones correspondientes de un archivo de definición de tareas de Amazon ECS.

Los siguientes ejemplos muestran un subconjunto de parámetros que se utilizan habitualmente. Hay disponibles otros parámetros opcionales. Para obtener más información sobre el formato de definición de tarea y una lista completa de los parámetros de definición de tareas, consulte Amazon ECS Task Definitions (Definiciones de tareas de Amazon ECS) en Amazon Elastic Container Service Developer Guide (Guía para el desarrollador del servicio de contenedores de Amazon Elastic).

Un archivo Dockerrun.aws.json contiene una matriz de uno o varios objetos de definición de contenedor con los siguientes campos:

name

El nombre del contenedor. Consulte Standard Container Definition Parameters (Parámetros de definición de contenedores estándar) para obtener información sobre la longitud máxima y los caracteres permitidos.

image

El nombre de una imagen de Docker en un repositorio Docker insertado desde el que va a crear un contenedor Docker. Tenga en cuenta estas convenciones:

  • Las imágenes de los repositorios oficiales de Docker Hub utilizan un solo nombre (por ejemplo, ubuntu o mongo).

  • Las imágenes de otros repositorios de Docker Hub se identifican con un nombre de organización (por ejemplo, amazon/amazon-ecs-agent.

  • Las imágenes de otros repositorios online se cualifican más con un nombre de dominio (por ejemplo, quay.io/assemblyline/ubuntu).

environment

Una matriz de variables de entorno que se va a pasar al contenedor.

Por ejemplo, la siguiente entrada define una variable de entorno con el nombre Container y el valor PHP:

"environment": [ { "name": "Container", "value": "PHP" } ],
essential

Es True si la tarea se debe detener si el contenedor produce un error. Los contenedores Nonessential puedan terminar o bloquearse sin que ello afecte al resto de los contenedores de la instancia.

memory

Cantidad de memoria de la instancia de contenedor que se va a reservar para el contenedor. Especifique un entero distinto de cero para uno o ambos parámetros memory o memoryReservation en las definiciones de contenedor.

memoryReservation

El límite flexible (en MiB) de memoria que reservar para el contenedor. Especifique un entero distinto de cero para uno o ambos parámetros memory o memoryReservation en las definiciones de contenedor.

mountPoints

Volúmenes de la instancia de contenedor de Amazon EC2; que se van a montar y la ubicación en el sistema de archivos del contenedor de Docker en la que se van a montar. Cuando se montan volúmenes que incluyen contenido de aplicaciones, el contenedor puede leer los datos que se cargan en el paquete de código fuente. Cuando se montan volúmenes de logs para escribir datos de log, Elastic Beanstalk puede recopilar datos de log de estos volúmenes.

Elastic Beanstalk crea volúmenes de logs en la instancia de contenedor, uno para cada contenedor de Docker, en /var/log/containers/containername. Estos volúmenes se denominan awseb-logs-containername y deben montarse en la ubicación dentro de la estructura de archivos del contenedor donde se escriben los logs.

Por ejemplo, el siguiente punto de montaje asigna la ubicación de los registros de nginx en el contenedor al volumen generado por Elastic Beanstalk para el contenedor nginx-proxy.

{ "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" }
portMappings

Asigna puertos de red del contenedor a puertos del host.

links

Lista de contenedores que se van a vincular. Los contenedores vinculados pueden detectarse entre sí y comunicarse de forma segura.

volumesFrom

Esta opción le permite montar todos los volúmenes desde un contenedor diferente. Por ejemplo, para montar volúmenes desde un contenedor con el nombre web:

"volumesFrom": [ { "sourceContainer": "web" } ],