Docker-Konfiguration - AWS Elastic Beanstalk

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Docker-Konfiguration

In diesem Abschnitt wird beschrieben, wie Sie Ihr Docker-Image und Ihren Container für die Bereitstellung auf Elastic Beanstalk vorbereiten.

Docker-Umgebung mit Docker Compose

In diesem Abschnitt wird beschrieben, wie Sie Ihr Docker-Image und Ihren Container für die Bereitstellung auf Elastic Beanstalk vorbereiten. Jede Webanwendung, die Sie für Elastic Beanstalk in einer Docker-Umgebung bereitstellen, muss eine docker-compose.yml-Datei enthalten, wenn Sie auch das Docker Compose-Tool verwenden. Sie können Ihre Webanwendung als containerisierten Dienst für Elastic Beanstalk bereitstellen, indem Sie eine der folgenden Aktionen ausführen:

  • Erstellen Sie eine docker-compose.yml-Datei, um ein Docker-Image aus einem gehosteten Repository für Elastic Beanstalk bereitzustellen. Wenn alle Ihre Bereitstellungen aus Images in öffentlichen Repositorys stammen, sind keine weiteren Dateien erforderlich. (Falls für Ihre Bereitstellung ein Image aus einem privaten Repository benötigt wird, müssen zusätzliche Konfigurationsdateien für die Authentifizierung eingeschlossen werden. Mehr Informationen dazu finden Sie unter Verwenden von Images aus dem privaten Repository.) Weitere Informationen zur docker-compose.yml-Datei finden Sie auf der Docker-Website in der Referenz zu Compose-Dateien.

  • Erstellen Sie eine Dockerfile-Datei, damit von Elastic Beanstalk ein benutzerdefiniertes Image erstellt und ausgeführt werden kann. Diese Datei ist optional und von Ihren Bereitstellungsanforderungen abhängig. Weitere Informationen zur Dockerfile-Datei finden Sie auf der Docker-Website in der Dockerfile-Referenz.

  • Erstellen Sie eine .zip-Datei mit Ihren Anwendungsdateien, sämtlichen Abhängigkeiten der Anwendungsdatei, der Dockerfile und der docker-compose.yml-Datei. Wenn Sie die EB CLI verwenden, um Ihre Anwendung bereitzustellen, wird automatisch eine .zip-Datei erstellt. Die beiden Dateien müssen sich im Stammverzeichnis oder im oberste Level des .zip-Archivs befinden.

    Wenn Sie nur eine docker-compose.yml-Datei verwenden, um Ihre Anwendung bereitzustellen, müssen Sie keine .zip-Datei erstellen.

Dieses Thema ist eine Syntaxreferenz. Ausführliche Verfahren zum Starten von Docker-Umgebungen mit Elastic Beanstalk finden Sie unter Verwenden des Docker-Plattformzweigs.

Weitere Informationen zu Docker Compose und zur Installation von Docker Compose finden Sie auf den Docker-Websites Overview of Docker Compose und Install Docker Compose.

Anmerkung

Wenn Sie Ihre Docker-Umgebungen nicht mit Docker Compose konfigurieren, sollten Sie die docker-compose.yml-Datei nicht verwenden. Verwenden Sie stattdessen die Dockerrun.aws.json-Datei, die Dockerfile-Datei oder beide.

Weitere Informationen finden Sie unter Konfiguration für Docker-Plattformen (ohne Docker Compose) .

Verwenden von Images aus einem privaten Repository

Elastic Beanstalk muss sich bei der Onlineregistrierung authentifizieren, die als Host für das private Repository fungiert, um Ihre Images aus einem privaten Repository pullen und bereitstellen zu können. Wir haben zwei Möglichkeiten, Anmeldeinformationen für Ihre Elastic Beanstalk-Umgebung zu speichern und abzurufen, um sich bei einem Repository zu authentifizieren.

  • Der AWS Secrets Manager

  • Die Datei Dockerrun.aws.json v3

Sie können Elastic Beanstalk so konfigurieren, dass vor dem Start des Bereitstellungsprozesses eine Anmeldung bei Ihrem privaten Repository durchgeführt wird. Dadurch kann Elastic Beanstalk auf die Images aus dem Repository zugreifen und diese Images in Ihrer Elastic Beanstalk-Umgebung bereitstellen.

