Ich entschuldige mich für diese Frage im Voraus. Ich bin neu in Docker und habe langsam versucht, es zu lernen. Ich habe mir viele andere Fragen angesehen, um zu sehen, ob ich dies tatsächlich posten könnte, oder ist meine Frage bereits beantwortet. Nachdem ich die vorherigen Fragen gelesen habe, bin ich immer noch verwirrt über eine Spring -Startanwendung von Docker Container, die keine Verbindung zu einer Datenbank in einem anderen Container herstellen kann. Ich werde also einige der Kommentare hinzufügen, die ich gesehen habe, und Sie können mich bei meiner Fehlinterpretation der Informationen korrigieren, die ich gesehen habe. Vor Monaten habe ich Docker installiert und einen MySQL8: neuesten Container aus dem neuesten Bild von DockerHub erstellt. Es läuft, aber ich kann es jederzeit stoppen. Ich erinnere mich nicht, was der genaue Befehl startete, aber es war wahrscheinlich die Standardeinstellung aus den Anweisungen von DockerHub: https://hub.docker.com/_/mysql
Nun, das wird ausgeführt, und ich kann es anhalten und versuchen, es mit neuen Befehlen neu zu starten. Ich möchte das Bild, das ich habe, nicht löschen, und ich möchte den Behälter, den ich habe, nicht loswerden. Es enthält mehrere Datenbanken für persönliche Projekte und einige Daten, die ich gewünscht habe. Ich möchte nicht mehrere Datenbanken sichern müssen, obwohl ich es auch tun könnte, wenn ich muss, ich ziehe es einfach vor, es nicht zu tun. Diese Datenbank (MySQL) wurde auf Port 3306 eingerichtet.src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://mysql-db:3306/my_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=myuser
spring.datasource.password=password
< /code>
In der 'url' Der Wert 'MySQL-DB' ist der Container Name, wie ich sehe, dass dies nicht 'localhost' sein kann. Ich verstehe, dass jeder Docker -Container sein eigener VM ist, und Localhost wird nicht funktionieren, also verstehe ich das. Jetzt baut der Springboot gut auf, da ich die Datei von Application.Properties zum Testen und geändert habe, um den Speicherort der Datenbank zu testen und zu ändern. < /P>
src/test/resources/application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=myuser
spring.datasource.password=password
< /code>
Aus diesem Grund funktionieren alle meine JUNIT -Tests gegen die Datenbank großartig. Jetzt kommt das Problem, wenn ich erstelle, bereitete und im Bild zu einem neuen Docker -Container eingreife. Ich möchte den vorhandenen Container verwenden, und ich muss herausfinden, wie das geht, und das habe ich gesucht. Lassen Sie mich also zunächst die Dockerfile zeigen, und Sie können mir sagen, ob etwas daran nicht stimmt: < /p>
FROM openjdk:23
ARG JAR_FILE=target/*.jar
COPY ./target/htmx-demo-0.0.1-SNAPSHOT.jar htmx-demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","htmx-demo-0.0.1-SNAPSHOT.jar"]
< /code>
Ich habe keinen Laufbefehl, weil es Probleme hatte, also habe ich ihn entfernt. Ich weiß nicht, ob ich es brauche, aber das scheint vorerst zu funktionieren. Bitte lassen Sie mich wissen, ob noch etwas benötigt wird. Als nächstes kommt die Compose.yml -Datei, die ich verwende, und lassen Sie mich das hier rausbringen.services:
mysql:
container_name: mysql-db /* already exists */
image: mysql
environment:
MYSQL_DATABASE: phonebook_db
MYSQL_USER: operator
MYSQL_PASSWORD: passw0rd
MYSQL_ROOT_PASSWORD: passw0rd
ports:
- "3306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
networks:
- my_network
htmx-demo-app:
build: .
ports:
- "8080:80"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/phonebook_db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&createDatabaseIfNotExist=true
SPRING_DATASOURCE_USERNAME: operator
networks:
- my_network
networks:
my_network:
driver: bridge
< /code>
Lassen Sie mich diese compose.yml -Datei auspacken: < /p>
[*] Ich verstehe, dass es sich bei compose.yml um die Orchestrierung handelt. Wenn die App zuerst ausgeführt werden muss, werden diese Dinge zuerst eingerichtet. Der erste Dienst ist also die MySQL -Datenbank. Ich brauche dies nicht, um einen neuen Container für MySQL zu erstellen, wenn es bereits existiert. Ich weiß bereits, dass die Datenbank ausgeführt wird, keine Frage. Ich kann mich mit Workbench verbinden. Ich hatte angenommen, dass wenn ein Container existiert würde, es sagen würde, dass er bereits existiert und keinen neuen Container erstellen würde. Wenn ich den Befehl Spring Boot Run ausführe, erhalte ich eine Fehlermeldung, dass der Container bereits vorhanden ist. Sie hatten eine MySQL -Datenbank mit Daten geladen, und das war in ihrem eigenen Container. Als Sie sich die compose.yml -Datei ansah, befand sich die MySQL nicht in der Datei compose.yml, sodass sie nicht versuchen würde, eine neue zu erstellen. Dies ist etwas, das ich wahrscheinlich beheben werde. Die Ports sind richtig und wir verwenden ein Netzwerk. Ich nehme an, wenn dieses Netzwerk nicht existiert, wird es erstellt. Als ich andere Antworten las, wurde gesagt, dass Docker bereits ein "Standard" -Netzwerk hat, und wenn alle Container auf einer physischen Maschine wie meiner sind, würde ich das Problem lösen. Auch hier ist der 'MySQL-DB' der Containername und nicht 'localhost'. Wenn das Bild für die App jedoch in Docker erstellt und bereitgestellt wird, stellen wir fest, dass wir MySQL-DB absolut nicht finden können, also weiß ich nicht warum? Es ist sehr frustart. Ich gehe davon aus, dass dies das Netzwerk erstellt, wenn keine existiert, und sicherlich wird die App in dieses Netzwerk gestellt. Ich weiß nicht, ob dies erledigt werden muss, weil diese Container alle auf einer Maschine sind (mein physischer Laptop), und so sollte es ein Standardnetzwerk geben, in dem bereits ein Standardnetzwerk vorhanden ist. Straße, ich habe einen Kafka-Container und ich möchte, dass meine Spring-Boot-App im Container mit diesem Kafka auch in einem Docker-Container spricht. Ich möchte nicht, dass sich das Front-End auf das Back-End verlassen. In dieser Nicht-pro-pro-Umgebung übernehme ich die Verantwortung, sicherzustellen, dass die Dienste zuerst liefern, bevor ich ein Front-End starte, wenn die Back-End- oder Datenbank nicht ausgeführt wird. Kafka muss als nächstes gestartet werden
Dann kann der Back-End beginnen, da Kafka und der DB gestartet werden.>
Springboot -App im Docker -Container kann nicht mit einer Datenbank sprechen, die bereits in einem anderen Container ist ⇐ MySql
-
- Similar Topics
- Replies
- Views
- Last post