O docker serve para conteinerizar! Antes de colocar nosso app na internet, vamos testar o docker no nosso próprio computador.
Vamos assumir que já tenhamos um projeto django localizado na pasta projeto na raiz do projeto
Dockerfile:
# syntax=docker/dockerfile:1
FROM python:3.12
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
requirements.txt:
Django==5.2.7
psycopg[binary]==3.2.12
Já pensando em colocar as coisas online, vamos conectar o Django a um banco de produção, nesse caso o PostgreSQL
docker-compose.yaml:
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python projeto/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- PYTHONPATH=/code/projeto
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
Podemos agora montar e executar os containeres com:
docker compose build
docker compose up -d
.env:
POSTGRES_NAME=banco
POSTGRES_USER=usuario
POSTGRES_PASSWORD=senha
docker-compose.yaml:
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql
environment:
- POSTGRES_DB=${POSTGRES_NAME}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
web:
build: .
command: python projeto/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- PYTHONPATH=/code/projeto
- POSTGRES_DB=${POSTGRES_NAME}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
depends_on:
- db
.gitignore:
.venv
.env
data
Agora conectamos ao banco de dados ao nosso aplicativo Django ajustando o settings.py:
# settings.py
import os
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_NAME'),
'USER': os.environ.get('POSTGRES_USER'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
Depois das últimas mudanças, podemos realizar o build dos conteineres e rodá-los novamente. Depois podemos criar as tabelas necessárias com o migrate
docker compose build
docker compose up -d
docker compose run web python projeto/manage.py migrate
docker compose run web python projeto/manage.py createsuperuser
requirements.txt:
Django==5.2.7
psycopg[binary]==3.2.12
uvicorn
docker-compose.yaml:
...
web:
build: .
command: uvicorn projeto.asgi:application --host 0.0.0.0 --port 8000 --reload
...
terminal:
docker compose build
docker compose up -d
docker compose logs -f web