Configuración de Docker - AWS Elastic Beanstalk

Configuración de Docker

En esta sección se describe cómo preparar su imagen y contenedor Docker y para implementarlos en Elastic Beanstalk.

Entorno de Docker con Docker Compose

En esta sección se describe cómo preparar su imagen y contenedor Docker y para implementarlos en Elastic Beanstalk. Cualquier aplicación web que implemente en Elastic Beanstalk en un entorno de Docker debe incluir un archivo docker-compose.yml si también utiliza la herramienta Docker Compose. Puede implementar su aplicación web como un servicio en contenedor en Elastic Beanstalk realizando una de las siguientes acciones:

  • Cree un archivo docker-compose.yml para implementar una imagen de Docker de un repositorio alojado en Elastic Beanstalk. No se requieren otros archivos si todas las implementaciones provienen de imágenes de repositorios públicos. (Si la implementación debe provenir de una imagen de un repositorio privado, debe incluir archivos de configuración adicionales para la autenticación. Para obtener más información, consulte Utilizar imágenes de un repositorio privado). Para obtener más información sobre el archivo docker-compose.yml, consulte Compose file reference en el sitio web de Docker.

  • Cree un Dockerfile para que Elastic Beanstalk cree y ejecute una imagen personalizada. Este archivo es opcional y depende de los requisitos de implementación. Para obtener más información acerca de Dockerfile, consulte Dockerfile reference (Referencia de Dockerfile) en el sitio web de Docker.

  • Cree un archivo .zip que contenga los archivos de la aplicación, todas las dependencias de los archivos de la aplicación, el archivo Dockerfile y el archivo docker-compose.yml. Si utiliza la CLI de EB para implementar la aplicación, se creará un archivo .zip automáticamente. Los dos archivos deben estar en la raíz, o en el nivel superior, del archivo .zip.

    Si utiliza únicamente un archivo docker-compose.yml para implementar la aplicación, no es necesario crear un archivo .zip.

Este tema es una referencia de sintaxis. Para obtener procedimientos detallados sobre el inicio de entornos Docker mediante Elastic Beanstalk, consulte Uso de la plataforma Docker.

Para obtener más información sobre Docker Compose y cómo instalarlo, consulte los sitios de Docker Overview of Docker Compose e Install Docker Compose.

nota

Si no usa Docker Compose para configurar sus entornos de Docker, tampoco debe usar el archivo docker-compose.yml. En su lugar, utilice el archivo Dockerrun.aws.json, Dockerfile o ambos.

Para obtener más información, consulte Configuración de plataformas de Docker (sin Docker Compose) .

Uso de imágenes de un repositorio privado

Elastic Beanstalk debe autenticarse con el registro en línea que aloja el repositorio privado antes de que pueda extraer e implementar las imágenes de un repositorio privado. Tiene dos opciones para almacenar y recuperar las credenciales de su entorno de Elastic Beanstalk para la autenticación en un repositorio.

  • El almacén de parámetros AWS Systems Manager (SSM)

  • El archivo Dockerrun.aws.json v3

Puede configurar Elastic Beanstalk para que inicie sesión en su repositorio privado antes de que inicie el proceso de implementación. Esto permite a Elastic Beanstalk acceder a las imágenes desde el repositorio e implementar estas imágenes en su entorno Elastic Beanstalk.

Esta configuración inicia eventos en la fase de precompilación del proceso de implementación de Elastic Beanstalk. Esto se configura en el directorio de configuración .ebextentions. La configuración utiliza scripts de enlace de plataforma que llaman a docker login para la autenticación en el registro en línea que aloja el repositorio privado. A continuación, se presenta un desglose detallado de estos pasos de configuración.

Para configurar Elastic Beanstalk para que se autentique en su repositorio privado con SSM AWS

nota

