Zum ersten Mal schreiben. Gestatten Sie mir, mich vorzustellen … Hallo zusammen, ich bin Jasmine. Warum heißt es Jasmin? Emmm, ID Jasmine dreht sich im Kreis? Nur ein Scherz, hehe. Der Autor ist seit zwei Jahren ein Neuling (drei Tage vor dem Abschluss seiner zweijährigen Ausbildung). Weil wir in der Firma nur zwei Leute haben, mich und den Frontend-Entwickler. Somit fiel mir natürlich die Aufgabe zu, den Online-Dienst bereitzustellen. Dies ist das erste Mal, dass Docker zum Bereitstellen von Diensten in einer Produktionsumgebung verwendet wird. Aus einer Grube klettern und in eine andere fallen. Notieren Sie einfach die Fehler, die bei diesem Start aufgetreten sind. Bitte korrigieren Sie mich, wenn an dem, was ich geschrieben habe, etwas falsch ist. Verzeihen Sie mir! Okay. Ohne weitere Umschweife. Aktion! Dieses Projekt verwendet Spring Cloud+Spring Boot+Spring Gateway+MySQL und verwendet auch RabbitMQ. Der Server ist centos7. Hier fehlt ein großer Kessel. Ich habe tatsächlich einen Backend-Kollegen, mit dem ich seit drei Monaten zusammenarbeite. Dieser Typ wurde gefeuert, weil sein Chef seinem Urlaubsantrag für ein Vorstellungsgespräch nicht zustimmte, aber er ging trotzdem hin. Er war derjenige, der die Rahmenbedingungen geschaffen hatte. ähm, also wurde mir die Schuld zugeschoben! Das von ihm verwendete Zuul habe ich durch Gateway ersetzt. Zuul basiert auf Servlet 2.5 (verwendet 3.x) und verwendet eine blockierende API. Es werden keine dauerhaften Verbindungen wie WebSockets unterstützt. Gateway basiert auf Spring Framework 5, Project Reactor und Spring Boot 2 und verwendet eine nicht blockierende API. WebSockets werden unterstützt und da es eng in Spring integriert ist, ist die Entwicklung wesentlich angenehmer. Der Docker-Image-Dienst verwendet den Container-Image-Dienst von Alibaba Cloud. Ich habe einen Kollegen gefragt und er sagte, dass er das Containertool Jib von Google verwendet. Also drückte ich Cmd+Umschalt+F und suchte weltweit nach „Jib“. (Verzeihen Sie, es ist der Kompaniecode, also der Kavalleriecode ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄) Klicken Sie hier, um zu sehen Rufen Sie Alibaba Cloud auf und suchen Sie den Container-Image-Dienst (ich habe die Schritte hier ausgelassen, da ich nicht wusste, dass das Image-Warehouse partitioniert ist und das Warehouse nicht finden konnte, da ich keine Berechtigung hatte. Dann habe ich schamlos nach einem Administratorkonto gefragt und das Mitarbeiterkonto eines Kollegen geändert, der gekündigt hatte, konnte das Warehouse aber immer noch nicht finden.) Dann habe ich einen Namespace xxx-prod erstellt und anschließend für jeden Dienst in diesem Space ein Warehouse und ein privates Warehouse aufgebaut. Für die Codequelle habe ich mich entschieden, das lokale Repository in das Spiegel-Repository zu pushen. Über die anderen weiß ich nicht viel. (Später stellte ich fest, dass ich es nicht erstellen musste. Durch die Jib-Übermittlung wird das Repository automatisch erstellt. Ich habe es bei der manuellen Erstellung ausgewählt.) Nach der Übermittlung mit Jib kann ich das Update in den Versionsinformationen des Repository sehen. Stellen Sie dann eine Verbindung zum Server her. Erstellen Sie einen Docker-Ordner unter dem Home-Ordner //Im Stammverzeichnis//~]# So sagt man „emmm“ in CentOS7: Auf GitBash und im Betriebssystem lautet es $, unter Windows lautet die Eingabeaufforderung > //Erstellen Sie einen Docker-Ordner unter Home~]# mkdir /home/docker //Geben Sie den erstellten Docker ein ~]# cd /home/docker Beginnen Sie dann mit dem Abrufen des Bildes, das wir in die Alibaba Cloud hochgeladen haben. Tatsächlich kann jedes beliebige Verzeichnis abgerufen werden (beim ersten Abrufen von Alibaba Image Service habe ich es ausgelassen. Ich habe die Bedienungsanleitung nicht gelesen. Ich vermutete, dass mein Konto keine Berechtigung hatte, habe mich aber nicht angemeldet. Dann habe ich mich weiterhin bei Docker angemeldet, wusste aber nicht, dass ich am Ende die Image-Adresse von Alibaba Cloud hinzufügen sollte: registry.cn-hangzhou.aliyuncs.com). Klicken Sie in der Image Service Management Console von Alibaba Cloud auf ein beliebiges Image-Repository -> Verwaltung, und Sie können die Bedienungsanleitung für das Image-Repository anzeigen. Nachdem das Bild gezogen wurde, geben Sie ein ~]# Docker-Bilder Sie können das Bild sehen, das Sie gerade gezogen haben. Ich fragte meinen Kollegen, warum es hier so viele Spiegel gab, und er erklärte es mir Ähm, okay! Ich habe immer das Gefühl, dass viele Bilder den Speicher beanspruchen (ich hoffe, jemand, der sich damit auskennt, kann mir einen Rat geben, danke) Starten Sie Eureka ~]# docker run -d --name eureka -p 8761:8761 -p 15672:15672 -p 9001:9001 -v /etc/localtime:/etc/localtime registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/eureka // -d im Hintergrund ausführen -p Port binden Hier werden drei Ports gebunden, einer ist der Port des Registrierungscenters selbst, einer ist der Port des Gateways und der andere ist der Port von rabbitmq //-v Versionsinformationen drucken Da RabbitMQ verwendet wird, müssen Sie einen weiteren RabbitMQ-Container erstellen. Oder ziehen Sie zuerst das Bild //Beachten Sie, dass Sie beim Abrufen des Images die Verwaltungsversion und nicht die letzte Version abrufen sollten. Die Verwaltungsversion verfügt über die Verwaltungsschnittstelle. ~]# Docker ziehen rabbitmq:Verwaltung ~]# docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=xxx -e RABBITMQ_DEFAULT_PASS=xxx --network=container:eureka rabbitmq:management //Da die Docker-Container nach Netzwerk getrennt sind, wird das Netzwerk derselben Netzwerkumgebung wie Eureka hinzugefügt, sodass es von Diensten unter Eureka-Governance aufgerufen werden kann. //-e dient zum Festlegen des Standardkontokennworts, das im Befehl xxx lautet. Freunde, die es verwenden, können es gerne selbst anpassen. Dann starten Sie Ihren eigenen Dienst ~]# docker run -d --name xxx -v /home/docker/web-prod/logs:/logs -v /etc/localtime:/etc/localtime --network=container:eureka registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/xxx //-v dient zum Einbinden des Protokolls in ein von Ihnen angegebenes Verzeichnis. In ähnlicher Weise verbindet --network das Eureka-Netzwerk, und es ist hier nicht erforderlich, einen Port zu binden. //Nach dem Start können Sie den Dienststatus in der Konsole des Registrierungscenters anzeigen. IP + Port von Eureka. Auf diese Weise wird der Dienst ausgeführt. Die weiteren Serviceschritte sind ähnlich. Zum Schluss möchte ich noch einige kleine Episoden anfügen, die mir beim Surfen im Internet begegnet sind. Zuerst wusste ich nicht, dass die Docker-Container durch ein Netzwerk getrennt waren, und ich konnte keine Verbindung zu rabbitmq herstellen, weil ich noch nie --network zum Einrichten des Eureka-Netzwerks verwendet hatte. Daher kann innerhalb des Dienstes nicht vom lokalen Host auf rabbitmq zugegriffen werden. Wenn im Dienst die RabbitMQ-Verzögerungswarteschlange verwendet wird, muss außerdem das Verzögerungswarteschlangen-Plug-In installiert werden. Schritte zur Plugin-Installation Öffnen Sie zum Herunterladen die offizielle Website: http://www.rabbitmq.com/community-plugins.html Wählen Sie die entsprechende Version „3.7.x“ aus und klicken Sie auf Download. ~]# docker cp /home/docker/rabbitmq_delayed_message_exchange-20171201-3.7.x.ez rabbit:/plugins //Geben Sie Docker ein~]# docker exec -it rabbit /bin/bash //Öffnen Sie das Plugin rabbitmq-plugins enable rabbitmq_delayed_message_exchange //Alle installierten Plugins anzeigen rabbitmq-plugins Liste Die Installation war erfolgreich, wie in der Abbildung gezeigt: Wenn Docker RM einen Container löscht, kann dieser plötzlich nicht mehr gelöscht werden. docker ps -a hat festgestellt, dass der Status des Containers „Tot“ war. Ich habe viele Informationen online nachgeschlagen, z. B. erzwungenes Löschen, Überprüfen des Mount-Status, manuelles Löschen von Ordnern und Überprüfen der Portbelegung. Habe fast alles probiert, keine Wirkung. Schließlich habe ich, wahrscheinlich aufgrund von Erfahrung, irgendwie sowohl nginx als auch httpd ausgeschaltet und dann gelöscht. Fragen Sie mich nicht, warum ich nginx und httpd auf demselben Server installiert habe. Dieses Projekt war ursprünglich ein von ihnen bereitgestelltes PHP-Projekt. Nachdem ich es übernommen hatte, habe ich selbst nginx verwendet. Es gibt noch ein weiteres sehr seltsames Problem. Obwohl es gelöst wurde, verstehe ich immer noch nicht ganz, warum es aufgetreten ist. In der Benutzertabelle gibt es ein last_password_reset_date. Wenn sich der Benutzer anmeldet, wird dieses Zeitfeld überprüft und das Token wird immer als ungültig gemeldet. Nach dem Eingeben der Protokolle jedes Felds wurde festgestellt, dass sich dieses Feld um 10 Stunden von der Zeit in der Datenbank unterschied. Damals dachte ich, es sei ein Zeitzonenproblem. Die Zeit eines anderen register_date-Felds in derselben Tabelle ist jedoch normal, sodass die Zeitzone nicht verarbeitet wird. Nach langer Untersuchung dachte ich, dass der von Java akzeptierte Zeittyp falsch war oder dass ein Kollege dieses Feld bearbeitet hatte. Es wurde noch nicht behoben. Später habe ich die Testbibliothek zur Online-Umgebung hinzugefügt und festgestellt, dass sie wieder normal war. Schließlich habe ich die Zeitzone der Testumgebungsdatenbank überprüft, sie betrug GMT+8. Die Online-Bibliothek ist der Standard-GTM. Ändern Sie abschließend einfach die offizielle Datenbankzeit auf den East 8th District. Ein anderes ist Redis, da es zuvor einen öffentlichen Kontodienst gab, der Redis verwendete, und sich der Redis-Dienst zu diesem Zeitpunkt auf dem Hostcomputer befand. Ich dachte also darüber nach, eine Verbindung zum Server-Host herzustellen, konnte dies aber zunächst nicht. Später änderte ich die Redis-Konfigurationsdatei und band den Bind-Parameter an die Intranet-IP. Verwenden Sie dann die Intranet-IP, um im Programm eine Verbindung zu Redis herzustellen. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Tiefgreifendes Verständnis des Slot-Scopes in Vue (für Anfänger geeignet)
>>: MySQL 5.0.96 für Windows x86 32-Bit Green - vereinfachte Version - Installations-Tutorial
In diesem Artikelbeispiel wird der spezifische Co...
Anfänger können HTML lernen, indem sie einige HTM...
Inhaltsverzeichnis 1. Bestimmen Sie den Entitätst...
1. Die blaue Farbe des Tags wird aufgehoben, wenn...
Inhaltsverzeichnis 2. Zweck 2.1 Objekten Eigensch...
Ich bin auf die Anforderung gestoßen, Tastenkombi...
Das <canvas>-Element ist für clientseitige ...
Als ich kürzlich jQuery lernte, stieß ich auf die...
Was ist HTTP-Komprimierung Manchmal werden relati...
Hintergrund Lassen Sie mich zunächst den Hintergr...
Nach einer langen Zeit der Transplantation und In...
Betriebssystem: Windows 10_x64 Python-Version: 3....
Kürzlich hat das WeChat Mini-Programm Anpassungen...
Inhaltsverzeichnis Überblick Code-Implementierung...