Durch diese Konfiguration werden Ereignisse in der Prebuild-Phase des Bereitstellungsprozesses von Elastic Beanstalk initiiert. Verwenden Sie zur Einrichtung das Konfigurationsverzeichnis .ebextentions. Von der Konfiguration werden Skripts vom Typ Plattform-Hook verwendet, die docker login aufrufen, um die Authentifizierung bei der Onlineregistrierung durchzuführen, die als Host für das private Repository fungiert. Diese Konfigurationsschritte werden im Anschluss detailliert beschrieben.

So konfigurieren Sie Elastic Beanstalk für die Authentifizierung bei Ihrem privaten Repository mit AWS Secrets Manager
Anmerkung

Für diese Schritte müssen bestimmte Berechtigungen erteilt werden. Weitere Informationen finden Sie unter der folgenden Referenz.

  1. Erstellen Sie Ihre Verzeichnisstruktur für .ebextensions wie folgt:

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. Verwenden Sie AWS Secrets Manager, um die Anmeldeinformationen Ihres privaten Repositorys zu speichern, damit Elastic Beanstalk bei Bedarf Ihre Anmeldeinformationen abrufen kann. Führen Sie dazu den Befehl create-secret AWS CLI von Secrets Manager aus.

    aws secretsmanager create-secret \ --name MyTestSecret \ --description "My image repo credentials created with the CLI." \ --secret-string "{\"USER\":\"EXAMPLE-USERNAME\",\"PASSWD\":\"EXAMPLE-PASSWORD\"}"
  3. Erstellen Sie die folgende Datei env.config und platzieren Sie sie im Verzeichnis .ebextensions, wie in der obigen Verzeichnisstruktur gezeigt. Diese Konfiguration verwendet den Namespace aws:elasticbeanstalk:application:environment, um die Umgebungsvariablen USER und PASSWD von Elastic Beanstalk mit dynamischen Referenzen zu AWS Secrets Manager zu initialisieren. Weitere Informationen zu secretsmanager dynamischen Verweisen finden Sie im AWS Secrets ManagerBenutzerhandbuch unter Abrufen eines AWS Secrets Manager Secrets in einer AWS CloudFormation Ressource.

    Anmerkung

    USER und PASSWD im Skript müssen den Zeichenfolgen entsprechen, die im obigen Befehlen vom Typ secretsmanager create-secret verwendet wurden.

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  4. Erstellen Sie die folgende Skriptdatei 01login.sh und platzieren Sie sie in den folgenden Verzeichnissen, wie ebenfalls in der obigen Verzeichnisstruktur gezeigt:

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

    Das 01login.sh-Skript ruft das get-config Plattformskript auf, um die Repository-Anmeldeinformationen abzurufen und sich beim Repository anzumelden. Es speichert den Benutzernamen in der Skript-Variablen USER. In der nächsten Zeile wird das Passwort abgefragt. Anstatt das Passwort in einer Variablen zu speichern, leitet das Skript das Passwort direkt an den docker login-Befehl im stdin-Eingabestream weiter. Die --password-stdin-Option verwendet den Eingabestream, sodass Sie das Passwort nicht in einer Variablen speichern müssen. Weitere Informationen zur Authentifizierung mit der Docker-Befehlszeilenschnittstelle finden Sie unter Docker-Login auf der Docker-Dokumentationswebsite.

    Hinweise
    • Alle Skriptdateien müssen über die Ausführungsberechtigung verfügen. Legen Sie mit chmod +x die Ausführungsberechtigung für Ihre Hook-Dateien fest. Für alle auf Amazon Linux 2 basierenden Plattformversionen, die am oder nach dem 29. April 2022 veröffentlicht wurden, gewährt Elastic Beanstalk automatisch Ausführungsberechtigungen für alle Plattform-Hook-Skripts. In diesem Fall müssen Sie Ausführungsberechtigungen nicht manuell erteilen. Eine Liste dieser Plattformversionen finden Sie in den Versionshinweisen vom 29. April 2022 – Linux-Plattform im AWS Elastic Beanstalk-Leitfaden für Versionshinweise.

    • Bei Hook-Dateien kann es sich um Binär- oder Skriptdateien handeln, die mit einer #!-Zeile mit dem Interpreter-Pfad beginnen (z. B. #!/bin/bash).

    • Weitere Informationen finden Sie in Erweitern von Elastic Beanstalk-Linux-Plattformen unter Plattform-Hooks.

