How to Connect Docker Compose with Spring Boot and Postgres?

To connect Docker Compose with Spring Boot and Postgres, we need to set up a Docker Compose environment. This environment helps us run our Spring Boot app and Postgres database together. We do this by configuring our application properties, making a Dockerfile for our Spring Boot app, and writing a Docker Compose file. This file describes the services we need for both Spring Boot and Postgres. When we follow these steps, our app will run well in a containerized environment.

In this article, we will show how to connect Docker Compose with Spring Boot and Postgres. We will cover important topics like setting up the Docker Compose environment, configuring Spring Boot application properties for Postgres, creating a Dockerfile for the Spring Boot app, writing a Docker Compose file, and connecting Spring Boot with Postgres. We will also answer some common questions about this integration. Here is what we will cover:

  • Setting Up Your Docker Compose Environment for Spring Boot and Postgres
  • Configuring Spring Boot Application Properties for Postgres
  • Creating Dockerfile for Spring Boot Application
  • Writing Docker Compose File for Spring Boot and Postgres
  • Connecting Spring Boot to Postgres Using Docker Compose
  • Frequently Asked Questions

Setting Up Your Docker Compose Environment for Spring Boot and Postgres

To set up our Docker Compose environment for a Spring Boot app with PostgreSQL, we can follow these steps:

  1. Install Docker and Docker Compose: First, we need to make sure Docker and Docker Compose are installed on our machine. We can check this guide on how to install Docker on different operating systems.

  2. Create a Project Directory: Next, we create a new folder for our Spring Boot app and go into it.

    mkdir spring-boot-postgres-docker
    cd spring-boot-postgres-docker
  3. Create a Spring Boot Application: We will use Spring Initializr (https://start.spring.io/) to make a Spring Boot project. We need to add these dependencies:

    • Spring Web
    • Spring Data JPA
    • PostgreSQL Driver

    After that, we download the project and extract it in our folder.

  4. Dockerfile Creation: Now, we create a Dockerfile in our project folder for our Spring Boot app:

    FROM openjdk:11-jre
    VOLUME /tmp
    COPY target/myapp.jar app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  5. Docker Compose File: We also need to make a docker-compose.yml file in our project folder:

    version: '3.8'
    services:
      postgres:
        image: postgres:latest
        restart: always
        environment:
          POSTGRES_DB: mydatabase
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data
    
      spring-boot-app:
        build: .
        ports:
          - "8080:8080"
        depends_on:
          - postgres
        environment:
          SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/mydatabase
          SPRING_DATASOURCE_USERNAME: user
          SPRING_DATASOURCE_PASSWORD: password
    
    volumes:
      postgres_data:
  6. Build and Run Docker Compose: Finally, we run this command to build and start our containers:

    docker-compose up --build

This setup will create a PostgreSQL database and a Spring Boot app connected to it in our Docker Compose environment. We can change the database name, username, and password as we need for our configuration.

Configuring Spring Boot Application Properties for Postgres

To connect a Spring Boot app with PostgreSQL using Docker Compose, we need to set the application properties correctly. We must set the database URL, username, password, and JPA properties.

In your application.properties file, we add this configuration:

# PostgreSQL Database Configuration
spring.datasource.url=jdbc:postgresql://postgres:5432/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=org.postgresql.Driver

# JPA Configuration
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

Explanation of Properties:

  • spring.datasource.url: This is the JDBC URL for connecting to the PostgreSQL database. It looks like jdbc:postgresql://<host>:<port>/<database>. Here, postgres is the service name from the Docker Compose file.

  • spring.datasource.username: This is the username we use to access the PostgreSQL database.

  • spring.datasource.password: This is the password for the username we set.

  • spring.datasource.driver-class-name: This is the driver class for PostgreSQL.

  • spring.jpa.hibernate.ddl-auto: This property tells Hibernate how to manage the database schema. Setting it to update will update the schema automatically.

  • spring.jpa.show-sql: We set this to true to log the SQL statements made by Hibernate.

  • spring.jpa.properties.hibernate.dialect: This sets the Hibernate dialect for PostgreSQL.

We should also have the PostgreSQL dependency in our pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

This setup lets our Spring Boot app connect smoothly with PostgreSQL when we use Docker Compose. For more details about Docker and its features, we can check What is Docker and Why Should You Use It?.

Creating Dockerfile for Spring Boot Application

To containerize our Spring Boot application, we need to create a Dockerfile. This file tells Docker how to set up the environment for our app and the steps to build the Docker image. Here is a simple example of a Dockerfile for a Spring Boot application.

# Use a base image with Java
FROM openjdk:11-jre-slim

# Set the working directory inside the container
WORKDIR /app

# Copy the jar file to the container
COPY target/my-spring-boot-app.jar app.jar

# Expose the port that your Spring Boot app runs on
EXPOSE 8080

# Command to run the application
CMD ["java", "-jar", "app.jar"]

Explanation of the Dockerfile

  • FROM: This tells Docker to use a base image called openjdk:11-jre-slim. It has the Java runtime environment.
  • WORKDIR: We set the working directory inside the container to /app.
  • COPY: This copies the JAR file from the target folder of our Spring Boot project into the container.
  • EXPOSE: This lets Docker know that our container listens on port 8080 when it runs.
  • CMD: This is the command to run our Spring Boot application when the container starts.

Building the Docker Image

To build the Docker image, we go to the directory where our Dockerfile is. Then we run this command:

docker build -t my-spring-boot-app .

This command makes a Docker image named my-spring-boot-app.

Running the Docker Container

After we build the image, we can run the container with this command:

docker run -p 8080:8080 my-spring-boot-app

This command connects port 8080 of our host to port 8080 of the container. Now we can access the Spring Boot application at http://localhost:8080.

By following this process, we can create a Dockerfile for our Spring Boot application. This lets us run it in a Docker container. For more details on Docker and what it can do, you can read this article on Docker images.

Writing Docker Compose File for Spring Boot and Postgres

To connect a Spring Boot app with PostgreSQL using Docker Compose, we need to create a docker-compose.yml file. This file tells Docker how to set up the app and the database. Let’s see how to do it.

version: '3.8'

services:
  springboot-app:
    image: your-spring-boot-image
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:5432/mydb
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: password
    depends_on:
      - postgres-db

  postgres-db:
    image: postgres:latest
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Explanation of the Docker Compose File

  1. Version: This shows the version of the Compose file format.
  2. Services:
    • springboot-app: This is the Spring Boot app service.
      • image: Change your-spring-boot-image to your real image name.
      • build: This is where Docker finds the build context and Dockerfile for the app.
      • ports: This connects port 8080 of our computer to port 8080 of the container.
      • environment: This sets the variables needed to connect to the database.
      • depends_on: This makes sure the PostgreSQL database starts before the Spring Boot app.
    • postgres-db: This is the PostgreSQL database service.
      • image: This uses the latest PostgreSQL image.
      • restart: This makes the container restart automatically unless we stop it.
      • ports: This connects the default PostgreSQL port.
      • environment: This sets the database name, user, and password.
      • volumes: This keeps PostgreSQL data safe using a volume.
  3. Volumes: This sets up a volume for storing PostgreSQL data.

Make sure to change the placeholders to your own settings and database details. After we create this file, we can run docker-compose up to start the app and the PostgreSQL database. For more info on Docker Compose, we can check what is Docker Compose and how does it simplify multi-container applications.

Connecting Spring Boot to Postgres Using Docker Compose

To connect a Spring Boot app to a PostgreSQL database with Docker Compose, we can follow these steps:

  1. Check Prerequisites: First, we need to make sure that we have Docker and Docker Compose installed. You can find how to install them here.

  2. Create a Spring Boot Application: Next, we need to set up our Spring Boot app. It should include the needed dependencies for PostgreSQL in our pom.xml file:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
  3. Setup application.properties: Now, we update our Spring Boot application.properties file with the PostgreSQL connection info:

    spring.datasource.url=jdbc:postgresql://db:5432/mydatabase
    spring.datasource.username=myuser
    spring.datasource.password=mypassword
    spring.jpa.hibernate.ddl-auto=update
  4. Make Dockerfile: We create a Dockerfile for our Spring Boot app:

    FROM openjdk:17-jdk-slim
    VOLUME /tmp
    COPY target/myapp.jar app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
  5. Write docker-compose.yml: We need to write a docker-compose.yml file to define our services:

    version: '3.8'
    services:
      db:
        image: postgres:14
        environment:
          POSTGRES_DB: mydatabase
          POSTGRES_USER: myuser
          POSTGRES_PASSWORD: mypassword
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data
    
      app:
        build: .
        ports:
          - "8080:8080"
        depends_on:
          - db
    
    volumes:
      postgres_data:
  6. Build and Run with Docker Compose: Finally, we run this command to build and start our containers:

    docker-compose up --build

Now, our Spring Boot app should connect to the PostgreSQL database that is running in Docker. We need to check that the database is set up right and can be accessed from the Spring Boot app.

Frequently Asked Questions

1. How do we set up a Spring Boot application to connect with PostgreSQL using Docker Compose?

To set up a Spring Boot application with PostgreSQL using Docker Compose, we start by making our docker-compose.yml file. We need to define services for both the Spring Boot app and the PostgreSQL database. It is important to specify the right image for PostgreSQL and set the necessary environment variables for database connection. For more details, we can look at our guide on How to Write a Simple Docker Compose YML File.

2. What are the common issues we face when connecting a Spring Boot application to PostgreSQL in Docker?

Common issues are connection timeout errors, wrong database settings in application properties, and network problems between containers. To fix these issues, we should check that our PostgreSQL container is running and can be reached from the Spring Boot container. We can also read our article on How to Troubleshoot Docker Networking Issues for more help.

3. How can we use Docker volumes for our PostgreSQL database in a Spring Boot application?

Using Docker volumes for our PostgreSQL database helps keep data safe even when containers restart. In our docker-compose.yml, we define a volume for the PostgreSQL service and connect it to the right data folder. This way, our data stays safe even if we recreate the container. To learn more, we can check our guide on What Are Docker Volumes and How Do They Work.

4. What is the best way to manage environment variables for Docker Compose in a Spring Boot application?

The best way to manage environment variables in Docker Compose is to use an .env file or set them directly in our docker-compose.yml. This makes it easy to configure and keeps sensitive data like database passwords separate from our code. For more insights, we can visit our article on How to Override Docker Compose Configurations.

5. How do Docker networks help communication between Spring Boot and PostgreSQL containers?

Docker networks help containers talk to each other by letting them find each other’s names. By creating a custom network in our docker-compose.yml, we can make sure our Spring Boot application connects to the PostgreSQL service using its name as the hostname. For more details, we can read our overview on How Does Docker Networking Work for Multi-Container Applications.