Implementierungsbeispiel für die Docker-Bereitstellung von Front-End- und Back-End-Trennprojekten

Implementierungsbeispiel für die Docker-Bereitstellung von Front-End- und Back-End-Trennprojekten

1. Umweltvorbereitung

Server

Alibaba Cloud Server 1 Kern + 2 GB

Software

Diese Bereitstellung verwendet Docker, daher befindet sich die Softwareumgebung auf Docker.

Wir benötigen MySQL 8.0.x, Redis, Nginx. Laden Sie einfach das Image im Voraus herunter

2. Ausführen des Images

MySQL-Installation

Ich habe MySQL in der Version 8.0.x verwendet. Während des Bereitstellungsprozesses traten einige Probleme auf. Diese möchte ich hier mit Ihnen teilen.

Docker-Ausführung \
-p 3306:3306 \
--name mysql \
--privilegiert=true \
--restart sofern nicht gestoppt \
-v /home/mysql8.0.20/mysql:/etc/mysql \
-v /home/mysql8.0.20/logs:/logs \
-v /home/mysql8.0.20/data:/var/lib/mysql \
-v /home/mysql8.0.20/mysql-files:/var/lib/mysql-files \
-v /etc/lokaleZeit:/etc/lokaleZeit \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.20 \
--lower_case_table_names=1

Befehlserklärung:

 -p Port-Mapping --privileged=true Berechtigungseinstellung zum Mounten von Dateien --restart unless-stopped Automatischen Neustart des Containers nach dem Start festlegen -v /home/mysql8.0.20/mysql:/etc/mysql Konfigurationsdatei mounten -v /home/mysql8.0.20/logs:/logs \ Protokoll mounten -v /home/mysql8.0.20/data:/var/lib/mysql \ Datendatei dauerhaft auf dem Host mounten -v /home/mysql8.0.20/mysql-files:/var/lib/mysql-files MySQL8 muss diesen Ordner später synchronisieren -v /etc/localtime:/etc/localtime Containerzeit wird mit dem Host synchronisiert -e MYSQL_ROOT_PASSWORD=123456 Passwort festlegen -d mysql:8.0.20 Hintergrundstart,mysql
--lower_case_table_names=1 MySQL nicht mehr zwischen Groß- und Kleinschreibung unterscheiden (0: Groß- und Kleinschreibung beachten; 1: Groß- und Kleinschreibung nicht beachten)

Table XX.QRTZ_LOCKS doesn't exist 的問題tritt auf, bevor --lower_case_table_names=1 konfiguriert ist

Nach einer Suche auf Baidu stellte ich fest, dass die Konfiguration von MySQL 5.x und 8.x geringfügig unterschiedlich ist.

PS: Beim Start von MySQL 8.0.2 werden unterschiedliche lower_case_table_names-Einstellungen für Server ('1') und Datenwörterbuch ('0') gemeldet.

Nach der Installation von MySQL 8.0.20 wurde während der Initialisierung in my.cnf lower_case_table_names=1 gesetzt und beim Starten ein Fehler gemeldet:

Bildbeschreibung hier einfügen

wie folgt

Bildbeschreibung hier einfügen

Schauen Sie in der offiziellen MySQL-Dokumentation nach. Dort finden Sie folgende Einträge:

lower_case_table_names kann nur bei der Initialisierung des
Server. Ändern der Einstellung lower_case_table_names nach dem Server
initialisiert wird, ist verboten.

Dies ist nur wirksam, wenn während der Initialisierung lower_case_table_names=1 festgelegt wird, zum Beispiel:

--initialize --lower-case-table-names=1

Sehen

https://bugs.mysql.com/bug.php?id=90695

Lösung des Problems

Erstellen Sie eine Sicherungskopie, löschen Sie den ursprünglichen MySQL-Container, führen Sie MySQL erneut aus und fügen Sie am Ende des Befehls --lower_case_table_names=1 hinzu.

Seit MySQL 8 muss dieser Schritt während der Initialisierung festgelegt werden

Redis-Installation

docker run -p 6379:6379 --name redis -v /home/redis/data/:/data -d redis:3.2 redis-server --appendonly yes

Befehl Erklärung

-v /home/redis/data/:/data Datenverzeichnis mounten --appendonly yes Redis-Persistenz aktivieren

Nginx-Installation

Da ich das Verzeichnis mounten musste, habe ich den folgenden Befehl ausgeführt

Docker-Ausführung \
-D \
-p 80:80 \
--name nginx \
-v /home/nginx/conf:/etc/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-v /home/nginx/logs:/var/log/nginx \
nginx

Nach dem Ausführen stellte ich fest, dass es immer automatisch beendet wird. Nachdem ich die Protokollinformationen überprüft und auf Baidu gesucht hatte, stellte ich fest, dass das zu mountende Verzeichnis zuerst erstellt werden muss, wenn nginx gestartet wird, da es sonst automatisch beendet wird.

Daher müssen wir zuerst das Mount-Verzeichnis erstellen und dann den Befehl ausführen

3. Paketprojekt

Frontend