Wenn sich Elastic Beanstalk bei der Onlineregistrierung authentifiziert, die als Host für das private Repository fungiert, können Sie Ihre Images abrufen und bereitstellen.

In diesem Abschnitt wird eine andere Methode für die Authentifizierung von Elastic Beanstalk bei einem privaten Repository beschrieben. Dabei wird eine Authentifizierungsdatei mit dem Docker-Befehl erstellt und in einen Amazon S3-Bucket hochgeladen. In der Datei Dockerrun.aws.json v3 müssen auch die Bucket-Informationen eingeschlossen werden.

So generieren Sie eine Authentifizierungsdatei und stellen sie in Elastic Beanstalk bereit
  1. Erstellen Sie eine Authentifizierungsdatei mit dem docker login-Befehl. Für Repositorys auf Docker Hub führen Sie au docker login:

    $ docker login

    Für andere Registrys fügen Sie die URL des Registry-Servers ein:

    $ docker login registry-server-url
    Anmerkung

    Wenn Ihre Elastic Beanstalk-Umgebung die Amazon Linux AMI-Docker-Plattformversion verwendet (vor Amazon Linux 2), lesen Sie die entsprechenden Informationen unter Docker-Konfiguration auf Amazon Linux AMI (Vorgängerversion von Amazon Linux 2).

    Weitere Informationen zur Authentifizierungsdatei finden Sie unter Store images on Docker Hub und docker login auf der Docker-Website.

  2. Laden Sie eine Kopie der Authentifizierungsdatei mit dem Namen .dockercfg in einen sicheren Amazon S3-Bucket hoch.

    • Der Amazon-S3-Bucket muss in derselben AWS-Region gehostet sein wie die Umgebung, die ihn verwendet. Elastic Beanstalk kann keine Dateien von einem Amazon S3-Bucket herunterladen, der in anderen Regionen gehostet wird.

    • Erteilen Sie Berechtigungen für den Vorgang s3:GetObject für die IAM-Rolle im Instance-Profil. Weitere Informationen finden Sie unter Elastic Beanstalk Instance-Profile verwalten.

  3. Schließen Sie die Amazon S3-Bucket-Informationen in den Authentication-Parameter der Datei Dockerrun.aws.json v3 ein.

    Im Anschluss sehen Sie ein Beispiel für eine Dockerrun.aws.json v3-Datei.

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

    Der AWSEBDockerrunVersion-Parameter gibt die Version der Dockerrun.aws.json-Datei an.

    • Die Docker Amazon Linux 2-Plattform verwendet die Datei Dockerrun.aws.json v3 für Umgebungen, in denen Docker Compose zum Einsatz kommt. Die Datei Dockerrun.aws.json v1 wird für Umgebungen genutzt, in denen Docker Compose nicht verwendet wird.

    • Die Amazon Linux AMI-Multicontainer-Docker-Plattform verwendet die Datei Dockerrun.aws.json v2.

Wenn sich Elastic Beanstalk bei der Onlineregistrierung authentifizieren kann, die als Host für das private Repository fungiert, können Ihre Images bereitgestellt und abgerufen werden.

Erstellen benutzerdefinierter Images mit einer Dockerfile-Datei

Falls Sie noch nicht über ein in einem Repository gehostetes Image verfügen, müssen Sie eine Dockerfile erstellen.

Der folgende Codeausschnitt ist ein Beispiel für die Dockerfile. Wenn Sie die Anweisungen in Verwenden des Docker-Plattformzweigs befolgen, können Sie die Dockerfile wie beschrieben hochladen. Elastic Beanstalk führt das Spiel 2048 aus, wenn Sie diese verwende Dockerfile.

Weitere Informationen zu den Anweisungen, die Sie in die Dockerfile einschließen können, finden Sie unter Dockerfile-Referenz auf der Docker-Website.

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

Sie können mehrstufige Builds aus einer einzigen Dockerfile ausführen, um kleinere Images mit einer signifikanten Verringerung der Komplexität zu erzeugen. Weitere Informationen finden Sie unter Verwenden mehrstufiger Builds auf der Docker-Dokumentationswebsite.

Konfiguration für Docker-Plattformen (ohne Docker Compose)

