Lösung für mehrere Docker-Container, die nicht die gleiche Portnummer haben

Lösung für mehrere Docker-Container, die nicht die gleiche Portnummer haben

Hintergrund

In Docker werden vier Container mit demselben Image erstellt. Das Netzwerk befindet sich im Bridge-Modus. Dienst A verwendet in allen vier Containern dieselbe Portnummer (6000). Um die Anzahl der nach außen zugänglichen Ports zu reduzieren, wird nginx als Proxy für die vier Dienstinstanzen verwendet. Die vier Dienstinstanzen gehören zu vier Upstreams, und für den Zugriff auf die vier Instanzen werden Pfade wie /service1 und /service2 verwendet.

Wenn Sie zu diesem Zeitpunkt lokal auf einen Dienst zugreifen, wird ein rätselhafter 502-Fehler gemeldet.

connect() ist beim Verbinden mit Upstream fehlgeschlagen (111: Verbindung abgelehnt)

Datei erstellen

Version: '2'
Netzwerke:
 nn:
  Treiber: Brücke
Leistungen:
 Dienst-1:
  Containername: Dienst-1
  Bild: foo
  Netzwerke:
   -nn
  Bände:
   - ./logs/1:/apps/aaa/bbb-logs
   - ./common:/apps/aaa/bbb
   - ./xxx/1.xml:/ccc/targets.xml
  Einstiegspunkt: foo.sh
  Befehl: starte App=foo Port=6000
  
 Dienst-2:
  Containername: Service-2
  Bild: foo
  Netzwerke:
   -nn
  Bände:
   - ./logs/2:/apps/aaa/bbb-logs
   - ./common:/apps/aaa/bbb
   - ./xxx/2.xml:/ccc/targets.xml
  Einstiegspunkt: foo.sh
  Befehl: starte App=foo Port=6000
 
 Dienst-3:
  Containername: Service-3
  Bild: foo
  Netzwerke:
   -nn
  Bände:
   - ./logs/3:/apps/aaa/bbb-logs
   - ./common:/apps/aaa/bbb
   - ./xxx/3.xml:/ccc/targets.xml
  Einstiegspunkt: foo.sh
  Befehl: starte App=foo Port=6000
 
 Dienst-4:
  Containername: Service-4
  Bild: foo
  Netzwerke:
   -nn
  Bände:
   - ./logs/4:/apps/aaa/bbb-logs
   - ./common:/apps/aaa/bbb
   - ./xxx/4.xml:/ccc/targets.xml
  Einstiegspunkt: foo.sh
  Befehl: starte App=foo Port=6000  
 
 nginx:
  Containername: nginx
  Bild: nginx:1.15-alpine
  Häfen:
   6001:6001
  Netzwerke:
   -nn
  Bände:
   - ./nginx/nginx.conf:/etc/nginx/nginx.conf
   - ./logs/nginx:/var/log/nginx

nginx.conf

Arbeitsprozesse 8;
worker_rlimit_nofile 65535; 
Ereignisse {
    verwenden Sie epoll;
    Arbeiterverbindungen 65535;
 }
 
http {
    mime.types einschließen;
    Standardtyp Anwendung/Oktett-Stream;
    sendfile an;
    log_format main '[$time_local]$remote_addr-$upstream_addr "$request" $status $body_bytes_sent';
 
    Upstream service1.local {
      Serverdienst-1:6000;
    }
    Upstream service2.local {
     Serverdienst-2:6000;
    }
    Upstream service3.local {
      Serverdienst-3:6000;
    }
    Upstream service4.local {
      Serverdienst-4:6000;
    }
 
    Server {
      hören Sie 6001;
      Maximale Client-Body-Größe: 100 M;
      Proxy_set_header Host $host:$server_port;
      Proxy_Set_Header X-Real-IP $Remote_Addr;
      proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
 
      Standort /service1/ {
        Proxy-Passwort http://service1.local/;
      }
      Standort /service2/ {
        Proxy-Passwort http://service2.local/;
      }
      Standort /service3/ {
        Proxy-Passwort http://service3.local/;
      }
      Standort /service4/ {
        Proxy-Passwort http://service4.local/;
      }
      Standort /nginx_status {
        stub_status ein;
        Zugriff_Abmeldung;
      }
    }
}
 

Zu diesem Zeitpunkt meldet curl localhost:6001/service1/api/v1/.... den oben genannten Fehler 502. Es liegt auf der Hand, dass jeder Container seine eigene Netzwerkkarte hat und die Portnummern verschiedener Container nicht in Konflikt geraten sollten.

Lösung

Da es derzeit keine bessere Lösung gibt, können wir nur unterschiedliche Portnummern für die vier Dienste verwenden und nginx entsprechend ändern.

Ergänzung: Mehrere Docker-Container auf demselben Server bereitstellen, Problem mit der Portumleitung

Stellen Sie in der Produktionsumgebung mehrere Container bereit und greifen Sie auf mehrere Ports zu.

Beispiel: -p 80:80 -p 81:81

Wenn Adresse 81 existiert, greifen Sie direkt auf die Adresse von Port 80 zu.

Missverständnis: Ich dachte zunächst, es handele sich um ein Cookie-Problem, weil ich das Cookie aktualisiert hatte (Cookies unterscheiden nicht zwischen Portnummern).

Endlich den Grund gefunden: Umleitungsproblem, da die Abmeldung auf die Anmeldeseite umleitet

Lösung: Konfigurieren Sie die Nginx-Parameter

proxy_set_header HOST $host; wird proxy_set_header HOST $host:81;

Denn egal was passiert, der Anforderungsparameter enthält die Portnummer.

Es gibt eine andere Methode im Internet: Ändern Sie den Proxy_Redirect-Parameter (aber nach dem Ausprobieren hat es nicht funktioniert).

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Lösen Sie das Problem der Angabe der UDP-Portnummer im Docker
  • Raspberry Pi-Serie: Verwenden von Docker zum Installieren des Qinglong-Panels und Ändern der Konfigurationsprobleme bei der Portnummer

<<:  Detaillierte Analyse des MySQL 8.0-Redo-Logs

>>:  Detaillierte Erklärung und klassische Interviewfragen zum Vue-Lebenszyklus und zu Hook-Funktionen

Artikel empfehlen

CSS-Beispielcode zur Implementierung von Schiebetüren

Durch die sogenannte Sliding Door-Technologie läs...

Schritte zum Erstellen eines Vite-Projekts

Inhaltsverzeichnis Vorwort Was macht Yarn Create?...

So erweitern Sie die Festplattenpartition für das CentOS-System

Problem/Fehler/Szenario/Anforderung Die Festplatt...

Detaillierte Erklärung der Lösung für das Nginx-Panikproblem

In Bezug auf das Nginx-Panikproblem müssen wir zu...

Tutorial zur Installation und Konfiguration von VMware Tools für Ubuntu 18.04

Dieser Artikel beschreibt die Installation und Ko...

Lösung für den Fehler von 6ull beim Laden des Linux-Treibermoduls

Inhaltsverzeichnis 0x01 Das Treibermodul konnte n...

Detaillierte Erklärung der nmcli-Verwendung in CentOS8

Allgemeine nmcli-Befehle basierend auf RHEL8/Cent...

So installieren Sie Android x86 in einer virtuellen VMware-Maschine

Manchmal möchten Sie eine App testen, aber nicht ...

Detaillierte Erläuterung von acht Methoden zum Korrigieren des CSS-Seitenendes

Beim Schreiben einer Seite kommt es häufig vor, d...