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