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.
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.
Unsere Ideen
Weitere Blogs
Contact



