PHP-Editor Xigua präsentiert Ihnen heute ein Tutorial, wie Sie Docker Compose verwenden, um Spring Boot und Postgres zu verbinden. Docker Compose ist ein Tool zum Definieren und Ausführen von Docker-Anwendungen mit mehreren Containern, während Spring Boot ein Framework zum Erstellen von Java-Anwendungen ist und Postgres eine leistungsstarke relationale Datenbank ist. Durch die Kombination dieser drei können wir problemlos eine Entwicklungsumgebung erstellen, die eine Spring Boot-Anwendung und eine Postgres-Datenbank umfasst. In diesem Tutorial lernen Sie Schritt für Schritt, wie Sie alle drei konfigurieren und verbinden, damit Sie schnell mit der Entwicklung Ihrer Anwendungen beginnen können.
Ich habe eine Java Spring Boot-Anwendung, die mit einer Postgres-Datenbank funktioniert. Ich möchte Docker für beide verwenden. Ich habe Postgres zunächst einfach in Docker eingefügt und eine docker-compose.yml
-Datei wie folgt definiert:
version: '2' services: db: container_name: sample_db image: postgres:9.5 volumes: - sample_db:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=sample - POSTGRES_USER=sample - POSTGRES_DB=sample - PGDATA=/var/lib/postgresql/data/pgdata ports: - 5432:5432 volumes: sample_db: {}
Wenn ich dann den Befehl gebe sudo dockerd
和 sudo docker-compose -f docker-compose.yml up
时,它正在启动数据库。例如,我可以使用 pgAdmin
进行连接,使用 localhost
作为服务器和端口 5432
。然后,在我的 Spring Boot 应用程序中,在 application.properties
, werden die folgenden Eigenschaften in der Datei definiert.
spring.datasource.url=jdbc:postgresql://localhost:5432/sample spring.datasource.username=sample spring.datasource.password=sample spring.jpa.generate-ddl=true
Jetzt kann ich meine Spring Boot-Anwendung lokal über Spring Suite ausführen und alles funktioniert einwandfrei. Dann möchte ich auch meine Spring Boot-Anwendung als Docker-Image hinzufügen. Ich habe zunächst eine Docker-Datei im Projektverzeichnis erstellt, wie unten gezeigt:
FROM java:8 EXPOSE 8080 ADD /target/manager.jar manager.jar ENTRYPOINT ["java","-jar","manager.jar"]
Dann habe ich das Projektverzeichnis eingegeben, in dem mvn clean
veröffentlicht wurde, und dann mvn install
. Geben Sie als Nächstes docker build -f Dockerfile -t manager .
ein, gefolgt von docker tag 9c6b1e3f1d5e myuser/manager:latest
(die ID ist korrekt). Abschließend habe ich die vorhandene mvn clean
的项目目录,然后是mvn install
。接下来,发出 docker build -f Dockerfile -t manager .
,后跟 docker tag 9c6b1e3f1d5e myuser/manager:latest
(id 是正确的)。最后,我编辑了现有的 docker-compose.yml
-Datei wie folgt bearbeitet:
version: '2' services: web: image: myuser/manager:latest ports: - 8080:8080 depends_on: - db db: container_name: sample_db image: postgres:9.5 volumes: - sample_db:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=sample - POSTGRES_USER=sample - POSTGRES_DB=sample - PGDATA=/var/lib/postgresql/data/pgdata ports: - 5432:5432 volumes: sample_db: {}
Wenn ich jetzt jedoch den Befehl sudo docker-compose -f docker-compose.yml up
gebe, startet die Datenbank wieder korrekt, aber ich erhalte eine Fehlermeldung und beende den Vorgang mit Code 1 des Webanwendungsabschnitts. Das Problem ist die Verbindungszeichenfolge. Ich glaube, ich muss es in etwas anderes ändern, aber ich weiß nicht, was es sein soll. Ich erhalte folgende Fehlermeldung:
web_1 | 2017-06-27 22:11:54.418 ERROR 1 --- [ main] o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool. web_1 | web_1 | org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections
Irgendwelche Ideen?
Jeder Container verfügt über eine eigene Netzwerkschnittstelle und einen eigenen lokalen Host. Ändern Sie also die Art und Weise, wie Java auf Postgres verweist:
spring.datasource.url=jdbc:postgresql://localhost:5432/sample
An:
spring.datasource.url=jdbc:postgresql://db:5432/sample
db
wird zur richtigen Postgres-IP aufgelöst.
Bonus. Mit Docker-Compose müssen Sie Images nicht manuell erstellen. Also ändern:
web: image: myuser/manager:latest
An:
web: build: .
Ich hatte das gleiche Problem und es hat einige Zeit gedauert, bis ich es verstanden und gelöst habe :
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
Ich zeige alle Eigenschaften, damit jeder sie verstehen kann.
application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.username=postgres spring.datasource.password=postgres spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL82Dialect spring.jpa.hibernate.ddl-auto=update
docker-compose.yml:
version: "3" services: springapp: build: . container_name: springapp environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/testdb ports: - 8000:8080 restart: always depends_on: - db db: image: postgres container_name: db environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=testdb - PGDATA=/var/lib/postgresql/data/pgdata ports: - 5000:5432 volumes: - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata:
Um die Spring-Anwendung mithilfe einer lokalen Datenbank zu starten, verwenden wir die URL localhost.
Um über eine Datenbank eine Verbindung zum Container herzustellen, müssen wir den „localhost“ im Datenbankdienst ändern, in meinem Fall „localhost“ in „db“.
Lösung: Fügen Sie die Umgebung SPRING_DATASOURCE_URL
in docker-compose.yml
中添加SPRING_DATASOURCE_URL
环境,重写spring.datasource.url
hinzu und schreiben Sie den Verbindungswert spring.datasource.url
neu:
environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/testdb
Ich hoffe, das hilft den Leuten, Zeit zu sparen.
Das obige ist der detaillierte Inhalt vonDocker Compose + Spring Boot + Postgres-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!