Maison  >  Article  >  Docker Compose + Spring Boot + Postgres

Docker Compose + Spring Boot + Postgres

WBOY
WBOYavant
2024-02-11 15:39:09843parcourir

L'éditeur PHP Xigua vous propose aujourd'hui un tutoriel sur la façon d'utiliser Docker Compose pour connecter Spring Boot et Postgres. Docker Compose est un outil permettant de définir et d'exécuter des applications Docker multi-conteneurs, tandis que Spring Boot est un framework pour créer des applications Java et Postgres est une puissante base de données relationnelle. En utilisant ces trois éléments ensemble, nous pouvons facilement créer un environnement de développement comprenant une application Spring Boot et une base de données Postgres. Ce didacticiel vous guidera étape par étape pour apprendre à configurer et connecter les trois, afin que vous puissiez rapidement commencer à développer vos applications.

Contenu de la question

J'ai une application Java Spring Boot qui fonctionne avec une base de données Postgres. Je souhaite utiliser Docker pour les deux. Au départ, je viens de mettre Postgres dans Docker et j'ai défini un fichier docker-compose.yml comme ceci :

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: {}

Ensuite, lorsque j'émets la commande sudo dockerdsudo docker-compose -f docker-compose.yml up 时,它正在启动数据库。例如,我可以使用 pgAdmin 进行连接,使用 localhost 作为服务器和端口 5432。然后,在我的 Spring Boot 应用程序中,在 application.properties, les propriétés suivantes sont définies dans le fichier.

spring.datasource.url=jdbc:postgresql://localhost:5432/sample
spring.datasource.username=sample
spring.datasource.password=sample
spring.jpa.generate-ddl=true

À ce stade, je peux exécuter mon application Spring Boot localement via Spring Suite et tout fonctionne bien. Ensuite, je souhaite également ajouter mon application Spring Boot en tant qu'image Docker. J'ai d'abord créé un Dockerfile dans le répertoire du projet comme indiqué ci-dessous :

FROM java:8
EXPOSE 8080
ADD /target/manager.jar manager.jar
ENTRYPOINT ["java","-jar","manager.jar"]

Ensuite, je suis entré dans le répertoire du projet où mvn clean a été publié, puis mvn install. Ensuite, émettez docker build -f Dockerfile -t manager . suivi de docker tag 9c6b1e3f1d5e myuser/manager:latest (l'identifiant est correct). Finalement, j'ai édité le fichier mvn clean的项目目录,然后是mvn install。接下来,发出 docker build -f Dockerfile -t manager . ,后跟 docker tag 9c6b1e3f1d5e myuser/manager:latest (id 是正确的)。最后,我编辑了现有的 docker-compose.yml existant comme ceci :

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: {}

Cependant, maintenant, si j'émets la commande sudo docker-compose -f docker-compose.yml up, la base de données redémarre correctement, mais j'obtiens une erreur et je sors avec le code 1 de la section de l'application Web. Le problème est la chaîne de connexion. Je crois que je dois le remplacer par autre chose mais je ne sais pas ce que cela devrait être. J'obtiens le message d'erreur suivant :

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

Des idées ?

Solution de contournement

Chaque conteneur possède sa propre interface réseau et son propre hôte local. Alors changez la façon dont Java pointe vers Postgres :

spring.datasource.url=jdbc:postgresql://localhost:5432/sample

À :

spring.datasource.url=jdbc:postgresql://db:5432/sample

db résoudra la bonne adresse IP Postgres.

Bonus. Avec docker-compose, vous n'avez pas besoin de créer des images manuellement. Alors changez :

web:
  image: myuser/manager:latest

À :

web:
  build: .

J'ai eu le même problème et il m'a fallu du temps pour le comprendre et le résoudre :

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.

Je montre toutes les propriétés pour que tout le monde puisse comprendre. 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:

Pour lancer l'application Spring à l'aide d'une base de données locale, nous utilisons l'url localhost. Afin de nous connecter au conteneur à l'aide d'une base de données, nous devons changer le "localhost" sur le service de base de données, dans mon cas "localhost" en "db". Solution : Ajoutez l'environnement SPRING_DATASOURCE_URL dans docker-compose.yml中添加SPRING_DATASOURCE_URL环境,重写spring.datasource.url et réécrivez la valeur de connexion spring.datasource.url :

environment:
    SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/testdb

J'espère que cela aidera les gens à gagner du temps.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Besoin de @Bind ?Article suivant:Besoin de @Bind ?