Ich habe zwei Maschinen Hosta und HostB mit Konsul und Docker-Daemon richtig so konfiguriert ist, dass ich docker network create -d overlay sharednet
Wie kann man während der Erstellung eines Docker-Overlay-Netzwerks Race-Condition vermeiden?
verwenden kann ich eine TestScript.sh
zu überprüfen, ob ein Netzwerk vorhanden ist und wenn das Netzwerk nicht erstellen. Und dieses Skript ist sowohl auf HostA als auch auf HostB verfügbar. Ich habe auch eine MasterScript.sh
nur auf A, die im Grunde nur TestScript.sh
auf jeder Maschine aufrufen. Nachdem ich meine MasterScript.sh
ausgeführt habe, sehe ich ein überraschendes Ergebnis, zwei Netzwerke mit dem gleichen Namen wurden erstellt !!! Dies ist wohl ein Docker-Synchronisationsproblem.
[HostA]# docker network ls
NETWORK ID NAME DRIVER
ad492bba9efa sharednet overlay
ba53d4e7b739 sharednet overlay
[HostB]# docker network ls
NETWORK ID NAME DRIVER
ad492bba9efa sharednet overlay
ba53d4e7b739 sharednet overlay
Das erwartete Verhalten ist, dass wenn ich ein Netzwerk testnw
auf Hosta erstellt, dann auf HostB ich so etwas wie dieses
[HostB]# docker network ls
68994f95cd67 testnw overlay
[HostB]# docker network create -d overlay testnw
Error response from daemon: network with name testnw already exists
Aufgrund einiger Einschränkungen sehen sollte ich nicht die MasterScript.sh
ändern kann, aber ich kann Ändere meine TestScript.sh
. Also die Frage ist, ist es mir möglich, diese Rassenbedingung unter dieser Einschränkung zu lösen?
verfolgt wird ich mit Ihrer Erwartung voll und ganz zustimmen; Das sieht wie ein Fehler aus. Warum überprüfen Sie die Netzwerke auf allen Hosts an erster Stelle? Wäre es nicht ausreichend, dies auf einem Host zu tun? – morxa
@morxa Auf jeder Maschine habe ich eine Kopie von 'TestScript.sh', die lokale Docker-Container verwaltet und sie an entsprechende Netzwerke anfügt. Wenn das Netzwerk nicht vorhanden ist, erstellt das Skript nur das Netzwerk und hängt den Container an das Netzwerk an. Da 'TestScript.sh' vollständig in der Natur verteilt ist und von Entwurf aus nicht miteinander kommunizieren kann, weiß TestScript.sh auf HostA nicht, ob TestScript.sh auf HostB den Befehl create ausgegeben hat oder nicht. Daher muss ich mich auf den Docker-Daemon verlassen, um meinen Netzwerk-Erstellungsbefehl zu synchronisieren. – cookieisaac
Welche Docker-Version verwenden Sie? – morxa