Getting started with Docker Postgres + Django (part1)
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