Rumah  >  Artikel  >  Docker Compose + Spring Boot + Postgres 连接

Docker Compose + Spring Boot + Postgres 连接

WBOY
WBOYke hadapan
2024-02-11 15:39:09932semak imbas

Editor PHP Xigua hari ini membawakan anda tutorial tentang cara menggunakan Docker Compose untuk menyambungkan Spring Boot dan Postgres. Docker Compose ialah alat untuk mentakrif dan menjalankan aplikasi Docker berbilang bekas, manakala Spring Boot ialah rangka kerja untuk membina aplikasi Java, dan Postgres ialah pangkalan data hubungan yang berkuasa. Dengan menggunakan ketiga-tiga ini bersama-sama, kita boleh membina persekitaran pembangunan dengan mudah yang merangkumi aplikasi Spring Boot dan pangkalan data Postgres. Tutorial ini akan membawa anda langkah demi langkah untuk mengetahui cara mengkonfigurasi dan menyambung ketiga-tiganya, supaya anda boleh mula membangunkan aplikasi anda dengan cepat.

Kandungan soalan

Saya mempunyai aplikasi Java Spring Boot yang berfungsi dengan pangkalan data Postgres. Saya mahu menggunakan Docker untuk kedua-duanya. Saya pada mulanya hanya meletakkan Postgres ke Docker dan mempunyai fail docker-compose.yml ditakrifkan seperti ini:

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

Kemudian apabila saya mengeluarkan arahan sudo dockerdsudo docker-compose -f docker-compose.yml up 时,它正在启动数据库。例如,我可以使用 pgAdmin 进行连接,使用 localhost 作为服务器和端口 5432。然后,在我的 Spring Boot 应用程序中,在 application.properties sifat berikut ditakrifkan dalam fail.

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

Pada ketika ini, saya boleh menjalankan aplikasi Spring Boot saya secara setempat melalui Spring Suite dan semuanya berfungsi dengan baik. Kemudian, saya juga ingin menambah aplikasi Spring Boot saya sebagai imej Docker. Saya mula-mula mencipta Dockerfile dalam direktori projek seperti yang ditunjukkan di bawah:

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

Kemudian, saya memasuki direktori projek tempat mvn clean dikeluarkan, kemudian mvn install. Seterusnya, keluarkan docker build -f Dockerfile -t manager . diikuti dengan docker tag 9c6b1e3f1d5e myuser/manager:latest (id adalah betul). Akhirnya, saya menyunting fail mvn clean的项目目录,然后是mvn install。接下来,发出 docker build -f Dockerfile -t manager . ,后跟 docker tag 9c6b1e3f1d5e myuser/manager:latest (id 是正确的)。最后,我编辑了现有的 docker-compose.yml sedia ada seperti ini:

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

Namun, sekarang jika saya mengeluarkan arahan sudo docker-compose -f docker-compose.yml up, pangkalan data bermula dengan betul sekali lagi, tetapi saya mendapat ralat dan keluar dengan kod 1 bahagian aplikasi web. Masalahnya ialah rentetan sambungan. Saya percaya saya perlu menukarnya kepada sesuatu yang lain tetapi saya tidak tahu apa yang sepatutnya. Saya mendapat mesej ralat berikut:

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

Ada idea?

Penyelesaian

Setiap bekas mempunyai antara muka rangkaian sendiri dan hos tempatannya sendiri. Jadi ubah cara Java menunjuk kepada Postgres:

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

Kepada:

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

db akan menyelesaikan IP Postgres yang betul.

Bonus. Dengan docker-compose, anda tidak perlu membina imej secara manual. Jadi tukar:

web:
  image: myuser/manager:latest

Kepada:

web:
  build: .

Saya mengalami masalah yang sama dan saya mengambil sedikit masa untuk memahami dan menyelesaikannya :

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.

Saya tunjukkan semua hartanah supaya semua orang boleh faham. 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:

Untuk melancarkan aplikasi Spring menggunakan pangkalan data tempatan, kami menggunakan url localhost. Untuk menyambung ke bekas menggunakan pangkalan data kita perlu menukar "localhost" pada perkhidmatan pangkalan data, dalam kes saya "localhost" kepada "db". Penyelesaian: Tambahkan persekitaran SPRING_DATASOURCE_URL dalam docker-compose.yml中添加SPRING_DATASOURCE_URL环境,重写spring.datasource.url dan tulis semula nilai sambungan spring.datasource.url:

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

Saya harap ini membantu orang ramai menjimatkan masa.

Atas ialah kandungan terperinci Docker Compose + Spring Boot + Postgres 连接. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Perlukan @Bind?Artikel seterusnya:Perlukan @Bind?