Configuração do Docker - AWS Elastic Beanstalk

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configuração do Docker

Esta seção descreve como preparar a imagem e o contêiner do Docker para implantação no Elastic Beanstalk.

Ambiente Docker com Docker Compose

Esta seção descreve como preparar a imagem e o contêiner do Docker para implantação no Elastic Beanstalk. Qualquer aplicação Web implantada no Elastic Beanstalk em um ambiente Docker deve incluir um arquivo docker-compose.yml se você também usar a ferramenta Docker Compose. Você pode implantar seu aplicação Web como um serviço em contêineres no Elastic Beanstalk realizando uma das seguintes ações:

  • Crie um arquivo docker-compose.yml para implantar uma imagem do Docker a partir de um repositório hospedado do Elastic Beanstalk. Nenhum outro arquivo será necessário se todas as implantações forem originadas de imagens em repositórios públicos. (Se a implementação tiver origem em uma imagem de um repositório privado, será necessário incluir arquivos de configuração adicionais para autenticação. Para obter mais informações, consulte Uso de imagens de um repositório privado.) Para obter mais informações sobre o arquivo docker-compose.yml, consulte Referência de arquivo do Compose no site do Docker.

  • Crie um Dockerfile para que o Elastic Beanstalk crie e execute uma imagem personalizada. Esse arquivo é opcional, dependendo dos requisitos de implantação. Para obter mais informações sobre Dockerfile, consulte Referência do arquivo do Docker no site do Docker.

  • Crie um arquivo .zip que contém os arquivos do aplicativo, todas as dependências de arquivo do aplicativo, o Dockerfile e o arquivo docker-compose.yml. Se você usar a CLI do EB para implantar a aplicação, ela criará um arquivo .zip para você. Os dois arquivos devem estar na raiz, ou no nível superior do arquivamento .zip.

    Se você usar apenas um arquivo docker-compose.yml para implantar a aplicação, não precisará criar um arquivo .zip.

Este tópico é uma referência de sintaxe. Para obter procedimentos detalhados sobre como iniciar ambientes Docker usando o Elastic Beanstalk, consulte Usar a plataforma Docker.

Para saber mais sobre o Docker Compose e como instalá-lo, consulte Visão geral do Docker Compose e Instalar o Docker Compose no site do Docker.

nota

Se você não usar o Docker Compose para configurar seus ambientes Docker, também não deverá usar o arquivo docker-compose.yml. Em vez disso, use o arquivo Dockerrun.aws.json ou Dockerfile ou ambos.

Para obter mais informações, consulte Configuração para plataformas Docker (sem Docker Compose) .

Usar imagens de um repositório privado

O Elastic Beanstalk deve se autenticar com o registro online que hospeda o repositório privado antes de extrair e implantar as imagens de um repositório privado. Fornecemos exemplos de duas opções para armazenar e recuperar credenciais para seu ambiente Elastic Beanstalk para autenticação em um repositório.

  • A AWS Secrets Manager

  • O arquivo Dockerrun.aws.json v3

Você pode configurar o Elastic Beanstalk para fazer login no repositório privado antes que ele inicie o processo de implantação. Isso permite que o Elastic Beanstalk acesse as imagens do repositório e implante essas imagens no ambiente do Elastic Beanstalk.

Essa configuração inicia eventos na fase de pré-compilação do processo de implantação do Elastic Beanstalk. Você configurou isso no diretório de configuração .ebextentions. A configuração usa scripts de hook de plataforma que chamam docker login para autenticar no registro online que hospeda o repositório privado. Veja a seguir detalhes das etapas de configuração.

Para configurar o Elastic Beanstalk para autenticar em seu repositório privado com o AWS Secrets Manager
nota

