Getting started with Docker Postgres + Django (part1)

Takayuki Torii
AnyMind Group
Published in
2 min readSep 28, 2022

Objective

Use Docker to maximize development efficiency and save time to create develop environment in local pc

Environment

  • Docker Desktop for Mac (version=4.11.1)
  • Django (version=4.1.1)
  • Pipenv (version=2022.9.8)
  • PyCharm (version=2022.2.1 Professional Edition)

Setup Docker Postgres

Create directory and files like the below.

-- Dockerfile
|_ docker-compose.yaml

Dockerfile

see the official document for setup Dockerfile for postgres.

FROM postgres:14-alpine
ENV LANG ja_JP.utf8

docker-compose.yaml

version: '3'
services:
db:
build: .
ports:
- 5435:5432 <- host port: docker port
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: 'admin_password'
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:

Run docker containers in background

docker-compose up -d

Create user for Django application (postgres shell)

# shell
PGPASSWORD="admin_password" psql -h "127.0.0.1" -p 5435 -U "admin" -d "postgres"
# postgres shell
CREATE USER your_username WITH PASSWORD 'your_login_password';
CREATE DATABASE your_db_name;
GRANT ALL PRIVILEGES ON DATABASE your_db_name TO your_user_name;

Setup Django

Create python virtual environment with Pipfile

please install django modules following django tutorial and postgres python connector module(psycopg2).

I will use django REST framework (djangorestframework) to check for the final working, so install the module.

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
django = "==4.1.1"
djangorestframework = "==3.12"
django-cors-headers = "==3.13.0"
psycopg2 = "==2.9.3"
pytz = "==2022.2.1"

[dev-packages]

[requires]
python_version = "3.10"

settings.py

Just setup database config like normal postgres integration with Django.

I use port 5435 for Docker postgres, so change the port in the database setting

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'your_db_name',
'USER': 'your_username',
'PASSWORD': 'your_login_password',
'HOST': 'localhost',
'PORT': '5435', <- Use Docker postgres port number
}
}

Initialize db with Django

python manage.py migrate <- Initialize db
python manage.py makemigrations your_app_label
python manage.py migrate <- Apply migration files

Run Django server

python manage.py runserver

You can check response from Django as usual!

Create Backup database file from Docker postgres

# Create backup
PGPASSWORD='your_login_password' pg_dump -c --if-exists --host=127.0.0.1 --port=5435 --dbname=your_db_name --username=your_username > backups.sql
# Restore db with backup
PGPASSWORD='your_login_password' psql --variable=ON_ERROR_STOP=1 --dbname=your_db_name --username=your_username --host=127.0.0.1 --port=5435 < backup.sql

--

--