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.
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 dockerd
和 sudo 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 ?
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!