Permissões específicas devem ser concedidas para concluir essas etapas. Para obter mais informações, consulte as referências a seguir.

  1. Crie sua estrutura de diretórios .ebextensions da seguinte forma.

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. Use o AWS Secrets Manager para salvar as credenciais do repositório privado para que o Elastic Beanstalk possa recuperar suas credenciais quando necessário. Para tanto, execute o comando AWS CLIcreate-secret do Secrets Manager.

    aws secretsmanager create-secret \ --name MyTestSecret \ --description "My image repo credentials created with the CLI." \ --secret-string "{\"USER\":\"EXAMPLE-USERNAME\",\"PASSWD\":\"EXAMPLE-PASSWORD\"}"
  3. Crie o seguinte arquivo env.config e coloque-o no diretório .ebextensions, como mostrado na estrutura de diretórios anterior. Essa configuração usa o namespace aws:elasticbeanstalk:application:environment para inicializar as variáveis de ambiente USER e PASSWD Elastic Beanstalk usando referências dinâmicas ao AWS Secrets Manager. Para obter mais informações sobre referências secretsmanager dinâmicas, consulte Recuperar um segredo AWS Secrets Manager em um recurso AWS CloudFormation no AWS Secrets ManagerGuia do usuário.

    nota

    USER e PASSWD no script devem corresponder às mesmas strings usadas no comando secretsmanager create-secret anterior.

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  4. Crie o seguinte arquivo de script 01login.sh e coloque-o nos seguintes diretórios (também mostrado na estrutura de diretórios anterior):

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

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

    O script 01login.sh chama o script de plataforma get-config para recuperar as credenciais do repositório e, em seguida, efetuar login no repositório. Ele armazena o nome do usuário no script variável USER. Na próxima linha, ele recupera a senha. Em vez de armazenar a senha em um script variável, o script envia a senha diretamente para o comando docker login no fluxo de entrada stdin. A opção --password-stdin usa o fluxo de entrada para que você não precise armazenar a senha em uma variável. Para obter mais informações sobre autenticação com a interface de linha de comando do Docker, consulte docker login (login do docker) no site da documentação do Docker.

    Observações
    • Todos os arquivos de script devem ter permissão de execução. Use chmod +x para definir a permissão de execução em seus arquivos de hook. Em todas as versões da plataforma baseadas no Amazon Linux 2 que foram lançadas a partir de 29 de abril de 2022, o Elastic Beanstalk concede automaticamente permissões de execução para todos os scripts de hook da plataforma. Nesse caso, não é necessário conceder manualmente as permissões de execução. Para obter uma lista dessas versões da plataforma, consulte as notas de versão 29 de abril de 2022 - Plataforma Linux no Guia de notas de versão do AWS Elastic Beanstalk.

    • Os arquivos de hook podem ser arquivos binários ou arquivos de script que começam com uma linha #! contendo seu caminho de interpretador, como #!/bin/bash.

    • Para obter mais informações, consulte Hooks de plataforma em Estender as plataformas do Elastic Beanstalk Linux.

Após a autenticação do Elastic Beanstalk com o registro online que hospeda o repositório privado, você pode obter e implantar suas imagens.

Esta seção descreve outra abordagem para autenticar o Elastic Beanstalk em um repositório privado. Com essa abordagem, gere um arquivo de autenticação com o comando do Docker e, depois, carregue o arquivo de autenticação em um bucket do Amazon S3. Você também deve incluir as informações do bucket no arquivo Dockerrun.aws.json v3.

Como gerar e fornecer um arquivo de autenticação ao Elastic Beanstalk
  1. Gere um arquivo de autenticação com o comando docker login. Para repositórios no Docker Hub, execute docker login:

    $ docker login

    Para outros registros, inclua o URL do servidor de registro:

    $ docker login registry-server-url
    nota

    Se o ambiente do Elastic Beanstalk usar a versão da plataforma Docker da AMI do Amazon Linux (que precede o Amazon Linux 2), leia as informações relevantes em Configuração do Docker na AMI do Amazon Linux (que precede o Amazon Linux 2).

    Para obter mais informações sobre o arquivo de autenticação, consulte Store images on Docker Hub e docker login no site do Docker.

  2. Faça upload de uma cópia do arquivo de autenticação chamado .dockercfg em um bucket do Amazon S3 seguro.

    • O bucket do Amazon S3 deve ser hospedado na mesma Região da AWS do ambiente que o está usando. O Elastic Beanstalk não pode fazer download de arquivos de um bucket do Amazon S3 hospedado em outras regiões.

    • Conceda permissões para a operação s3:GetObject à função do IAM no perfil da instância. Para obter mais informações, consulte Gerenciar perfis de instância do Elastic Beanstalk.

  3. Inclua as informações do bucket do Amazon S3 no parâmetro Authentication no arquivo Dockerrun.aws.json v3.

    Veja a seguir um exemplo de um arquivo Dockerrun.aws.json v3.

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

    O parâmetro AWSEBDockerrunVersion indica a versão do arquivo Dockerrun.aws.json.

    • A plataforma Docker do Amazon Linux 2 usa o arquivo Dockerrun.aws.json v3 para ambientes que usam o Docker Compose. Ela usa o arquivo Dockerrun.aws.json v1 para ambientes que não usam o Docker Compose.

    • A plataforma Docker de vários contêineres da AMI do Amazon Linux usa o arquivo Dockerrun.aws.json v2.

