40 – PostgreSQL and Docker

Introduction to PostgreSQL and Docker

Docker is a popular platform for developing, shipping, and running applications inside containers. It provides a consistent environment for your applications, making it easier to manage dependencies and deploy applications across different systems. PostgreSQL, an open-source relational database management system, can also be containerized using Docker. In this guide, we will explore how to use Docker with PostgreSQL, including installation, containerization, and best practices.

Installing Docker

Before you can use Docker with PostgreSQL, you need to install Docker on your system. The installation process varies depending on your operating system, but Docker provides official installation guides for Windows, macOS, and various Linux distributions. Ensure that you have Docker installed and running before proceeding.

Creating a PostgreSQL Container

Once Docker is installed, you can create a PostgreSQL container with a single command. The official PostgreSQL Docker image is available on Docker Hub, making it easy to get started.

Example:

Creating a PostgreSQL container named ‘my-postgres’:


docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

In this example, we run a PostgreSQL container named ‘my-postgres,’ set the database password, detach it in the background with -d, and map port 5432 from the container to the host system. This allows you to connect to the PostgreSQL server using your host machine.

Connecting to PostgreSQL

With the PostgreSQL container running, you can connect to it using a PostgreSQL client, such as psql or a database administration tool. You’ll need to provide the container’s IP address, which you can obtain using the following command:


docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-postgres

Once you have the IP address, you can connect to PostgreSQL:


psql -h  -U postgres -d postgres

Replace with the actual IP address obtained from the previous command.

Managing Data Persistence

By default, containers are ephemeral, meaning that data is lost when the container is removed. To ensure data persistence, you can use Docker volumes or bind mounts to store PostgreSQL data on the host system.

Example:

Creating a PostgreSQL container with a volume for data persistence:


docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 -v /path/on/host:/var/lib/postgresql/data postgres

In this example, the -v flag is used to create a volume that maps the /path/on/host directory on the host system to /var/lib/postgresql/data inside the container, where PostgreSQL stores its data.

Custom Configuration

You can customize the PostgreSQL container by providing your configuration files. For instance, you can use a custom postgresql.conf or pg_hba.conf by mounting them into the container.

Example:

Running a PostgreSQL container with custom configuration files:


docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 -v /path/to/custom/conf:/etc/postgresql postgres

In this example, custom configuration files in /path/to/custom/conf on the host are mounted into the container’s /etc/postgresql directory.

Using Docker Compose

Docker Compose is a tool for defining and running multi-container Docker applications. It’s a convenient way to manage complex applications that require multiple services, including PostgreSQL. You can define your PostgreSQL service, its environment variables, and any other related services in a docker-compose.yml file.

Example:

A simple docker-compose.yml file for a PostgreSQL service:


version: '3'
services:
  postgres:
    image: postgres
    container_name: my-postgres
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    ports:
      - 5432:5432
    volumes:
      - /path/on/host:/var/lib/postgresql/data

You can start this service using the docker-compose up command.

Backing Up and Restoring Data

Regular backups are crucial for data integrity. Docker provides tools for creating backups of containers, but for PostgreSQL, it’s recommended to use native PostgreSQL tools like pg_dump for backups and pg_restore for restores. You can run these commands inside the PostgreSQL container to back up and restore your data.

Example:

Backing up the PostgreSQL database:


docker exec -t my-postgres pg_dump -U postgres -d postgres > backup.sql

Restoring the database from a backup:


cat backup.sql | docker exec -i my-postgres psql -U postgres -d postgres
Best Practices for PostgreSQL and Docker

When working with PostgreSQL and Docker, consider the following best practices:

  • Data Backup: Regularly back up your PostgreSQL data using native tools to prevent data loss.
  • Use Custom Images: Create custom Docker images with your configuration and dependencies to ensure consistency.
  • Data Persistence: Ensure data persistence by using volumes or bind mounts.
  • Security: Secure your PostgreSQL container by managing access and credentials securely.
Conclusion

Using Docker with PostgreSQL is a powerful combination for developing, testing, and deploying database applications. It allows for consistent and reproducible database environments while offering flexibility and data persistence. By following best practices and utilizing custom configurations, you can harness the full potential of PostgreSQL and Docker for your database projects.