Debe configurar AWS Systems Manager para realizar estos pasos. Para obtener más información, consulte la AWS Systems Manager User Guide.

  1. Cree su estructura de directorios .ebextensions de la siguiente manera.

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. Utilice el almacén de parámetros AWS Systems Manager para guardar las credenciales de su repositorio privado para que Elastic Beanstalk pueda recuperarlas cuando sea necesario. Para ello, ejecute el comando put-parameter.

    aws ssm put-parameter --name USER --type String —value "username" aws ssm put-parameter --name PASSWD --type String —value "passwd"
  3. Cree el siguiente archivo env.config y colóquelo en el directorio .ebextensions como se muestra en la estructura de directorios anterior.

    nota

    USER y PASSWD en el script deben coincidir con las mismas cadenas que se utilizan en los comandos ssm put-parameter anteriores.

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:ssm:USER:1}}' PASSWD: '{{resolve:ssm:PASSWD:1}}'
  4. Cree el siguiente archivo de script 01loging.sh y colóquelo en los siguientes directorios (también se muestra en la estructura de directorios anterior):

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash USER=/opt/elasticbeanstalk/bin/get-config environment -k USER PASSWD=/opt/elasticbeanstalk/bin/get-config environment -k PASSWD docker login -u $USER -p $PASSWD

    El script 01loging.sh llama primero a la herramienta get-config para recuperar las credenciales del repositorio y, a continuación, llama a docker login para autenticarse en el repositorio.

    Notes
    • Todos los archivos de script deben tener permiso de ejecución. Utilice chmod +x para configurar el permiso de ejecución de los archivos de enlace.

    • Los archivos de enlace pueden ser archivos binarios o archivos de script y deben comenzar con una línea #! que contenga la ruta del intérprete, como #!/bin/bash.

    • Para obtener más información, consulte Enlaces de la plataforma en Ampliación de plataformas Linux de Elastic Beanstalk.

Cuando Elastic Beanstalk pueda autenticarse con el registro en línea que aloja el repositorio privado, se podrán implementar y extraer sus imágenes.

En esta sección se describe otro enfoque para que Elastic Beanstalk se autentique en un repositorio privado. Con este enfoque, se genera un archivo de autenticación con el comando Docker y, a continuación, se carga el archivo de autenticación en un bucket de Amazon S3. También debe incluir la información del bucket en el archivo Dockerrun.aws.json v3.

Para generar y proporcionar un archivo de autenticación a Elastic Beanstalk

  1. Genere un archivo de autenticación con el comando docker login. En el caso de los repositorios de Docker Hub, ejecute docker login:

    $ docker login

    En el caso de otros registros, incluya la URL del servidor del registro:

    $ docker login registry-server-url
    nota

    Si su entorno de Elastic Beanstalk utiliza la versión de la plataforma Docker AMI de Amazon Linux (precede a Amazon Linux 2), lea la información relevante en Configuración de Docker en la AMI de Amazon Linux (anterior a Amazon Linux 2).

    Para obtener más información sobre el archivo de autenticación, consulte Store images on Docker Hub y docker login en el sitio web de Docker.

  2. Cargue una copia del archivo de autenticación denominado .dockercfg en un bucket de Amazon S3 seguro.

    • El bucket de Amazon S3 debe estar alojado en la misma Región de AWS que el entorno que lo está utilizando. Elastic Beanstalk no puede descargar archivos desde un bucket de Amazon S3 alojado en otras regiones.

    • Conceda permisos para la operación s3:GetObject al rol de IAM en el perfil de instancia. Para obtener más información, consulte Administración de perfiles de instancia de Elastic Beanstalk.

  3. Incluya la información del bucket de Amazon S3 en el parámetro Authentication en el archivo Dockerrun.aws.json v3.

    A continuación, se muestra un ejemplo de un archivo Dockerrun.aws.json v3.

    { "AWSEBDockerrunVersion": "3", "Authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" } }
    nota

    El parámetro AWSEBDockerrunVersion indica la versión del archivo Dockerrun.aws.json.

    • La plataforma de Docker Amazon Linux 2 utiliza el archivo Dockerrun.aws.json v3 para los entornos que usan Docker Compose. Utiliza el archivo Dockerrun.aws.json v1 para los entornos que no usan Docker Compose.

    • La plataforma de la AMI Multicontainer Docker de Amazon Linux utiliza el archivo Dockerrun.aws.json v2.