Wenn Docker Compose in Ihrer Elastic Beanstalk-Docker-Umgebung nicht verwendet wird, lesen Sie die zusätzlichen Informationen in den folgenden Abschnitten.

Alle Webanwendungen, die Sie in Elastic Beanstalk in einer Docker-Umgebung bereitstellen, müssen eine Dockerfile- oder eine Dockerrun.aws.json-Datei enthalten. Sie können Ihre Webanwendung über einen Docker-Container in Elastic Beanstalk bereitstellen, indem Sie eine der folgenden Aktionen ausführen:

  • Erstellen Sie eine Dockerfile-Datei, damit von Elastic Beanstalk ein benutzerdefiniertes Image erstellt und ausgeführt werden kann.

  • Erstellen Sie eine Dockerrun.aws.json-Datei, um ein Docker-Image aus einem gehosteten Repository für Elastic Beanstalk bereitzustellen.

  • Erstellen Sie eine .zip-Datei mit Ihren Anwendungsdateien, sämtlichen Abhängigkeiten der Anwendungsdatei, der Dockerfile und der Dockerrun.aws.json-Datei. Wenn Sie die EB CLI verwenden, um Ihre Anwendung bereitzustellen, wird automatisch eine .zip-Datei erstellt.

    Wenn Sie nur eine Dockerfile oder nur eine Dockerrun.aws.json-Datei verwenden, um Ihre Anwendung bereitzustellen, müssen Sie keine .zip-Datei erstellen.

Dieses Thema ist eine Syntaxreferenz. Ausführliche Verfahren zum Starten von Docker-Umgebungen finden Sie unter Verwenden des Docker-Plattformzweigs.

