Blog

Amazon ECS Container Service so benutzerfreundlich wie Docker machen

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 22, 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.

    -Pveröffentlicht alle Ports durch Ziehen und Prüfen des Bildes.
    --nameder Familienname der Aufgabe. Wenn nichts angegeben ist, wird der Name aus dem Bildnamen abgeleitet.
    -pfügt der Aufgabendefinition eine Port-Veröffentlichung hinzu.
    --envsetzt die Umgebungsvariable.
    --memorylegt die Menge des zuzuweisenden Speichers fest, Standardwert ist 256
    --cpu-anteileLegt den Anteil der zuzuweisenden CPU fest, Standardwert ist 100
    --Einstiegspunktändert den Einstiegspunkt für den Container
    --Linksetzt den Container-Link.
    -vsetzen Sie die Einhängepunkte für den Container.
    --volumes-fromlegt 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-onlyerzeugt nur die Aufgabendefinition auf der Standardausgabe, ohne etwas zu starten.
    --run-as-servicedie Aufgabe als Dienst ausführt, sorgt ECS dafür, dass die Aufgaben der 'gewünschten Anzahl' weiterlaufen.
    --desired-countgibt die Anzahl der auszuführenden Aufgaben an (Standard = 1).
    --clusterden 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...

    GastgeberfreigebenNachricht# Anzahl der AnrufeDurchschnittliche Reaktionszeitletzte Antwortzeit
    b6ee7869a5e3:1337v1Hallo von ECS aus Release v1; die Anzahl der Serveranrufe beträgt 82684536
    4e09f76977fe:1337v1Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 68684138
    65d8edd41270:1337v1Hallo von ECS aus Release v1; die Anzahl der Serveranrufe beträgt 82684037

    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:

    GastgeberfreigebenNachricht# Anzahl der AnrufeDurchschnittliche Reaktionszeitletzte Antwortzeit
    b6ee7869a5e3:1337v1Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 1241104337
    4e09f76977fe:1337v1Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 1101104135
    65d8edd41270:1337v1Hallo von ECS aus Version v1; die Anzahl der Serveranrufe beträgt 1241104037
    ffb915ddd9eb:1337v2Hallo von Amazon EC2 Container Services aus Release v2; die Anzahl der Serveraufrufe beträgt 43151994238
    8324bd94ce1b:1337v2Hallo von Amazon EC2 Container Services aus Version v2; die Anzahl der Serveraufrufe beträgt 41414138
    7b8b08fc42d7:1337v2Hallo von Amazon EC2 Container Services aus Version v2; die Anzahl der Serveraufrufe beträgt 41413839

    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:

    GastgeberfreigebenNachricht# Anzahl der AnrufeDurchschnittliche Reaktionszeitletzte Antwortzeit
    ....
    5ec1ac73100f:1337v3Native ECS-Befehlszeilen-Bereitstellung ab Version v3; Anzahl der Serveraufrufe beträgt 37373736

    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.