Cuando Elastic Beanstalk pueda autenticarse con el registro en línea que aloja el repositorio privado, se podrán implementar y extraer sus imágenes.

Creación de imágenes personalizadas con un Dockerfile

Tendrá que crear un archivo Dockerfile si aún no dispone de una imagen alojada en un repositorio.

El siguiente fragmento es un ejemplo del archivo Dockerfile. Cuando siga las instrucciones de Uso de la plataforma Docker, podrá cargar este archivo Dockerfile tal como está escrito. Elastic Beanstalk ejecuta el juego 2048 cuando se utiliza este Dockerfile.

FROM ubuntu:12.04 RUN apt-get update RUN apt-get install -y nginx zip curl RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip EXPOSE 80 CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]

Para obtener más información sobre las instrucciones que puede incluir en el archivo Dockerfile, consulte la referencia de Dockerfile en el sitio web de Docker.

Configuración de plataformas de Docker (sin Docker Compose)

Si su entorno de Docker en Elastic Beanstalk no utiliza Docker Compose, consulte la información adicional de las secciones siguientes.

Cualquier aplicación web que se implemente en Elastic Beanstalk en un entorno de Docker debe incluir un archivo Dockerfile o Dockerrun.aws.json. Puede implementar su aplicación web desde un contenedor de Docker en Elastic Beanstalk realizando alguna de las siguientes acciones:

  • Cree un Dockerfile para que Elastic Beanstalk cree y ejecute una imagen personalizada.

  • Cree un archivo Dockerrun.aws.json para implementar una imagen de Docker de un repositorio alojado en Elastic Beanstalk.

  • Cree un archivo .zip que contenga los archivos de la aplicación, todas las dependencias de los archivos de la aplicación, el archivo Dockerfile y el archivo Dockerrun.aws.json. Si utiliza la CLI de EB para implementar la aplicación, se creará un archivo .zip automáticamente.

    Si utiliza únicamente un archivo Dockerfile o solo un archivo Dockerrun.aws.json para implementar la aplicación, no es necesario comprimir el archivo en un archivo .zip.

Este tema es una referencia de sintaxis. Para obtener información detallada sobre cómo iniciar entornos de Docker, consulte Uso de la plataforma Docker.

