How to Connect Django to PostgreSQL Using Docker Compose?

To connect Django to PostgreSQL with Docker Compose, we need to set up our Docker environment correctly. First, we will create a Docker Compose file. This file will define both the Django app and the PostgreSQL database. When we follow the right steps, we can easily connect Django to PostgreSQL. This way, our web app can work well inside a container.

In this article, we will show you the important steps to connect Django to PostgreSQL using Docker Compose. We will explain how to create your Docker Compose file. We will also talk about how to set up Django settings for the PostgreSQL connection. After that, we will build and run our Docker containers. We will check if the connection works and fix common problems that might come up. Here is what we will talk about:

  • Setting Up Your Docker Compose File for Django and PostgreSQL
  • Configuring Django Settings for PostgreSQL Connection
  • Building and Running Your Docker Containers
  • Verifying the Connection Between Django and PostgreSQL
  • Troubleshooting Common Connection Issues
  • Frequently Asked Questions

Setting Up Your Docker Compose File for Django and PostgreSQL

To connect Django to PostgreSQL using Docker Compose, we need to make a docker-compose.yml file. This file will define our Django app and PostgreSQL service. Below is a simple example to set up these services.

version: '3.8'

services:
  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - mynetwork

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      DB_NAME: mydatabase
      DB_USER: myuser
      DB_PASSWORD: mypassword
      DB_HOST: db
      DB_PORT: 5432
    networks:
      - mynetwork

volumes:
  postgres_data:

networks:
  mynetwork:

Explanation:

  • db: This service uses the official PostgreSQL image. We set the database name, user, and password with environment variables. Data stays safe in a Docker volume named postgres_data.

  • web: This service builds the Django app. It runs the server and maps ports. It depends on the db service to make sure PostgreSQL is ready before Django starts.

  • Volumes: The postgres_data volume is for saving the database data.

  • Networks: We create a custom network called mynetwork to let services talk to each other.

We should place this docker-compose.yml file in the main folder of our Django project. Then we can run docker-compose up to start both services.

Configuring Django Settings for PostgreSQL Connection

We want to connect our Django app to a PostgreSQL database using Docker. To do this, we need to change the settings.py file in our Django project. We will update the DATABASES setting with the PostgreSQL connection info.

  1. Install psycopg2: First, we need to have the PostgreSQL adapter for Python. We can add it in our requirements.txt or install it by hand.

    pip install psycopg2-binary
  2. Update settings.py: Next, we modify the DATABASES setting in our Django settings.py file to use PostgreSQL. We replace the placeholders with our real database name, user, password, and host.

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'your_database_name',
            'USER': 'your_database_user',
            'PASSWORD': 'your_database_password',
            'HOST': 'db',  # This is the Docker service name for PostgreSQL
            'PORT': '5432',
        }
    }
  3. Environment Variables (Optional): It is good to keep sensitive info like database passwords in environment variables. We can use the os module to get these variables.

    import os
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': os.getenv('POSTGRES_DB', 'your_database_name'),
            'USER': os.getenv('POSTGRES_USER', 'your_database_user'),
            'PASSWORD': os.getenv('POSTGRES_PASSWORD', 'your_database_password'),
            'HOST': 'db',
            'PORT': '5432',
        }
    }
  4. Docker Compose Configuration: Now we check our docker-compose.yml file to make sure the PostgreSQL service is set up right. Here is a small example:

    version: '3.8'
    
    services:
      db:
        image: postgres:13
        environment:
          POSTGRES_DB: your_database_name
          POSTGRES_USER: your_database_user
          POSTGRES_PASSWORD: your_database_password
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data
    
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    
    volumes:
      postgres_data:

By doing these steps, we can set up our Django app to connect to a PostgreSQL database in a Docker container. Remember to change the placeholders to real values for your setup. If we want to learn more about connecting Docker Compose services to outside databases, we can check this guide.

Building and Running Your Docker Containers

We will build and run Docker containers for a Django app that connects to PostgreSQL. Just follow these steps:

  1. First, check that Docker and Docker Compose are installed on your computer. You can look at this guide on how to install Docker on different operating systems.

  2. Next, go to your project folder where your docker-compose.yml file is.

  3. Now, let’s build the Docker images. Use this command:

    docker-compose build
  4. Then, run the containers in detached mode. This keeps them running in the background:

    docker-compose up -d
  5. We should check the status of your containers to make sure they are running:

    docker-compose ps
  6. Next, run database migrations. This sets up your PostgreSQL database schema:

    docker-compose run web python manage.py migrate
  7. Finally, access your Django application. If we mapped the ports right, we can see it at http://localhost:8000 or the port you used in your docker-compose.yml.

Your docker-compose.yml should have services for Django and PostgreSQL. It should look like this:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/code
    depends_on:
      - db

  db:
    image: postgres
    environment:
      POSTGRES_DB: yourdbname
      POSTGRES_USER: yourdbuser
      POSTGRES_PASSWORD: yourdbpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

This setup creates a simple Django app that connects to a PostgreSQL database inside Docker containers. Don’t forget to change yourdbname, yourdbuser, and yourdbpassword to your own database info.

Verifying the Connection Between Django and PostgreSQL

