Geben Sie mehreren Docker-Containern eindeutige öffentliche Hostnamen auf einem einzigen Ubuntu-Server

Geben Sie mehreren Docker-Containern eindeutige öffentliche Hostnamen auf einem einzigen Ubuntu-Server

Ich möchte mehrere Docker-Container einrichten, um verschiedene Hostnamen auf einer einzigen Maschine bereitzustellen, ohne den Aufwand von Kubernetes.

CONTAINER ID        IMAGE               COMMAND             STATUS              NAMES
673394ef1d4c        busybox             "top"               Up 45 seconds       nostalgic_shockley
d85756f57265        busybox             "top"               Up 51 seconds       high_albattani

Nehmen wir an, ich habe eine Domäne xyz.com; ich möchte alpha.xyz.comeine Weiterleitung zu nostalgic_shockleyund beta.xyzeine Weiterleitung nach high_albattani.

Ich habe nachgeschaut /etc/hostnameund es hat einen lokalen Hostnamen.

root@saag:/home/root# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
...
root@saag:/home/root# cat /etc/hostname
saag
...
root@saag:/home/root# cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Ich habe sogar versucht, die Hostnamen einzelnen Docker-IP-Adressen zuzuweisen, /etc/hostnamekonnte die Container jedoch immer noch nicht erreichen.

Und sollte ich in meinem Domänenverwaltungsbereich einfach den A-Eintrag für alpha.xyz.comund beta.xyz.comauf die IP-Adresse dieses Hosts festlegen?

Antwort1

Irgendwie glaube ich, dass Sie auf dem Holzweg sind. Das interne Docker-Netzwerk ist im externen Netzwerk des Hosts nicht vertreten. Der Host muss den Verkehr umleiten.

Normalerweise möchten Sie Verbindungen von der Außenwelt zulassenzu einem Dienst(d. h. in den meisten Fällen ein TCP-Port) innerhalb der Docker-Container.

Wenn Sie über HTTP sprechen und Port 80 (oder 443) für beide Container möchten, ist es nicht so einfach, einen Port von der externen Schnittstelle an sie weiterzuleiten, da Sie ihn nicht an beide weiterleiten können. Meine bevorzugte Lösung wäre daher, einen Apache auf dem Hostcomputer zu haben, der namensbasiertes virtuelles Hosting mit zwei virtuellen Hosts für die beiden unterschiedlichen DNS-Namen durchführt und den Datenverkehr an ihre jeweiligen Docker-Container weiterleitet.

Übrigens: Wenn Sie unterschiedliche Ports vom externen Netzwerk den Docker-Containern zuordnen möchten, würden einige einfachere (netzwerkbasierte) Methoden funktionieren, z. B. einige auf iptables basierende Weiterleitungen oder Host-Port-Zuordnungen.

Antwort2

Und sollte ich in meinem Domänenverwaltungsbereich einfach den A-Eintrag für alpha.xyz.com und beta.xyz.com auf die IP-Adresse dieses Hosts setzen?

Das Domänenverwaltungspanel ist das, was Siebeginnen mit.Weder Docker noch die Container selbst können aus dem Nichts eine Subdomäne erstellen; sie muss zuerst innerhalb des DNS-Dienstanbieters erstellt werden.

Sobald dies erledigt ist, kann der Docker-Host Pakete mithilfe der von Docker bereitgestellten Einrichtungen (ich nehme an, TCP/UDP-Portweiterleitung über iptables) an den richtigen Container weiterleiten – oder Sie können HTTP-Anfragen mithilfe eines Reverse-Proxys weiterleiten.

Sie müssen die Container-Hostnamen nicht ändern, damit dies funktioniert.


(Technisch gesehen unterstützt DNS die dynamische Registrierung innerhalb des Protokolls, aber die meisten Dienstanbieter unterstützen dies entweder überhaupt nicht oder verlangen die Verwendung ihrer benutzerdefinierten API anstelle der Standard-DNS-Funktionen.

Darüber hinaus müssten die Maschinen eine Möglichkeit haben, sich beim DNS-Anbieter zu authentifizieren, und dafür gibt es kein gutes universelles System. Daher ist eine solche automatische Subdomänenerstellung in der Praxis fast ausschließlich Active Directory vorbehalten.)

verwandte Informationen