Home > Java > Docker Compose + Spring Boot + Postgres connection

Docker Compose + Spring Boot + Postgres connection

WBOY
Release: 2024-02-11 15:39:09
forward
953 people have browsed it

php editor Xigua today brings you a tutorial on how to use Docker Compose to connect Spring Boot and Postgres. Docker Compose is a tool for defining and running multi-container Docker applications, while Spring Boot is a framework for building Java applications, and Postgres is a powerful relational database. By using these three together, we can easily build a development environment that includes a Spring Boot application and a Postgres database. This tutorial will take you step-by-step to learn how to configure and connect all three, so you can quickly start developing your applications.

Question content

I have a Java Spring Boot application that works with a Postgres database. I want to use Docker for both of them. I initially just put Postgres into Docker and had a docker-compose.yml file defined like this:

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: {}
Copy after login

Then when I issue the commands sudo dockerd and sudo docker-compose -f docker-compose.yml up it is starting the database. For example, I can connect using pgAdmin, using localhost as the server and port 5432. Then, in my Spring Boot application, the following properties are defined in the application.properties file.

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

At this point, I can run my Spring Boot application locally through Spring Suite and everything works fine. Then, I also want to add my Spring Boot application as a Docker image. I first created a Dockerfile in the project directory as follows:

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

Then I went into the project directory where mvn clean was released, then mvn install. Next, issue docker build -f Dockerfile -t manager . followed by docker tag 9c6b1e3f1d5e myuser/manager:latest (the id is correct). Finally, I edited the existing docker-compose.yml file to look like this:

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: {}
Copy after login

However, now if I issue the sudo docker-compose -f docker-compose.yml up command, the database starts correctly again but I get an error and exit with code 1 of the web application section . The problem is the connection string. I believe I have to change it to something else but I don't know what it should be. I receive the following error message:

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
Copy after login

Any ideas?

Solution

Each container has its own network interface and its own local host. So change the way Java points to Postgres:

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

To:

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

db will resolve to the correct Postgres IP.

<小时>

bonus. With docker-compose, you don't need to build images manually. So change:

web:
  image: myuser/manager:latest
Copy after login

To:

web:
  build: .
Copy after login

I had the same problem and it took me some time to understand and solve it:

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.
Copy after login

I show all properties so everyone can understand. 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
Copy after login

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:
Copy after login

In order to start the Spring application using a local database, we use the url localhost. In order to connect to the container using the database we need to change the "localhost" on the database service, in my case "localhost" to "db". Solution: Add the SPRING_DATASOURCE_URL environment in docker-compose.yml and rewrite the spring.datasource.url connection value:

environment:
    SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/testdb
Copy after login

I hope this helps people save time.

The above is the detailed content of Docker Compose + Spring Boot + Postgres connection. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template