To check the connection between Django and PostgreSQL using Docker Compose, we can follow these steps.

  1. Access Django Shell: First, we need to open the Django shell inside the running container. Use this command to open a shell in the Django service container:

    docker-compose exec web python manage.py shell
  2. Testing Database Connection: After we are in the shell, we can run these commands to see if Django connects to the PostgreSQL database:

    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT 1;")
    print(cursor.fetchone())

    If we see the output (1,), it means the connection works well.

  3. Check Migrations: We should check if our database migrations are applied right. Run this command to see if Django can talk to the database:

    docker-compose exec web python manage.py migrate

    This command should run without any error. If it does, it shows that the database is connected fine.

  4. Django Admin: We can also check the connection by going to the Django admin panel. We must log in as the admin user to see the database content. If we do not have a superuser yet, we can create one:

    docker-compose exec web python manage.py createsuperuser
  5. Check Logs: If we face any problems, we should look at the logs of the PostgreSQL container for any connection issues:

    docker-compose logs db
  6. Database Queries: We can run a simple query to list our tables using Django ORM:

    from myapp.models import MyModel
    MyModel.objects.all()

    Here, replace MyModel with any model we have.

By following these steps, we can easily check the connection between Django and PostgreSQL in our Docker Compose setup. This way, we make sure our application works with the database as we expect.

Troubleshooting Common Connection Issues

When we connect Django to PostgreSQL using Docker Compose, we may face some common connection issues. Here are some easy steps to fix these problems.

  1. Database Service Not Running
    First, we need to check if the PostgreSQL service is running. We can check the status of our containers with:

    docker-compose ps

    If PostgreSQL is not running, we can start it with:

    docker-compose up -d postgres
  2. Wrong Database Credentials
    Next, we should check that the database name, user, and password in our Django settings match what we have in our docker-compose.yml. For example:

    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
  3. Network Issues
    We need to make sure that both Django and PostgreSQL are on the same Docker network. In our docker-compose.yml, we can define a network like this:

    networks:
      mynetwork:
    services:
      web:
        networks:
          - mynetwork
      db:
        networks:
          - mynetwork
  4. PostgreSQL Not Accepting Connections
    We can check the PostgreSQL logs for any connection errors. We can see the logs with:

    docker-compose logs db

    We look for lines that say there are connection problems or authentication failures.

  5. Incorrect Host Configuration
    In our Django settings, we need to make sure we use the right host for the database connection. If our service is named db, it should look like this:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'mydatabase',
            'USER': 'myuser',
            'PASSWORD': 'mypassword',
            'HOST': 'db',  # Service name from docker-compose.yml
            'PORT': '5432',
        }
    }
  6. PostgreSQL Configuration
    If we have custom settings in our PostgreSQL, we need to check that pg_hba.conf allows connections from the Django container. We may need to change it to allow connections from the Docker network.

  7. Firewall or Security Groups
    If we are using cloud providers, we must check that firewall rules or security groups let traffic through on the PostgreSQL port. The default port is 5432.

  8. Django Migrations Not Applied
    If Django cannot find the database or its tables, we should make sure that we have applied migrations:

    docker-compose exec web python manage.py migrate
  9. Container Health Check
    We can add health checks in our docker-compose.yml for the database service. This way, it will be ready before Django tries to connect:

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser"]
      interval: 10s
      timeout: 5s
      retries: 5
  10. Inspecting Environment Variables
    Finally, we need to check that our environment variables are set correctly in the Docker containers: bash docker-compose exec db env

By following these steps, we can solve most connection issues between Django and PostgreSQL when using Docker Compose. For more help on using Docker well, check out How to connect Docker Compose services to external databases.

Frequently Asked Questions

1. How do we set up PostgreSQL with Django in Docker Compose?

To set up PostgreSQL with Django using Docker Compose, we need to make a docker-compose.yml file. This file will define our Django and PostgreSQL services. We should include the PostgreSQL image and set environment variables for the database name, user, and password. Also, we need to set up a volume for saving data. For more details, check How to write a simple Docker Compose YAML file.

2. What are the best practices for connecting Django to PostgreSQL in Docker?

When we connect Django to PostgreSQL in Docker, we should use environment variables for sensitive info like database credentials. It is also important to set Django settings to use the django.db.backends.postgresql backend. We can use a Docker network for services to talk to each other. Make sure the database service is running before Django starts. For more insights, see How to connect Docker Compose services to external databases.

3. How can we troubleshoot PostgreSQL connection issues in Docker?

To troubleshoot PostgreSQL connection issues in Docker, we often check the service status. We also need to verify environment variables and check network connection between containers. Let’s look at the logs from both Django and PostgreSQL containers for errors. Also, make sure the PostgreSQL service is running and can be reached on the right port. Check how to troubleshoot Docker networking issues for more tips.

4. What should we do if our Django application cannot connect to PostgreSQL?

If our Django application cannot connect to PostgreSQL, first we should check if the database service is running. Then we need to make sure the connection details in our Django settings are correct. We also need to check if the PostgreSQL container can be reached from the Django container. Sometimes we may also need to look at firewall settings or Docker network setups. For more help, refer to how to connect to PostgreSQL in a Docker container from outside.

5. Can we use Docker Compose to scale our Django and PostgreSQL services?

Yes, we can use Docker Compose to easily scale our Django and PostgreSQL services. We can define many instances of our Django application with the scale option in our docker-compose.yml file. But we should make sure our PostgreSQL instance can handle many connections well. For scaling services, check out how to scale services with Docker Compose for a complete guide.