Configurazione di Docker - AWS Elastic Beanstalk

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione di Docker

In questa sezione viene descritto come preparare l'immagine e il container Docker per la loro distribuzione in Elastic Beanstalk.

Ambiente Docker con Docker Compose

In questa sezione viene descritto come preparare l'immagine e il container Docker per la loro distribuzione in Elastic Beanstalk. Qualsiasi applicazione Web distribuita su Elastic Beanstalk in un ambiente Docker deve includere un file docker-compose.yml se si utilizza anche lo strumento Docker Compose. È possibile distribuire l'applicazione Web come servizio containerizzato a Elastic Beanstalk eseguendo una delle operazioni seguenti:

  • Crea un file docker-compose.yml per distribuire un'immagine Docker su Elastic Beanstalk da un repository in hosting. Non sono necessari altri file se tutte le distribuzioni provengono da immagini presenti nei repository pubblici. (Se l'implementazione deve originare un'immagine da un repository privato, è necessario includere file di configurazione aggiuntivi per l'autenticazione. Per maggiori informazioni, consulta Utilizzo di immagini da un repository privato). Per ulteriori informazioni sul filedocker-compose.yml , consulta le informazioni di riferimento sul file Compose sul sito Web Docker.

  • Crea un file Dockerfile affinché Elastic Beanstalk crei ed esegua un'immagine personalizzata. Questo file è facoltativo, a seconda dei requisiti di distribuzione. Per ulteriori informazioni sul file Dockerfile, consulta le informazioni di riferimento su Dockerfile sul sito Web Docker.

  • Crea un file .zip contenente i file di applicazione, eventuali dipendenze dei file di applicazione, il Dockerfile e il file docker-compose.yml. Se si utilizza la CLI EB per distribuire l'applicazione, crea un .zip file per te. I due file devono essere al livello principale, o al livello superiore, dell'archivio .zip.

    Se utilizzi un solo file docker-compose.yml per distribuire l'applicazione, non devi creare un file .zip.

Questo argomento è un riferimento sulla sintassi. Per procedure dettagliate sull'avvio di ambienti Docker utilizzando Elastic Beanstalk, consulta Utilizzo della versione della piattaforma Docker.

Per ulteriori informazioni su Docker Compose e su come installarlo, vedere la sezione Panoramica dei siti Docker Compose e Installazione di Docker Compose.

Nota

Se non usi Docker Compose per configurare gli ambienti Docker, non dovresti usare nemmeno il file docker-compose.yml. Usare invece il file Dockerrun.aws.json, Dockerfile o entrambi.

Per ulteriori informazioni, consulta Configurazione per piattaforme Docker (senza Docker Compose) .

Utilizzo di immagini da un repository privato

Elastic Beanstalk deve autenticarsi con il registro online che ospita il repository privato prima che possa estrarre e distribuire le immagini da un repository privato. Forniamo esempi per due opzioni per archiviare e recuperare le credenziali per l'ambiente Elastic Beanstalk per l'autenticazione in un repository.

  • La AWS Secrets Manager

  • Il file Dockerrun.aws.json v3

È possibile configurare Elastic Beanstalk per l'accesso al repository privato prima che inizi il processo di distribuzione. Ciò consente a Elastic Beanstalk di accedere alle immagini dal repository e distribuirle nell'ambiente Elastic Beanstalk in uso.

Questa configurazione avvia gli eventi nella fase di precompilazione del processo di distribuzione di Elastic Beanstalk. È possibile impostarlo nella directory di configurazione .ebextentions . La configurazione utilizza gli script di hook della piattaforma che chiamano docker login per autenticarsi nel Registro di sistema in linea che ospita il repository privato. Segue una descrizione dettagliata di questi passaggi di configurazione.

Per configurare Elastic Beanstalk per l'autenticazione nel repository privato con AWS Secrets Manager
Nota