Depois que o Elastic Beanstalk puder autenticar com o registro online que hospeda o repositório privado, as imagens poderão ser implantadas e extraídas.

Criar imagens personalizadas com um Dockerfile

Será necessário criar um Dockerfile se você ainda não tiver uma imagem existente hospedada em um repositório.

O seguinte snippet é um exemplo do Dockerfile. Quando você segue as instruções em Usar a plataforma Docker, pode fazer upload deste Dockerfile como gravado. O Elastic Beanstalk executa o jogo 2048 quando você usa este Dockerfile.

Para obter mais informações sobre instruções que podem ser incluídas no Dockerfile, consulte a referência do Dockerfile no site do Docker.

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"]
nota

De um único Dockerfile, você pode executar compilações em vários estágios para produzir imagens menores com uma redução significativa de complexidade. Para obter mais informações, consulte Use multi-stage builds (Usar compilações em vários estágios) no site de documentação do Docker.

Configuração para plataformas Docker (sem Docker Compose)

Se o ambiente Docker do Elastic Beanstalk não usar o Docker Compose, leia as informações adicionais nas seções a seguir.

Qualquer aplicação Web implantada no Elastic Beanstalk em um ambiente Docker deve incluir um arquivo Dockerfile ou Dockerrun.aws.json. É possível implantar a aplicação Web de um contêiner do Docker no Elastic Beanstalk realizando uma destas ações:

  • Crie um Dockerfile para que o Elastic Beanstalk crie e execute uma imagem personalizada.

  • Crie um arquivo Dockerrun.aws.json para implantar uma imagem do Docker a partir de um repositório hospedado do Elastic Beanstalk.

  • Crie um arquivo .zip que contém os arquivos do aplicativo, todas as dependências de arquivo do aplicativo, o Dockerfile e o arquivo Dockerrun.aws.json. Se você usar a CLI do EB para implantar a aplicação, ela criará um arquivo .zip para você.

    Se você usar apenas um Dockerfile ou apenas um arquivo Dockerrun.aws.json para implantar seu aplicativo, não precisará criar um arquivo .zip.

Este tópico é uma referência de sintaxe. Para obter os procedimentos detalhados sobre como executar ambientes do Docker, consulte Usar a plataforma Docker.

