Heim >Java >Docker Compose + Spring Boot + Postgres-Funktion

Docker Compose + Spring Boot + Postgres-Funktion

WBOY
WBOYnach vorne
2024-02-11 15:39:09945Durchsuche

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.

Frageninhalt

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 dockerdsudo 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?

Workaround

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Benötigen Sie @Bind?Nächster Artikel:Benötigen Sie @Bind?