Secciones

    Un archivo Dockerrun.aws.json describe cómo implementar una imagen remota de Docker como una aplicación de Elastic Beanstalk. Este archivo JSON es específico de Elastic Beanstalk. Si la aplicación se ejecuta en una imagen que está disponible en un repositorio alojado, puede especificar la imagen en un archivo Dockerrun.aws.json v1 y omitir el archivo Dockerfile.

    Las claves y los valores válidos para el archivo Dockerrun.aws.json v1 se definen con las siguientes operaciones:

    AWSEBDockerrunVersion

    (Obligatorio) Especifica el número de versión como el valor 1 para entornos Docker de un solo contenedor.

    Autenticación

    (Obligatorio solo para repositorios privados) Especifica el objeto de Amazon S3 que almacena el archivo .dockercfg.

    Consulte Uso de imágenes de un repositorio privado.

    Imagen

    Especifica la imagen base de Docker en un repositorio Docker existente desde el que va a crear un contenedor Docker. Especifique el valor de la clave Name (Nombre) con el formato <organización>/nombre de imagen> para las imágenes de Docker Hub o <sitio>/nombre de organización>/<nombre de imagen> para otros sitios.

    Cuando especifica una imagen en el archivo Dockerrun.aws.json, cada instancia del entorno de Elastic Beanstalk ejecuta docker pull para ejecutar la imagen. Si lo desea, incluya la clave Update (Actualizar). El valor predeterminado es true e indica a Elastic Beanstalk que consulte el repositorio, inserte las actualizaciones en la imagen y sobrescriba las imágenes en caché.

    Cuando utilice un archivo Dockerfile, no especifique la clave Image en el archivo Dockerrun.aws.json. &AEB; siempre crea y usa la imagen descrita en el archivo Dockerfile si hay alguna.

    Puertos

    (Obligatorio si especifica la clave Image) Muestra los puertos que se exponen en el contenedor Docker. &AEB; usa el valor ContainerPort para conectar el contenedor Docker al proxy inverso que se ejecuta en el host.

    Puede especificar varios puertos de contenedor, pero Elastic Beanstalk solo utiliza el primer puerto. Utiliza este puerto para conectar el contenedor al proxy inverso del host y para enrutar las solicitudes de la Internet pública. Si utiliza un archivo Dockerfile, el primer valor ContainerPort debe coincidir con la primera entrada de la lista EXPOSE de Dockerfile.

    Si lo desea, puede especificar una lista de puertos en HostPort. Las entradas de HostPort especifican los puertos de host a los que están asignados los valores ContainerPort. Si no especifica un valor HostPort, se usa de forma predeterminada el valor ContainerPort.

    { "Image": { "Name": "image-name" }, "Ports": [ { "ContainerPort": 8080, "HostPort": 8000 } ] }
    Volúmenes

    Asigne volúmenes de una instancia EC2 a su contenedor Docker. Especifique una o varias matrices de volúmenes que desee asignar.

    { "Volumes": [ { "HostDirectory": "/path/inside/host", "ContainerDirectory": "/path/inside/container" } ] ...
    Registro

    Especifique el directorio dentro del contenedor en el que la aplicación escribe los registros. Elastic Beanstalk carga todos los registros de este directorio en Amazon S3 cuando solicita registros de cola o paquete. Si rota los logs en una carpeta con el nombre rotated dentro de este directorio, también puede configurar Elastic Beanstalk para que cargue los logs rotados en Amazon S3 para su almacenamiento permanente. Para obtener más información, consulte Visualización de registros de instancias de Amazon EC2 en su entorno de Elastic Beanstalk.

    Comando

    Especifique un comando para ejecutarlo en el contenedor. Si especifica un punto de entrada y, a continuación, se añade Command (Comando) como argumento en el punto de entrada. Para obtener más información, consulte CMD en la documentación de Docker.

    Punto de entrada

    Especifique un comando predeterminado para ejecutarse cuando se inicia el contenedor. Para obtener más información, consulte ENTRYPOINT en la documentación de Docker.

    El siguiente fragmento es un ejemplo que ilustra la sintaxis del archivo Dockerrun.aws.json para un solo contenedor.

    { "AWSEBDockerrunVersion": "1", "Image": { "Name": "janedoe/image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx", "Entrypoint": "/app/bin/myapp", "Command": "--argument" }

    Puede proporcionar a Elastic Beanstalk solo el archivo Dockerrun.aws.json o un archivo .zip que contenga los archivos Dockerrun.aws.json y Dockerfile. Cuando proporciona ambos archivos, el archivo Dockerfile describe la imagen de Docker y el archivo Dockerrun.aws.json proporciona información adicional para la implementación tal y como se describe más adelante en esta sección.

    nota

    Los dos archivos deben estar en la raíz, o en el nivel superior, del archivo .zip. No cree el archivo de almacenamiento desde un directorio que contenga los archivos. En lugar de ello, desplácese hasta ese directorio y cree allí el archivo de almacenamiento.

    Cuando proporcione ambos archivos, no especifique una imagen en el archivo Dockerrun.aws.json. Elastic Beanstalk crea y usa la imagen descrita en Dockerfile e ignora la imagen especificada en el archivo Dockerrun.aws.json.

    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 v1. 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 de AWS que el entorno que lo está utilizando. Elastic Beanstalk no descarga archivos de 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.

    El siguiente ejemplo muestra el uso de un archivo de autenticación denominado mydockercfg en un bucket denominado DOC-EXAMPLE-BUCKET para utilizar una imagen privada de un registro de terceros.

    { "AWSEBDockerrunVersion": "1", "Authentication": { "Bucket": "DOC-EXAMPLE-BUCKET", "Key": "mydockercfg" }, "Image": { "Name": "quay.io/johndoe/private-image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx" }