Ich spiele mit Amazon ECS (ein Umpacken von Docker) und stelle fest, dass es eine Docker-Funktion gibt, die ECS anscheinend nicht bietet. Ich möchte nämlich, dass mehrere Container in einer Instanz ausgeführt werden und Anforderungen, die an IP-Adresse 1 eingehen, auf Container 1 und Anforderungen, die an IP-Adresse 2 eingehen, auf Container 2 usw. abgebildet werden.
In Docker erfolgt das Binden eines Containers an eine bestimmte IP-Adresse über:
docker run -p myHostIPAddr:80:8080 imageName command
In Amazon ECS scheint es jedoch keine Möglichkeit zu geben, dies zu tun.
Ich habe eine EC2-Instanz mit mehreren elastischen IP-Adressen eingerichtet. Wenn Sie einen Container als Teil einer Aufgabendefinition konfigurieren, können Sie Host-Ports Container-Ports zuordnen. Im Gegensatz zu Docker bietet ECS jedoch keine Möglichkeit, die Host-IP-Adresse als Teil der Zuordnung anzugeben.
Eine zusätzliche Wendung ist, dass ich möchte, dass ausgehende Anforderungen von Container N die externe IP-Adresse von Container N haben.
Gibt es eine Möglichkeit, all das zu tun?
Ich habe die AWS CLI-Dokumentation sowie das AWS SDK für Java durchgesehen. Ich kann sehen, dass die CLI ein networkBindings-Array mit folgenden Elementen zurückgeben kann:
{
"bindIP": "0.0.0.0",
"containerPort": 8021,
"hostPort": 8021
},
und das Java SDK verfügt über eine Klasse mit dem Namen NetworkBinding, die dieselben Informationen darstellt. Diese Informationen werden jedoch offenbar nur als Antwort auf eine Anforderung ausgegeben. Ich kann keine Möglichkeit finden, diese verbindlichen Informationen an ECS weiterzuleiten.
Der Grund, warum ich dies tun möchte, ist, dass ich völlig verschiedene VMs für verschiedene Wahlkreise einrichten möchte, wobei verschiedene Container möglicherweise auf derselben EC2-Instanz verwendet werden. Jede VM verfügt über einen eigenen Webserver (einschließlich unterschiedlicher SSL-Zertifikate) sowie über einen eigenen FTP- und SSH-Dienst.
Vielen Dank.
quelle
aws ecs describe-container-instances
scheint nicht zu helfen. Sie scheinen dich wirklich dazu bringen zu wollen, eine ELB zu benutzen, was für unseren Fall ziemlich dumm ist.Antworten:
Eine Option: Erstellen Sie eine ELB für jeden Client und weisen Sie jeder ELB bestimmte Container zu.
[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html
quelle
Hier ist eine logische Vorgehensweise. Es klingt zu kompliziert, aber Sie können es tatsächlich in wenigen Minuten implementieren, und es funktioniert. Ich setze es tatsächlich um, während wir sprechen.
Sie erstellen für jeden Container eine Aufgabe und für jede Aufgabe einen Dienst, der mit einer Zielgruppe für jeden Dienst gekoppelt ist. Und dann erstellen Sie nur 1 Elastic Load Balancer.
Anwendungsbasierte Elastic Load Balancer können Anforderungen basierend auf dem angeforderten Pfad weiterleiten. Über die Zielgruppen können Sie Anfragen
elb-domain.com/1
an Container 1,elb-domain.com/2
Container 2 usw. weiterleiten.Jetzt bist du nur noch einen Schritt entfernt. Erstellen Sie einen Reverseproxyserver.
In meinem Fall verwenden wir nginx, sodass Sie einen nginx-Server mit beliebig vielen IP-Adressen erstellen können. Mit der Reverse-Proxy-Funktion von nginx können Sie Ihre IP-Adressen an die Pfade Ihrer ELB weiterleiten, die sie dementsprechend an den richtigen Container weiterleiten (s). Hier ist ein Beispiel, wenn Sie Domains verwenden.
Wenn Sie tatsächlich IPs
server_name
abhören, können Sie natürlich die Leitung weglassen und nur die entsprechenden Schnittstellen abhören.Dies ist tatsächlich besser als das Zuweisen einer statischen IP pro Container, da Sie Cluster von Docker-Computern haben können, auf denen Anforderungen für jede Ihrer "IPs" über diesen Cluster verteilt sind. Die Wiederherstellung eines Computers wirkt sich nicht auf die statische IP-Adresse aus, und Sie müssen nicht viele Konfigurationsschritte wiederholen.
Obwohl dies Ihre Frage nicht vollständig beantwortet, da Sie FTP und SSH nicht verwenden können, würde ich argumentieren, dass Sie Docker niemals verwenden sollten, um dies zu tun, und Sie sollten stattdessen Cloud-Server verwenden. Wenn Sie Docker verwenden, sollten Sie den Container selbst aktualisieren, anstatt den Server über FTP oder SSH zu aktualisieren. Für HTTP und HTTPS funktioniert diese Methode jedoch einwandfrei.
quelle
Sie können nicht auf den Container selbst zugreifen, aber Sie können eine EC2-Instanz für einen bestimmten Container erstellen. Wenn Sie auf diesen Dienst zugreifen möchten, können Sie auf den EC2-Host verweisen, auf dem der Container ausgeführt wird.
Obwohl Sie immer noch direkt mit einer EC2-Instanz sprechen, können Sie die IP des Containers (indirekt) wie bei der EC2-Instanz steuern. Dies erspart Ihnen den Aufwand, die Dienste auf dem "Bare Metal" auszuführen, sodass Sie den Dienst und die darin enthaltene Konfiguration einfacher verwalten und konfigurieren können.
quelle