Docker + Django in 10 Days: From Zero to Production [Day: 06]
![Docker + Django in 10 Days: From Zero to Production [Day: 06]](/_next/image?url=https%3A%2F%2Fcloudmate-test.s3.us-east-1.amazonaws.com%2Fuploads%2Fcovers%2F696fcd472484e6d591510582%2Fa53f784c-27e6-4611-8627-a7d76fe9875b.png&w=3840&q=75)
π― Goal of Day 6
By the end of today, you will:
Understand what environment variables are
Use a
.envfile with Docker ComposeClean up Django
settings.pyUnderstand volumes deeply
Know how Docker keeps your database data safe
β Why Environment Variables Matter
Right now, you have this in settings.py:
PASSWORD = "django_pass"
Thatβs bad because:
Secrets leak to GitHub
Hard to change per environment
Unprofessional β
Industry rule:
β Code is public. Secrets are not. β
π§ What Are Environment Variables?
Environment variables are key-value pairs available to a running process.
Example:
DB_NAME=django_db
DB_PASSWORD=super_secret
Docker passes these safely into containers.
π Step 1: Create .env File
Create a file named .env (same level as docker-compose.yml):
DEBUG=1
POSTGRES_DB=django_db
POSTGRES_USER=django_user
POSTGRES_PASSWORD=django_pass
POSTGRES_HOST=db
POSTGRES_PORT=5432
β οΈ Never commit .env to GitHub.
Add to .gitignore:
.env
π³ Step 2: Update docker-compose.yml
Replace hard-coded values:
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
env_file:
- .env
depends_on:
- db
db:
image: postgres:15
env_file:
- .env
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Now:
Docker reads
.envInjects variables automatically
π§ Important: How .env Works in Compose
.envβ loaded by Docker ComposeVariables available inside containers
Same file works for:
Django
PostgreSQL
Very powerful.
π Step 3: Update Django settings.py
Use os.environ:
import os
DEBUG = os.environ.get("DEBUG") == "1"
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ.get("POSTGRES_DB"),
"USER": os.environ.get("POSTGRES_USER"),
"PASSWORD": os.environ.get("POSTGRES_PASSWORD"),
"HOST": os.environ.get("POSTGRES_HOST"),
"PORT": os.environ.get("POSTGRES_PORT"),
}
}
Now your settings are:
Clean
Secure
Environment-friendly
π§ What Are Volumes? (Deep Understanding)
You already used:
volumes:
- postgres_data:/var/lib/postgresql/data
What this means:
Database files stored outside container
Container can be deleted
Data survives
π Without volumes:
Stop container β data gone π±
π§ͺ Test Data Persistence (Do This)
Start containers:
docker compose upCreate a superuser
Stop everything:
docker compose downStart again:
docker compose upLogin again
β Data is still there β volumes working.
π§ Bind Mount vs Volume (Important Difference)
Bind Mount | Volume |
|---|---|
|
|
Local β container | Managed by Docker |
Code sync | Persistent data |
Dev use | DB use |
π Official Docs (Read Today)
Environment variables in Compose
https://docs.docker.com/compose/environment-variables/Docker volumes
https://docs.docker.com/storage/volumes/Django settings best practices
https://docs.djangoproject.com/en/stable/topics/settings/
β οΈ Common Beginner Mistakes
Committing
.envβUsing
print(os.environ)(leaks secrets)Forgetting env vars exist only at runtime
Mixing dev & prod secrets
π Homework (Important)
Move all secrets to
.envConfirm Django reads from env
Restart containers
Test data persistence
Explain (to yourself) why volumes exist
β End of Day 6 Summary
You learned environment variables
You secured your Django project
You understand volumes clearly
Your setup looks professional now
![Docker + Django in 10 Days: From Zero to Production [Day: 07]](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F696fcd472484e6d591510582%2F911a802d-c837-4cb6-b3fc-73966aff1020.png&w=3840&q=75)
![Docker + Django in 10 Days: From Zero to Production [Day: 05]](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1770578634367%2F8708279a-574a-4250-b12b-22d01fe91841.png&w=3840&q=75)
![Docker + Django in 10 Days: From Zero to Production [Day: 04]](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1770151845620%2F77951891-5216-4440-aab8-7b848b6eba8f.png&w=3840&q=75)
![Docker + Django in 10 Days: From Zero to Production [Day: 03]](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1769895181687%2Fdd60bdd1-f050-4f82-8e47-dde4a70f7798.png&w=3840&q=75)