Blog

Amazon ECS Container Service so benutzerfreundlich wie Docker machen

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Dezember 30, 2025
7 Minuten

Einer der Gründe für den Siegeszug von Docker war, dass es so einfach zu benutzen war. Sie konnten einen Docker-Container in Sekundenschnelle erstellen und starten. Bei Amazon ECS ist das nicht der Fall. Sie müssen eine ganz neue Sprache lernen (Cluster, Task-Definitionen, Services und Tasks), einen ECS-Cluster aufsetzen, eine hässlich aussehende JSON-Datei schreiben oder sich mit einer nicht gerade benutzerfreundlichen Benutzeroberfläche herumschlagen, bevor Ihr Container in ECS läuft.In diesem Blog werden wir Ihnen zeigen, dass Amazon ECS genauso schnell sein kann, indem wir Ihnen ein kleines Dienstprogramm namens ecs-docker-run vorstellen, mit dem Sie einen Docker-Container fast so schnell starten können wie mit Docker allein, indem Sie die Docker-Befehlszeilenoptionen interpretieren. Zusammen mit einer fertigen CloudFormation-Vorlage können Sie mit Amazon ECS innerhalb von Minuten loslegen!

ECS-Jargon

Amazon ECS verwendet einen anderen Jargon als Docker, was zu Verwirrung führt. Hier ist eine kurze Übersetzung:

  • Cluster - ein oder mehrere Docker-Hosts.
  • Task-Definition - Eine JSON-Darstellung einer Docker-Run-Befehlszeile.
  • Task - Eine laufende Docker-Instanz. Wenn die Instanz anhält, ist die Aufgabe beendet.
  • Service - Eine laufende Docker-Instanz, die neu gestartet wird, wenn sie stoppt. In der Basis ist das alles, was dazugehört. (Wir haben ein paar Ecken und Kanten abgeschnitten und eine Reihe von Details weggelassen). Sobald Sie dies wissen, können Sie ecs-docker-run verwenden.

    ECS-Docker-Lauf

    ecs-docker-run ist ein einfaches Kommandozeilenprogramm zum Ausführen von Docker-Images auf Amazon ECS. Um dieses Dienstprogramm zu verwenden, geben Sie einfach etwas Vertrautes ein wie:

    [code]
    ecs-docker-run 
    --name paas-monitor 
    --env SERVICE_NAME=paas-monitor 
    --env SERVICE_TAGS=http 
    --env "MESSAGE=Hello from ECS task" 
    --env RELEASE=v10 
    -P 
    mvanholsteijn/paas-monitor:latest
    [/code]

    Ersetzen Sie 'docker run' durch 'ecs-docker-run'. Unter der Haube erzeugt es eine Aufgabendefinition und startet einen Container als Aufgabe auf dem ECS-Cluster. Alle der folgenden Docker-Befehlszeilenoptionen werden funktional unterstützt.

    -P veröffentlicht alle Ports durch Ziehen und Prüfen des Bildes.
    --name der Familienname der Aufgabe. Wenn nichts angegeben ist, wird der Name aus dem Bildnamen abgeleitet.
    -p fügt der Aufgabendefinition eine Port-Veröffentlichung hinzu.
    --env setzt die Umgebungsvariable.
    --memory legt die Menge des zuzuweisenden Speichers fest, Standardwert ist 256
    --cpu-anteile Legt den Anteil der zuzuweisenden CPU fest, Standardwert ist 100
    --Einstiegspunkt ändert den Einstiegspunkt für den Container
    --Link setzt den Container-Link.
    -v setzen Sie die Einhängepunkte für den Container.
    --volumes-from legt die zu mountenden Volumes fest.

    Alle anderen Docker-Optionen werden ignoriert, da sie sich auf Möglichkeiten beziehen, die für ECS-Container NICHT verfügbar sind. Die folgenden Optionen wurden hinzugefügt, speziell für ECS:

    --generate-only erzeugt nur die Aufgabendefinition auf der Standardausgabe, ohne etwas zu starten.
    --run-as-service die Aufgabe als Dienst ausführt, sorgt ECS dafür, dass die Aufgaben der 'gewünschten Anzahl' weiterlaufen.
    --desired-count gibt die Anzahl der auszuführenden Aufgaben an (Standard = 1).
    --cluster den ECS-Cluster, in dem die Aufgabe oder der Dienst ausgeführt werden soll (Standard = Cluster).

    Zum Anfassen!

    Um mit dem praktischen Teil fortzufahren, benötigen Sie Folgendes:

  • jq installiert
  • aws CLI installiert (Version 1.7.44 oder höher)
  • aws-Konnektivität konfiguriert
  • Docker-Konnektivität konfiguriert (zu einem beliebigen Docker-Daemon).

    checkout ecs-docker-run

    Holen Sie sich die ecs-docker-run-Quellen, indem Sie den folgenden Befehl eingeben:

    [code]
    git clone git@github.com:mvanholsteijn/ecs-docker-run.git
    cd ecs-docker-run/ecs-cloudformation
    [/code]

    importieren Sie Ihr ssh-Schlüsselpaar

    Um sich auf den ECS-Cluster-Instanzen umzusehen, importieren Sie Ihren öffentlichen Schlüssel in Amazon EC2, indem Sie den folgenden Befehl verwenden:

    [code]
    aws ec2 import-key-pair 
    --key-name ecs-$USER-key 
    --public-key-material "$(ssh-keygen -y -f ~/.ssh/id_rsa)"
    [/code]

    die ecs cluster autoscaling Gruppe erstellen

    Um Ihren ersten Cluster mit 6 Docker-Hosts zu erstellen, geben Sie den folgenden Befehl ein:

    [code]
    aws cloudformation create-stack 
    --stack-name ecs-$USER-cluster 
    --template-body "$(<ecs.json)" 
    --capabilities CAPABILITY_IAM 
    --parameters 
    ParameterKey=KeyName,ParameterValue=ecs-$USER-key 
    ParameterKey=EcsClusterName,ParameterValue=ecs-$USER-cluster
    [/code]

    Dieser Cluster basiert auf der firstRun Cloudformation-Definition, die verwendet wird, wenn Sie dem Amazon ECS-Assistenten folgen.

    Und warten Sie auf die Fertigstellung...

    Warten Sie, bis die Erstellung des Clusters abgeschlossen ist, indem Sie den folgenden Befehl eingeben:

    [code]
    function waitOnCompletion() {
    STATUS=IN_PROGRESS
    while expr "$STATUS" : '^.*PROGRESS' > /dev/null ; do
    sleep 10
    STATUS=$(aws cloudformation describe-stacks 
    --stack-name ecs-$USER-cluster | jq -r '.Stacks[0].StackStatus')
    echo $STATUS
    done
    }
    waitOnCompletion
    [/code]

    Den Cluster erstellen

    Leider erlaubt es CloudFormation (noch) nicht, den Namen des ECS-Clusters anzugeben. Daher müssen Sie den ECS-Cluster manuell erstellen, indem Sie den folgenden Befehl eingeben:

    [code]
    aws ecs create-cluster --cluster-name ecs-$USER-cluster
    [/code]

    Sie können Ihre Hosts und Aufgaben jetzt über die Amazon AWS EC2 Container Services-Konsole verwalten.

    Starten Sie den paas-monitor

    Endlich sind Sie bereit, jedes Docker-Image auf dem ECS auszuführen! Geben Sie den folgenden Befehl ein, um den paas-monitor zu starten.

    [code]
    ../bin/ecs-docker-run --run-as-service 
    --number-of-instances 3 
    --cluster ecs-$USER-cluster 
    --env RELEASE=v1 
    --env MESSAGE="Hello from ECS" 
    -p :80:1337 
    mvanholsteijn/paas-monitor
    [/code]

    Ermitteln Sie den DNS-Namen des Elastic Load Balancer

    Um die Anwendung in Aktion zu sehen, müssen Sie den DNS-Namen des Elastic Load Balancer ermitteln. Geben Sie die folgenden Befehle ein:

    [code]
    # Get the Name of the ELB created by CloudFormation
    ELBNAME=$(aws cloudformation describe-stacks --stack-name ecs-$USER-cluster | 
    jq -r '.Stacks[0].Outputs[] | select(.OutputKey =="EcsElbName") | .OutputValue')
    # Get the DNS from of that ELB
    DNSNAME=$(aws elb describe-load-balancers --load-balancer-names $ELBNAME | 
    jq -r .LoadBalancerDescriptions[].DNSName)
    [/code]

    Öffnen Sie die Anwendung

    Schließlich können wir Zugang zur Anwendung erhalten.

    [code]
    open https:// $DNSNAME
    [/code]

    Und es sollte in etwa so aussehen...

    Gastgeber freigeben Nachricht # Anzahl der Anrufe Durchschnittliche Reaktionszeit letzte Antwortzeit
    b6ee7869a5e3:1337 v1 Hallo von ECS aus Release v1; die Anzahl der Serveranrufe beträgt 82 68 45 36
    4e09f76977fe:1337 v1 Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 68 68 41 38
    65d8edd41270:1337 v1 Hallo von ECS aus Release v1; die Anzahl der Serveranrufe beträgt 82 68 40 37

    Führen Sie ein rollendes Upgrade durch

    Sie können nun ein rollierendes Upgrade Ihrer Anwendung durchführen, indem Sie den folgenden Befehl eingeben, während Sie Ihren Webbrowser unter https:// $DNSNAME geöffnet halten:

    [code]
    ../bin/ecs-docker-run --run-as-service 
    --number-of-instances 3 
    --cluster ecs-$USER-cluster 
    --env RELEASE=v2 
    --env MESSAGE="Hello from Amazon EC2 Container Services" 
    -p :80:1337 
    mvanholsteijn/paas-monitor
    [/code]

    Das Ergebnis sollte in etwa so aussehen:

    Gastgeber freigeben Nachricht # Anzahl der Anrufe Durchschnittliche Reaktionszeit letzte Antwortzeit
    b6ee7869a5e3:1337 v1 Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 124 110 43 37
    4e09f76977fe:1337 v1 Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 110 110 41 35
    65d8edd41270:1337 v1 Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 124 110 40 37
    ffb915ddd9eb:1337 v2 Hallo von Amazon EC2 Container Services aus Release v2; die Anzahl der Serveraufrufe beträgt 43 151 9942 38
    8324bd94ce1b:1337 v2 Hallo von Amazon EC2 Container Services aus Version v2; die Anzahl der Serveraufrufe beträgt 41 41 41 38
    7b8b08fc42d7:1337 v2 Hallo von Amazon EC2 Container Services aus Version v2; die Anzahl der Serveraufrufe beträgt 41 41 38 39

    Beachten Sie, dass das rollende Upgrade ein wenig grob ist. Die alten Instanzen erhalten fast sofort keine Anfragen mehr, während alle Anfragen auf die erste neue Instanz geladen zu werden scheinen.

    Sie mögen das Skript ecs-docker-run nicht?

    Wenn Sie das Skript ecs-docker-run nicht mögen, verzweifeln Sie nicht. Nachfolgend finden Sie die entsprechenden Amazon ECS-Befehle, mit denen Sie ohne das Hokuspokus-Skript auskommen...

    Erstellen Sie eine Aufgabendefinition

    Dies ist die schwierigste Aufgabe: Manuelles Erstellen einer Aufgabendefinitionsdatei namens 'manual-paas-monitor.json' mit folgendem Inhalt:

    [code]
    {
    "family": "manual-paas-monitor",
    "containerDefinitions": [
    {
    "volumesFrom": [],
    "portMappings": [
    {
    "hostPort": 80,
    "containerPort": 1337
    }
    ],
    "command": [],
    "environment": [
    {
    "name": "RELEASE",
    "value": "v3"
    },
    {
    "name": "MESSAGE",
    "value": "Native ECS Command Line Deployment"
    }
    ],
    "links": [],
    "mountPoints": [],
    "essential": true,
    "memory": 256,
    "name": "paas-monitor",
    "cpu": 100,
    "image": "mvanholsteijn/paas-monitor"
    }
    ],
    "volumes": []
    }
    [/code]

    Registrieren Sie die Aufgabendefinition

    Bevor Sie eine Aufgabe starten können, muss sie im ECS registriert werden, indem Sie den folgenden Befehl eingeben:

    [code]
    aws ecs register-task-definition --cli-input-json "$(<paas-monitor.json)"
    [/code]

    Einen Dienst starten

    Starten Sie nun einen Dienst, der auf dieser Definition basiert, indem Sie den folgenden Befehl eingeben:

    [code]
    aws ecs create-service 
    --cluster ecs-$USER-cluster 
    --service-name manual-paas-monitor 
    --task-definition manual-paas-monitor:1 
    --desired-count 1
    [/code]

    Sie sollten sehen, dass eine neue Zeile in Ihrem Browser erscheint:

    Gastgeber freigeben Nachricht # Anzahl der Anrufe Durchschnittliche Reaktionszeit letzte Antwortzeit
    ....
    5ec1ac73100f:1337 v3 Native ECS-Befehlszeilen-Bereitstellung ab Version v3; Anzahl der Serveraufrufe beträgt 37 37 37 36

    Fazit

    Amazon EC2 Container Services hat eine höhere Lernkurve als die Verwendung von einfachem Docker. Sie müssen den Fachjargon, die Erstellung eines ECS-Clusters auf Amazon EC2 und vor allem die Erstellung der umständlichen Aufgabendefinitionsdatei überwinden. Danach ist es fast so einfach zu bedienen wie Docker run. Im Gegenzug erhalten Sie alle Goodies von Amazon wie Autoscaling-Gruppen, Elastic Load Balancers und Multi-Availability-Zonen-Bereitstellungen, die Sie in Ihren Docker-Anwendungen verwenden können. Probieren Sie ECS also aus!

    Mehr Infos

    Hier finden Sie weitere Informationen:

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.