Why exactly Docker compose? Docker compose used when you want to run your applications on any machine and start it by one click. This way called as serverless and cross platform architecture. Docker allow you to run applications on any computer, where it installed. It's very convenient and simple.
Complete structure of project:
demo_project/ | |-- manage.py | |-- env/ | |-- backend/ | | | |-- asgi.py | |-- __init__.py | |-- settings.py | |-- urls.py | |-- wsgi.py | |-- core/ | | | |-- admin.py | |-- apps.py | |-- __init__.py | |-- models.py | |-- tests.py | |-- views.py | |-- Dockerfile | |-- docker-compose.yaml | |-- nginx/ | |-- default.conf
Start new Django project or open existing.
Create requirements.txt
file for dependencies:
django psycopg gunicorn
Edit ALLOWED_HOSTS
value in settings.py
file for listing your domain and IP address:
ALLOWED_HOSTS = [ '0.0.0.0', 'localhost', 'your-domain.com' ]
Docker read content of Dockerfile as instructions and build your own container image. Create Dockerfile
in project's root folder with this parameters:
FROM python:latest ARG APP=/app ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR ${APP} COPY . . RUN pip install --no-cache-dir -r requirements.txt CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "2", "backend.wsgi:application"]
Attention: don't run with python manage.py runserver
in production!
Create docker-compose.yaml
file in project's root folder and put following values:
services: database: container_name: database image: postgres:latest restart: unless-stopped shm_size: 128mb networks: - internal_network volumes: - /var/lib/postgresql/data/:/var/lib/postgresql/data/ environment: POSTGRES_HOST: database POSTGRES_DB: database_name POSTGRES_USER: database_user POSTGRES_PASSWORD: password ports: - 127.0.0.1:5432:5432 backend: container_name: backend build: context: . dockerfile: Dockerfile restart: unless-stopped depends_on: - database networks: - internal_network volumes: - ./media/:/app/media/ ports: - 127.0.0.1:8000:8000 nginx: container_name: nginx image: nginx restart: unless-stopped depends_on: - backend networks: - internal_network volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf ports: - '80:80' - '443:443' networks: internal_network: ipam: driver: default config: - subnet: 172.18.0.0/24
Create default.conf
file insinde of nginx
directory:
server { listen 80 default_server; server_name _; location / { proxy_set_header Host $host; proxy_pass http://backend:8000; } }
Now start application:
docker compose up -d
Top comments (0)