Seções

    Um arquivo Dockerrun.aws.json descreve como implantar uma imagem do Docker remota como uma aplicação do Elastic Beanstalk. Este arquivo JSON é específico do Elastic Beanstalk. Se o seu aplicativo é executado em uma imagem disponível em um repositório hospedado, você pode especificar a imagem em um arquivo Dockerrun.aws.json v1 e omitir o Dockerfile.

    Chaves e valores válidos para o arquivo Dockerrun.aws.json v1 incluem as seguintes operações:

    AWSEBDockerrunVersion

    (Obrigatório) Especifica o número da versão como o valor 1 para ambientes Docker de um único contêiner.

    Autenticação

    (Obrigatório apenas para repositórios privados) Especifica o objeto do Amazon S3 que armazena o arquivo .dockercfg.

    Consulte Usar imagens de um repositório privado.

    Imagem

    Especifica a imagem de base do Docker em um repositório Docker existente do qual você está criando um contêiner do Docker. Especifique o valor da chave Name no formato <organization>/<image name> para imagens no Docker Hub ou <site>/<organization name>/<image name> para outros sites.

    Quando você especifica uma imagem no arquivo Dockerrun.aws.json, cada instância no ambiente do Elastic Beanstalk executa docker pull para executar a imagem. Opcionalmente, inclua a chave Update. O valor padrão é true e orienta o Elastic Beanstalk a verificar o repositório, enviar todas as atualizações para a imagem e substituir todas as imagens armazenadas em cache.

    Ao usar um Dockerfile, não especifique a chave Image no arquivo Dockerrun.aws.json. O Elastic Beanstalk sempre cria e usa a imagem descrita no Dockerfile quando um está presente.

    Portas

    (Obrigatório quando você especifica a chave Image) Lista as portas para expor no contêiner do Docker. O Elastic Beanstalk usa o valor ContainerPort para conectar o contêiner do Docker ao proxy reverso em execução no host.

    É possível especificar várias portas de contêiner, mas o Elastic Beanstalk usa apenas a primeira porta. Ele usa essa porta para conectar seu contêiner ao proxy reverso do host e rotear solicitações da Internet pública. Se você estiver usando um Dockerfile, o primeiro valor ContainerPort deverá corresponder à lista EXPOSE do Dockerfile.

    Opcionalmente, você pode especificar uma lista de portas em HostPort. As entradas HostPort especificam as portas de host aos quais os valores de ContainerPort são mapeados. Se você não especificar um valor HostPort, ele assumirá como padrão o valor ContainerPort.

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

    Mapeie volumes de uma instância do EC2 para o contêiner do Docker. Especifique um ou mais conjuntos de volumes para mapear.

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

    Especifique o diretório dentro do contêiner no qual a aplicação grava logs. O Elastic Beanstalk faz upload de todos os logs neste diretório para o Amazon S3 quando você solicitar logs finais ou de pacote. Se você alternar logs para uma pasta chamada rotated nesse diretório, também poderá configurar o Elastic Beanstalk para fazer upload de logs alternados para o Amazon S3 para armazenamento permanente. Para obter mais informações, consulte Visualizar logs de instâncias do Amazon EC2 no ambiente do Elastic Beanstalk.

    Comando

    Especifique um comando a ser executado no contêiner. Se você especificar um Entrypoint, Command será adicionado como um argumento para Entrypoint. Para obter mais informações, consulte CMD na documentação do Docker.

    Entrypoint

    Especifique um comando padrão a ser executado quando o contêiner for iniciado. Para obter mais informações, consulte ENTRYPOINT na documentação do Docker.

    O seguinte snippet é um exemplo que mostra a sintaxe do arquivo Dockerrun.aws.json para um único contêiner.

    { "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" }

    Você pode fornecer ao Elastic Beanstalk apenas com o arquivo Dockerrun.aws.json ou com um arquivamento .zip que contém os arquivos Dockerrun.aws.json e Dockerfile. Quando você fornece os dois arquivos, Dockerfile descreverá a imagem de Docker, e o arquivo Dockerrun.aws.json fornecerá informações adicionais para a implantação conforme descritas posteriormente nesta seção.

    nota

    Os dois arquivos devem estar na raiz, ou no nível superior do arquivamento .zip. Não crie o arquivamento em um diretório que contém os arquivos. Em vez disso, navegue para esse diretório e crie o arquivamento.

    Quando você fornecer os dois arquivos, não especifique uma imagem no arquivo Dockerrun.aws.json. O Elastic Beanstalk cria e usa a imagem descrita no Dockerfile e ignora a imagem especificada no arquivo Dockerrun.aws.json.

    Adicione as informações sobre o bucket do Amazon S3 que contém o arquivo de autenticação no parâmetro Authentication do arquivo Dockerrun.aws.json v1. Certifique-se de que o parâmetro Authentication contenha uma chave e um bucket válidos do Amazon S3. O bucket do Amazon S3 deve ser hospedado na mesma Região da AWS do ambiente que o está usando. O Elastic Beanstalk não faz download de arquivos de buckets do Amazon S3 hospedados em outras regiões.

    Para obter informações sobre a geração e o upload do arquivo de autenticação, consulte Usar imagens de um repositório privado.

    O exemplo a seguir mostra o uso de um arquivo de autenticação chamado mydockercfg em um bucket chamado DOC-EXAMPLE-BUCKET para usar uma imagem privada em um registro de terceiros.

    { "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" }