È necessario concedere autorizzazioni specifiche per completare questi passaggi. Per ulteriori informazioni, consulta i seguenti riferimenti:

  • Nel passaggio 2 avrai bisogno delle autorizzazioni per creare un segreto. Per ulteriori informazioni, consulta la pagina Esempio: Autorizzazione per creare segreti nella Guida per l'utente di AWS Secrets Manager .

  • Nella fase 3 sono necessarie le autorizzazioni per recuperare i segreti utilizzando riferimenti secretsmanager dinamici. Per ulteriori informazioni, consulta la pagina Esempio: Autorizzazione per recuperare valori segreti nella Guida per l'utente di AWS Secrets Manager .

  1. Creare la struttura di directory .ebextensions come segue.

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. Utilizzalo AWS Secrets Manager per salvare le credenziali del tuo repository privato in modo che Elastic Beanstalk possa recuperarle quando richiesto. Per questo, esegui il comando create-secret AWS CLI di 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. Creare il file env.config seguente e posizionarlo nella directory .ebextensions, come mostrato nella struttura di directory precedente. Questa configurazione utilizza lo spazio dei nomi aws:elasticbeanstalk:application:environment per inizializzare le variabili di ambiente di Elastic Beanstalk USERPASSWD utilizzando riferimenti dinamici a  AWS Secrets Manager. Per ulteriori informazioni sui riferimenti secretsmanager dinamici, consulta Recupera un AWS Secrets Manager segreto in una AWS CloudFormation risorsa nella Guida per l'AWS Secrets Manager utente.

    Nota

    USER e PASSWD nello script devono corrispondere alle stesse stringhe utilizzate nei comandi secretsmanager create-secret precedenti.

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  4. Creare il seguente file di script 01login.sh e inserirlo nelle seguenti directory (mostrate anche nella struttura di directory precedente):

    • .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

    Lo script 01login.sh chiama lo script della piattaforma get-config per recuperare le credenziali del repository e registrarle nel repository. Memorizza il nome utente nella variabile dello script USER. Nella riga successiva, recupera la password. Invece di memorizzare la password in una variabile dello script, questo reindirizza la password direttamente al comando docker login nel flusso di input stdin. L'opzione --password-stdin utilizza il flusso di input, quindi non è necessario memorizzare la password in una variabile. Per ulteriori informazioni sull'autenticazione con l'interfaccia a riga di comando Docker, consulta Accesso a Docker sul sito Web della documentazione Docker.

    Note
    • Tutti i file di script devono disporre del permesso di esecuzione. Utilizzare chmod +x per impostare l'autorizzazione di esecuzione sui file hook. Per tutte le versioni delle piattaforme basate su Amazon Linux 2 rilasciate il 29 aprile 2022, Elastic Beanstalk concede automaticamente le autorizzazioni di esecuzione a tutti gli script di hook della piattaforma. In questo caso non è necessario concedere manualmente le autorizzazioni di esecuzione. Per un elenco di queste versioni di piattaforma, fare riferimento alle note di rilascio del 29 aprile 2022 - piattaforma Linux nellaAWS Elastic Beanstalk Guida alle note di rilascio.

    • I file hook possono essere file binari oppure file di script che iniziano con una riga #! contenente il percorso dell'interprete, ad esempio #!/bin/bash.

    • Per maggiori informazioni, vedere Hook della piattaforma in Estensione di Elastic Beanstalk alle piattaforme Linux.

Quando Elastic Beanstalk esegue l'autenticazione con il registro online che ospita il repository privato, puoi distribuire ed estrarre le immagini.

In questa sezione viene descritto un altro approccio per l'autenticazione di Elastic Beanstalk in un repository privato. Con questo approccio, si genera un file di autenticazione con il comando Docker e quindi si carica il file di autenticazione in un bucket Amazon S3. È inoltre necessario includere le informazioni relative al bucket nel file Dockerrun.aws.json v3.

Per generare e fornire un file di autenticazione per Elastic Beanstalk
  1. Genera un file di autenticazione con il comando docker login. Per repository su Docker Hub, esegui docker login:

    $ docker login

    Per gli altri registri, includi l'URL del server di registro:

    $ docker login registry-server-url
    Nota

    Se l'ambiente Elastic Beanstalk utilizza la versione della piattaforma Docker su AMI Amazon Linux (precedente ad Amazon Linux 2), leggi le informazioni pertinenti in Configurazione Docker su AMI Amazon Linux (precedente ad Amazon Linux 2).

    Per ulteriori informazioni sul file di autenticazione, vedi Memorizzare le immagini in Docker Hub e login docker sul sito Web Docker.

  2. Carica una copia del file di autenticazione denominato .dockercfg in un bucket Amazon S3 protetto.

    • Il bucket Amazon S3 deve essere ospitato nello Regione AWS stesso ambiente che lo utilizza. Elastic Beanstalk non può scaricare file da un bucket Amazon S3 ospitato in altre regioni.

    • Concedi le autorizzazioni per l'operazione s3:GetObject al ruolo IAM nel profilo dell'istanza. Per ulteriori informazioni, consulta Gestione dei profili dell'istanza Elastic Beanstalk.

  3. Includi le informazioni sul bucket Amazon S3 nel parametro Authentication nel file Dockerrun.aws.json v3.

    Di seguito è riportato un esempio di file Dockerrun.aws.json v3.

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

    Il parametro AWSEBDockerrunVersion indica la versione del file Dockerrun.aws.json.

    • La piattaforma Docker su Amazon Linux 2 utilizza il file Dockerrun.aws.json v3 per gli ambienti che utilizzano Docker Compose. Utilizza il file Dockerrun.aws.json v1 per gli ambienti che non utilizzano Docker Compone.

    • La piattaforma Multicontainer Docker su AMI Amazon Linux utilizza il file Dockerrun.aws.json v2.