Ändern Sie devServer -Knotenzuordnungsport in vue.config.js damit er mit dem Backend-Port übereinstimmt.

Führen Sie den folgenden Befehl aus:

npm führt build:prod aus

Ein dist -Verzeichnis wird lokal generiert

hinteres Ende

  • Ändern Sie application.yml
  • Ändern Sie logback.xml log.path
  • MySQL- und Redis-Adressen ändern

Führen Sie den folgenden Befehl aus:

mvn sauber
MVN-Paket

Ein JAR-Paket wird unter target ruoyi-admin generiert, was wir brauchen

IV. Bereitstellung

Frontend

Konfigurieren Sie nginx. Ich habe mit der Konfiguration unter /nginx/conf/conf.d/default.conf begonnen, aber festgestellt, dass die Konfiguration nicht wirksam wurde. Später wurde es unter /nginx/conf/conf.d/nginx.conf konfiguriert. Die spezifische Konfiguration lautet wie folgt:

 Server {
        hören Sie 80;
        server_name localhost; # Sie können die Server-IP anstelle des Standorts / { verwenden.
            root /usr/share/nginx/html/dist/;
            index index.html index.htm index-Anmeldung;
            try_files $uri $uri/ /index.html zuletzt;
        }
        Standort /prod-api/ {
            Proxy_set_header Host $http_host;
            Proxy_Set_Header X-Real-IP $Remote_Addr;
            Proxy_Set_Header REMOTE-HOST $remote_addr;
            proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
            proxy_pass http://localhost:7777/; # kann durch Server-IP ersetzt werden}
     }

Nachdem ich es bereitgestellt hatte, stellte ich fest, dass beim Aktualisieren in einem anderen Verzeichnis als dem Stammverzeichnis 404 Not Found angezeigt wurde. Ich habe die folgende Lösung gefunden:

Fügen Sie beim Konfigurieren des Speicherorts try_files $uri $uri/ /index.html last;

hinteres Ende

Ich verwende Dockerfile + jar verpackt in einer gespiegelten Bereitstellungsmethode

Docker-Datei

VON java:8

VOLUMEN /jiang

ADD ruoyi-admin.jar app.jar

EXPOSE 7777

EINSTIEGSPUNKT ["java","-jar","app.jar"]

Erstellen Sie einen Ordner auf dem Server, legen Sie Dockerfile 和jar包darin ab und führen Sie den folgenden Befehl aus, um das Image zu generieren

docker build -t ruoyi-vue.

Hinweis: Am Ende gibt es noch eine .

An diesem Punkt müssen wir nur noch das generierte Bild ausführen

docker run -d -p 7777:7777 --name nflj-vue ruoyi-vue

Dies ist das Ende dieses Artikels über das Implementierungsbeispiel der Docker-Bereitstellung von Front-End- und Back-End-Trennprojekten. Weitere verwandte Docker-Bereitstellungen von Front-End- und Back-End-Trennprojekten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So verwenden Sie Docker-Compsoe zum Bereitstellen eines Projekts mit Front-End- und Back-End-Trennung

<<:  So implementieren Sie mehrere Parameter in el-dropdown in ElementUI

>>:  Beispiel für die Zuweisung von Werten zu ActiveX-Steuerelementeigenschaften anhand des Parameternamens in einer Webseite

Artikel empfehlen

MySQL-Replikation - ausführliche Erklärung und einfaches Beispiel

MySQL-Replikation - ausführliche Erklärung und ei...

Implementieren eines Tabellen-Scrollkarusselleffekts durch CSS-Animation

Eine Anwendung einer CSS-Animation mit demselben ...

Detaillierte Erklärung zur Verwendung von umask unter Linux

Ich habe vor Kurzem angefangen, Linux zu lernen. ...

Heute bin ich auf ein sehr seltsames Problem gestoßen und habe es selbst gelöst

...Es ist so, heute wollte ich ein Popup-Fenster m...

Zusammenfassung mehrerer häufig verwendeter CentOS7-Images basierend auf Docker

Inhaltsverzeichnis 1 Docker installieren 2 Konfig...

Mit HTML+CSS3 implementierte Anmeldeschnittstelle

Ergebnisse erzielen Bauen Sie zunächst mit HTML e...

Grundsätze für die Bereitstellung und Konfiguration mehrerer Tomcat-Instanzen

1. Schalten Sie die Firewall aus und übertragen S...

Implementierung des Docker-Verpackungsimages und Konfigurationsänderung

Ich bin in letzter Zeit beim Erlernen von Docker ...

So zeigen Sie Webseiten in verschiedenen Auflösungen und Browsern richtig an

Die Schlüsselcodes lauten wie folgt: Code kopieren...

Erweiterte Erklärung der Javascript-Funktionen

Inhaltsverzeichnis Funktionsdefinitionsmethode Fu...

Detaillierte Erklärung zu React Hooks

Inhaltsverzeichnis Was sind Hooks? Klassenkompone...

Implementierung der CSS-Rahmenlängensteuerungsfunktion

Wenn die Rahmenlänge früher kleiner als der Conta...