Skip to main content

Command Palette

Search for a command to run...

Docker + Django in 10 Days: From Zero to Production [Day: 05]

Published
β€’3 min read
Docker + Django in 10 Days: From Zero to Production [Day: 05]

🎯 Goal of Day 5

By the end of today, you will:

  • Understand why Docker Compose exists

  • Run Django + PostgreSQL together

  • Learn how services talk to each other

  • Stop rebuilding containers on every code change

  • Be very close to production-style setups


❓ Why Docker Compose?

Yesterday’s problem:

  • One container is fine

  • Multiple containers = pain

Imagine running:

  • Django

  • PostgreSQL

  • Redis

  • Celery

Manually?

πŸ˜΅β€πŸ’« No.

Docker Compose solves this:

One file β†’ multiple services β†’ one command


πŸ“„ What Is Docker Compose?

Docker Compose is a tool for defining and running multi-container applications.

You define everything in:

docker-compose.yml

Then run:

docker compose up

🧠 Big Picture (Today)

Django Container  ↔  PostgreSQL Container

Important rule:

Containers talk using service names, not localhost.


πŸ“ Project Structure (Update)

Your project should now look like:

django-docker/
β”œβ”€β”€ core/
β”œβ”€β”€ manage.py
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ Dockerfile
└── docker-compose.yml

🐘 Step 1: Update requirements.txt

Django>=4.2,<5.0
psycopg2-binary>=2.9

🐳 Step 2: Update Dockerfile (Small Change)

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

(No big change β€” good sign πŸ‘)


🧩 Step 3: Create docker-compose.yml

version: "3.9"

services:
  web:
    build: .
    container_name: django_app
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

  db:
    image: postgres:15
    container_name: postgres_db
    environment:
      POSTGRES_DB: django_db
      POSTGRES_USER: django_user
      POSTGRES_PASSWORD: django_pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

🧠 Very Important Concepts Here

πŸ”Ή services

Each service = one container.

πŸ”Ή build: .

Uses your Dockerfile.

πŸ”Ή volumes

.:/app

Means:

  • Local code ↔ container code

  • No rebuild needed on code change πŸŽ‰

πŸ”Ή depends_on

Starts DB before Django.


πŸ”Œ Step 4: Update Django Database Settings

In settings.py:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "django_db",
        "USER": "django_user",
        "PASSWORD": "django_pass",
        "HOST": "db",   # service name, NOT localhost
        "PORT": "5432",
    }
}

⚠️ HOST = "db" is CRITICAL.


▢️ Step 5: Run Everything

Stop previous containers:

docker compose down

Start new setup:

docker compose up --build

πŸ§ͺ Step 6: Run Migrations

Open a new terminal:

docker compose exec web python manage.py migrate

Create superuser:

docker compose exec web python manage.py createsuperuser

Visit:

http://127.0.0.1:8000/admin

πŸŽ‰ Django + PostgreSQL is LIVE in Docker πŸŽ‰


🧠 Networking Magic (Important)

Inside Docker:

  • localhost β†’ current container only

  • db β†’ PostgreSQL container

Docker Compose creates an internal network automatically.


πŸ“š Official Docs (Must Bookmark)


⚠️ Common Beginner Mistakes

  • Using localhost for DB ❌

  • Forgetting volumes β†’ data loss

  • Forgetting to run migrations

  • Editing code but not using volumes


πŸ“ Homework (Very Important)

  1. Start containers with docker compose up

  2. Run migrations

  3. Access admin panel

  4. Stop containers

  5. Restart and confirm data persists


βœ… End of Day 5 Summary

  • You learned Docker Compose

  • You ran multiple containers

  • Django talks to PostgreSQL correctly

  • You now have a real backend setup