Quando Elastic Beanstalk sarà in grado di eseguire l'autenticazione con il registro online che ospita il repository privato, le immagini potranno essere distribuite ed estratte.

Creazione di immagini personalizzate con un Dockerfile

Occorre creare un Dockerfile se non si dispone già di un'immagine ospitata in un repository.

Il seguente frammento è un esempio del Dockerfile. Quando segui le istruzioni in Utilizzo della versione della piattaforma Docker, puoi caricare questo Dockerfile come indicato. Elastic Beanstalk esegue il gioco 2048 quando utilizzi questo Dockerfile.

Per ulteriori informazioni sulle istruzioni che puoi includere nel Dockerfile, consulta la documentazione di riferimento del Dockerfile sul sito Web 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

È possibile eseguire build multi-fase da un singolo Dockerfile per produrre immagini di dimensioni più piccole con una significativa riduzione della complessità. Per ulteriori informazioni, consultare Utilizzo di build multi-fase sul sito Web della documentazione Docker.

Configurazione per piattaforme Docker (senza Docker Compose)

Se l'ambiente Docker Elastic Beanstalk non utilizza Docker Compose, leggere le informazioni aggiuntive nelle sezioni seguenti.

Qualsiasi applicazione Web distribuita su Elastic Beanstalk in un ambiente Docker deve includere un file Dockerfile o Dockerrun.aws.json. Puoi distribuire l'applicazione Web da un container Docker in Elastic Beanstalk eseguendo una delle seguenti operazioni:

  • Crea un file Dockerfile affinché Elastic Beanstalk crei ed esegua un'immagine personalizzata.

  • Crea un file Dockerrun.aws.json per distribuire un'immagine Docker su Elastic Beanstalk da un repository in hosting.

  • Crea un file .zip contenente i file di applicazione, eventuali dipendenze dei file di applicazione, il Dockerfile e il file Dockerrun.aws.json. Se si utilizza la CLI EB per distribuire l'applicazione, crea un .zip file per te.

    Se utilizzi un solo file Dockerfile o Dockerrun.aws.json per distribuire l'applicazione, non devi creare un file .zip.

Questo argomento è un riferimento sulla sintassi. Per le procedure dettagliate sull'avvio di ambienti Docker, consulta Utilizzo della versione della piattaforma Docker.