Abschnitte

    Eine Dockerrun.aws.json-Datei beschreibt, wie ein Remote-Docker-Image als Elastic Beanstalk-Anwendung bereitgestellt wird. Diese JSON-Datei ist spezifisch für Elastic Beanstalk. Wenn Ihre Anwendung auf einem Bild ausgeführt, das in einem gehosteten Repository verfügbar ist, können Sie das Image in einer Dockerrun.aws.json v1-Datei angeben und die Dockerfile auslassen.

    Zu den gültigen Schlüsseln und Werten für die Dockerrun.aws.json v1-Datei zählen unter anderem folgende Vorgänge:

    AWSEBDockerrunVersion

    (Erforderlich) Gibt die Versionsnummer als Wert 1 für Single-Container-Docker-Umgebungen an.

    Authentifizierung

    (Nur erforderlich für private Repositorys) Gibt das Amazon S3-Objekt an, in dem die .dockercfg-Datei gespeichert ist.

    Siehe Verwenden von Images aus einem privaten Repository.

    Image

    Gibt das Docker-Basis-Image auf einem vorhandenen Docker-Repository an, aus dem Sie einen Docker-Container erstellt haben. Geben Sie den Wert des Name-Schlüssels im Format <organization>/<image name> für Images auf Docker-Hub oder <site>/<organization name>/<image name> für andere Websites an.

    Wenn Sie ein Image in der Dockerrun.aws.json-Datei angeben, wird docker pull von jeder Instance Ihrer Elastic Beanstalk-Umgebung ausgeführt, um das Image auszuführen. Sie können optional den Update-Schlüssel einschließen. Der Standardwert ist true. Er weist Elastic Beanstalk an, das Repository zu prüfen, Updates auf das Image abzurufen und alle zwischengespeicherten Images zu überschreiben.

    Geben Sie, wenn Sie eine Dockerfile verwenden, den Image-Schlüssel in der Dockerrun.aws.json-Datei nicht an. Elastic Beanstalk erstellt und verwendet immer das Image, das in Dockerfile Beschrieben ist, wenn eines vorhanden ist.

    Ports

    (Erforderlich, wenn Sie den Image-Schlüssel angeben) Listet die Ports auf, die auf dem Docker-Container bereitgestellt werden sollen. Elastic Beanstalk verwendet den ContainerPort-Wert für die Verbindung des Docker-Containers mit dem Reverse-Proxy, der auf dem Host ausgeführt wird.

    Sie können mehrere Container-Ports angeben, von Elastic Beanstalk wird aber nur der erste Port verwendet. Dieser Port wird verwendet, um Ihren Container mit dem Reverse-Proxy des Hosts zu verbinden und Anforderungen aus dem öffentlichen Internet weiterzuleiten. Wenn Sie eine Dockerfile verwenden, sollte der erste ContainerPort-Wert mit dem ersten Eintrag in der EXPOSE-Liste der Dockerfile übereinstimmen.

    Optional können Sie eine Liste der Ports in HostPort angeben. HostPort-Einträge geben die Host-Ports an, denen ContainerPort-Werte zugeordnet sind. Wenn Sie keinen HostPort-Wert angeben, wird standardmäßig der ContainerPort-Wert verwendet.

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

    Ordnen Sie Volumes von einer EC2-Instance Ihrem Docker-Container zu. Geben Sie ein oder mehrere Volume-Arrays für die Zuordnung an.

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

    Geben Sie das Verzeichnis im Container an, in das Ihre Anwendung Protokolle schreibt. Elastic Beanstalk lädt alle Protokolle in dieses Verzeichnis in Amazon S3 hoch, wenn Sie Protokollfragmente oder Bundle-Protokolle anfordern. Wenn Sie Protokolle zu einem Ordner mit dem Namen rotated in diesem Verzeichnis rotieren, können Sie auch Elastic Beanstalk so konfigurieren, dass rotierte Protokolle für eine dauerhafte Speicherung in Amazon S3 hochgeladen werden. Weitere Informationen finden Sie unter Protokolle von Amazon EC2-Instances in Ihrer Elastic Beanstalk Umgebung anzeigen.

    Befehl

    Geben Sie einen Befehl an, der im Container ausgeführt werden soll. Wenn Sie einen Entrypoint (Eintrittspunkt) angeben, dann wird Command (Befehl) als Argument für Entrypoint (Eintrittspunkt) hinzugefügt. Weitere Informationen finden Sie unter CMD in der Docker-Dokumentation.

    Eintrittspunkt

    Geben Sie einen Standard-Befehl an, der ausgeführt werden soll, wenn der Container gestartet wird. Weitere Informationen finden Sie unter EINTRITTSPUNKT in der Docker-Dokumentation.

    Der folgende Codeausschnitt ist ein Beispiel, das die Syntax der Dockerrun.aws.json-Datei für einen einzelnen 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" }

    Sie können Elastic Beanstalk nur mit der Dockerrun.aws.json-Datei oder mit einem .zip-Archiv bereitstellen, das sowohl die Dockerrun.aws.json-Datei als auch die Dockerfile-Datei enthält. Wenn Sie beide Dateien bereitstellen, beschreibt die Dockerfile das Docker-Image und die Datei Dockerrun.aws.json bietet zusätzliche Informationen für die Bereitstellung. Einzelheiten dazu finden Sie weiter unten in diesem Abschnitt.

    Anmerkung

    Die beiden Dateien müssen sich im Stammverzeichnis oder im oberste Level des .zip-Archivs befinden. Erstellen Sie kein Archiv aus einem Verzeichnis, das die Dateien enthält. Navigieren Sie stattdessen zu dem Verzeichnis und erstellen Sie das Archiv dort.

    Wenn Sie die beide Dateien bereitstellen, geben Sie kein Image in der Datei Dockerrun.aws.json an. Elastic Beanstalk erstellt und verwendet das Image, das in Dockerfile beschrieben wird, und ignoriert das in der Datei Dockerrun.aws.json angegebene Image.

    Fügen Sie die Informationen über den Amazon S3-Bucket hinzu, der die Authentifizierungsdatei im Authentication-Parameter der Dockerrun.aws.json v1-Datei enthält. Stellen Sie sicher, dass der Authentication-Parameter einen gültigen Amazon S3-Bucket und -Schlüssel enthält. Der Amazon-S3-Bucket muss in derselben AWS-Region gehostet sein wie die Umgebung, die ihn verwendet. Elastic Beanstalk lädt keine Dateien von Amazon S3-Buckets herunter, die in anderen Regionen gehostet werden.

    Weitere Informationen zum Generieren und Hochladen der Authentifizierungsdatei finden Sie unter Verwenden von Images aus einem privaten Repository.

    Das folgende Beispiel zeigt die Verwendung einer Authentifizierungsdatei mit dem Namen mydockercfg in einem Bucket namens DOC-EXAMPLE-BUCKET, um ein privates Image in einem Drittanbieter-Registry zu verwenden.

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