How to Connect your Django App to a dockerized PostgreSQL and pgAdmin
Tags: docker, postgres, python, django
Published: 2020-03-22 15:08:02

Docker has been my default environment set-up for deploying most of my web projects quickly. It is lightweight and it has also helped me solve package dependencies and environment configuration issues because it provides a consistent environment across different servers and also makes continuous delivery and deployment enjoyable.

Recently, I felt the need to connect my Django application to a dockerized Postgres database and also manage the database with a dockerized pgAdmin(a web app. for managing Postgres databases).  
I did this because I wanted my application layer to stay outside the docker environment of my database without the need to install Postgres and pgAdmin on my local machine for a quick app. prototype.
I had several issues setting this up until I successfully got it up and running. 
Let me show you how I did it 😊.

In this post, I am assuming that you have successfully installed Docker and Django. I will also be using docker-compose (this will enable you to run multiple containers).
Visit this link to understand what docker-compose is: https://docs.docker.com/compose/

To dockerize **Postgres** and **pgAdmin**:
- create a postgres_docker directory in the root folder that contains your Django project dir.
- cd into the postgres_docker dir. and create a docker-compose file that will contain the **Postgres** and **pgAdmin** images: 
copy the following code and paste it into your docker-compose file
```yaml
version: "3.1"

services:

  db:
    restart: always
    image: postgres
    container_name: demo-postgres #you can change this
    environment:
      - POSTGRES_USER=demo
      - POSTGRES_PASS=demo
      - POSTGRES_DB=demo
      - POSTGRES_PORT=5432
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data/

  pgadmin:
      image: dpage/pgadmin4
      container_name: demo-pgadmin #you can change this
      depends_on:
        - db
      ports:
        - "5051:80"
      environment:
        PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
        PGADMIN_DEFAULT_PASSWORD: root
      restart: always


volumes:
  postgres_data:

```
- open your command line, cd into postgres_docker dir. and run 
```docker
docker-compose up
```
 This command builds, (re)creates, starts, and attaches to containers for a service. to confirm if there are no errors, visit http://localhost:5051 to see pgAdmin Interface.

To connect **pgAdmin** to **Postgres**:
- login to pgAdmin with the login details you initialized in the docker-compose file.
```yaml
 PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org #you can change this
 PGADMIN_DEFAULT_PASSWORD: root #you can change this
```
- enter the following settings from the images below to your pgAdmin interface
![Alt text of image]
(https://res.cloudinary.com/mikegreat/image/upload/v1584887699/lzcpvpl6gpqam9w2bdiw.jpg)
![Alt text of image]
(https://res.cloudinary.com/mikegreat/image/upload/v1584887700/e8bozx1kfmcvn1pwutzg.jpg)
**Please note**
- your hostname **db** is the name of your Postgres service in the docker-compose file.

To connect **Django** to **Postgres**:
- In your settings.py, configure database settings like so:
```python
DATABASES = {
    'default': {
        'ENGINE': 'django_postgres_extensions.backends.postgresql',
        'NAME': 'demo',
        'USER': 'demo',
        'HOST': 'localhost',
        'PORT': 5432,
        'PASSWORD':'demo'
    }
}

```
To see that all went as plan, startup your Django application like so:
```bash
python manage.py runserver
```
If everything works fine, you should see your application without errors. 
visit http://localhost:8000

In conclusion, there are several ways to achieve this but this is my preferred way and it also easy to understand.
If you have any issue with your setup leave your comments below.
Kindly follow me and turn on your notification. Thank you!
Happy coding! ✌