Sezioni

    Un file Dockerrun.aws.json descrive come distribuire un'immagine Docker in remoto come applicazione Elastic Beanstalk. Questo file JSON è specifico per Elastic Beanstalk. Se la tua applicazione viene eseguita su un'immagine disponibile in un repository in hosting, puoi specificare l'immagine in un file Dockerrun.aws.json v1 e omettere il Dockerfile.

    Chiavi e valori validi per il file Dockerrun.aws.json v1 includono le seguenti operazioni:

    AWSEBDockerrunVersion

    (Obbligatorio) Specifica il numero di versione come il valore 1 per gli ambienti Docker a container singolo.

    Autenticazione

    (Obbligatorio solo per i repository privati) Specifica l'oggetto Amazon S3 in cui è archiviato il file .dockercfg.

    Per informazioni, consulta Utilizzo di immagini da un repository privato.

    Immagine

    Specifica l'immagine di base Docker su un repository Docker esistente da cui crei un container Docker. Specifica il valore della chiave Name nel formato <organizzazione>/<nome immagine> per immagini su Docker Hub oppure <sito>/<nome organizzazione>/<nome immagine> per altri siti.

    Quando nel file Dockerrun.aws.json si specifica un'immagine, ogni istanza nell'ambiente Elastic Beanstalk esegue docker pull per eseguire l'immagine. Opzionalmente, è possibile includere la chiave Update. Il valore predefinito è true e indica a Elastic Beanstalk di controllare il repository, estrarre gli aggiornamenti per l'immagine e sovrascrivere le immagini memorizzate nella cache.

    Quando usi un file Dockerfile, non specificare la chiave Image nel file Dockerrun.aws.json. Elastic Beanstalk crea e utilizza sempre l'immagine descritta nel file Dockerfile quando presente.

    Porte

    (Obbligatorio quando specifichi la chiave Image) Elenca le porte da esporre sul container Docker. Elastic Beanstalk ContainerPortutilizza il valore per connettere il contenitore Docker al reverse proxy in esecuzione sull'host.

    È possibile specificare più porte del container, ma Elastic Beanstalk utilizza solo la prima porta. Utilizza questa porta per connettere il container al proxy inverso dell'host e instradare le richieste da Internet pubblico. Se utilizzi unDockerfile, il primo ContainerPortvalore deve corrispondere alla prima voce dell'elenco EXPOSE. Dockerfile

    Facoltativamente, puoi specificare un elenco di porte in. HostPort HostPortle voci specificano le porte host a cui sono mappati ContainerPorti valori. Se non si specifica un HostPortvalore, il valore predefinito è il valore. ContainerPort

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

    Mappa volumi da un'istanza EC2 al tuo container Docker. Specifica uno o più array di volumi da mappare.

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

    Specificare la directory all'interno del container in cui l'applicazione scrive i log. Elastic Beanstalk carica gli eventuali log presenti in questa directory in Amazon S3 quando richiedi la parte finale del log o log in bundle. Se esegui l'accesso a una cartella denominata rotated all'interno di questa directory, puoi anche configurare Elastic Beanstalk per il caricamento di log ruotati in Amazon S3 per lo storage permanente. Per ulteriori informazioni, consulta Visualizzazione dei log delle istanze Amazon EC2 nell'ambiente Elastic Beanstalk.

    Comando

    Specificare un comando da eseguire nel container. Se specifichi un Entrypoint, Command viene aggiunto come argomento in Entrypoint. Per ulteriori informazioni, consulta CMD nella documentazione Docker.

    Entrypoint

    Specificare un comando predefinito da eseguire all'avvio del container. Per ulteriori informazioni, consulta la sezione relativa a ENTRYPOINT nella documentazione Docker.

    Il seguente frammento è un esempio che illustra la sintassi del file Dockerrun.aws.json per un singolo container.

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

    Puoi fornire a Elastic Beanstalk solo il file Dockerrun.aws.json o un archivio .zip contenente i file Dockerrun.aws.json e Dockerfile. Quando fornisci entrambi i file, il Dockerfile descrive l'immagine Docker e il file Dockerrun.aws.json fornisce informazioni aggiuntive per la distribuzione, come descritto di seguito in questa sezione.

    Nota

    I due file devono essere al livello principale, o al livello superiore, dell'archivio .zip. Non creare l'archivio da una directory contenente i file. Passa invece a tale directory e crea lì l'archivio.

    Quando fornisci entrambi i file, non specificare un'immagine nel file Dockerrun.aws.json. Elastic Beanstalk crea e utilizza l'immagine descritta nel file Dockerfile e ignora l'immagine specificata nel file Dockerrun.aws.json.

    Aggiungi le informazioni sul bucket Amazon S3 che contiene il file di autenticazione al parametro Authentication del file Dockerrun.aws.json v1. Assicurati che il parametro Authentication contenga una chiave e un bucket Amazon S3 validi. Il bucket Amazon S3 deve essere ospitato nella stessa Regione AWS dell'ambiente che lo sta utilizzando. Elastic Beanstalk non scarica file dai bucket Amazon S3 ospitati in altre regioni.

    Per informazioni sulla generazione e sul caricamento del file di autenticazione, vedi Utilizzo di immagini da un repository privato.

    Il seguente esempio mostra l'uso di un file di autenticazione denominato mydockercfg in un bucket denominato DOC-EXAMPLE-BUCKET per l'utilizzo di un'immagine privata in un registro di terze parti.

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