bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


django_docker

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
django_docker [2022/02/01 16:09]
enrique_mieza_sanchez [Dockeritzant uWSGI + Nginx en un sol contenidor]
django_docker [2024/02/20 14:59] (actual)
enric_mieza_sanchez [Dockeritzant uWSGI + Nginx en un sol contenidor]
Línia 14: Línia 14:
  
 \\ \\
 +
  
 ===== Dockeritzant amb el servidor de desenvolupament ===== ===== Dockeritzant amb el servidor de desenvolupament =====
Línia 21: Línia 22:
 <file Dockerfile Dockerfile> <file Dockerfile Dockerfile>
 # We Use an official Python runtime as a parent image # We Use an official Python runtime as a parent image
-FROM python:3.8-slim+FROM python:3.11.7-bullseye
  
 # install db libs # install db libs
Línia 71: Línia 72:
   $ touch db.sqlite3   $ touch db.sqlite3
   $ docker-compose up -d --build   $ docker-compose up -d --build
 +
 +<WRAP important>
 +**Troubleshooting**
 +
 +He tingut alguns problemes amb la [[https://pypi.org/project/mysqlclient/|llibreria mysqlclient]]. He aconseguit que funcionés canviant ''requirements.txt'' a una versió anterior (Juny 2023):
 +  mysqlclient==2.1.1
 +
 +</WRAP>
  
 \\ \\
Línia 88: Línia 97:
  
 Fes el //migrate// i crea el superusuari tal i com hem fet abans. Fes el //migrate// i crea el superusuari tal i com hem fet abans.
 +
 +<WRAP tip>
 +Alguns tips:
 +  * A l'afegir la MySQL la ''django_app'' depèn de la BD per poder funcionar. Per assegurar que primer arrencarà la DB i després la app, cal posar:<code>depends_on:
 +  - db</code>
 +  * Afegiu un arxiu ''.dockerignore'' on li direm quins arxius no cal posar dins el Docker. Si no ho fem, la BD es copiarà dins del Docker de la django_app la 2a vegada que l'executem:<file text .dockerignore>
 +db/
 +</file>
 +</WRAP>
 </WRAP> </WRAP>
  
Línia 93: Línia 111:
  
 ===== Utilitzant uWSGI + Ngnix ===== ===== Utilitzant uWSGI + Ngnix =====
-El "invento" que hem fet fins ara funciona, però no és una bona pràctica utilitzar el servidor de desenvolupament (el ''./manage.py runserver''). Ara configurarem el ''Dockerfile'' per aconseguir que s'utilitzi uWSGI + Nginx , tal i com cal per un servidor de producció.+El "invento" que hem fet fins ara funciona, però **no és una bona pràctica utilitzar el servidor de desenvolupament de Django** (el ''./manage.py runserver''). Ara configurarem el ''Dockerfile'' per aconseguir que s'utilitzi uWSGI + Nginx , tal i com cal per un servidor de producció. 
 + 
 +{{:django:diagrama_django_produccio.png?direct}}
  
 Recordem que un dels principis bàsics de Docker és el de "un servei per contenidor". Com que necessitem 2 serveis, seguint aquesta filosofia necessitarem un ''docker-compose.yml'' amb 2 serveis + la BD. [[https://python.plainenglish.io/dockerizing-django-rest-apis-with-uwsgi-and-nginx-cabffc153c78|Aquest tutorial segueix la filosofia "un servei per contenidor"]]. Recordem que un dels principis bàsics de Docker és el de "un servei per contenidor". Com que necessitem 2 serveis, seguint aquesta filosofia necessitarem un ''docker-compose.yml'' amb 2 serveis + la BD. [[https://python.plainenglish.io/dockerizing-django-rest-apis-with-uwsgi-and-nginx-cabffc153c78|Aquest tutorial segueix la filosofia "un servei per contenidor"]].
Línia 99: Línia 119:
 En canvi, [[https://gabimelo.medium.com/developing-a-flask-api-in-a-docker-container-with-uwsgi-and-nginx-e089e43ed90e|aquest altre tutorial per a Flask integra els 2 processos (uWSGI + Nginx) en un sol contenidor]]. Per tal de tenir diversos serveis utilitza [[http://supervisord.org/|Supervisord]], una utilíssima eina que a mode de //watchdog// vigila que no s'aturi cap dels dos processos. En canvi, [[https://gabimelo.medium.com/developing-a-flask-api-in-a-docker-container-with-uwsgi-and-nginx-e089e43ed90e|aquest altre tutorial per a Flask integra els 2 processos (uWSGI + Nginx) en un sol contenidor]]. Per tal de tenir diversos serveis utilitza [[http://supervisord.org/|Supervisord]], una utilíssima eina que a mode de //watchdog// vigila que no s'aturi cap dels dos processos.
  
-{{diagrama_django_produccio.png?direct}} 
  
 ==== Dockeritzant uWSGI + Nginx en un sol contenidor ==== ==== Dockeritzant uWSGI + Nginx en un sol contenidor ====
Línia 105: Línia 124:
 Farem una mescla dels dos tutorials per aconseguir el nostre Django en un sol contenidor. Farem una mescla dels dos tutorials per aconseguir el nostre Django en un sol contenidor.
  
-<file bash supervisord.conf>+<file bash deploy/supervisord.conf>
 [supervisord] [supervisord]
 +# per a dockeritzar necessitem supervisord en foreground
 nodaemon=true nodaemon=true
  
 [program:uwsgi] [program:uwsgi]
 command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term
-stdout_logfile=/dev/stdout 
-stdout_logfile_maxbytes=0 
-stderr_logfile=/dev/stderr 
-stderr_logfile_maxbytes=0 
  
 [program:nginx] [program:nginx]
-command=/usr/sbin/nginx +command=/usr/sbin/nginx -g 'daemon off;'
-stdout_logfile=/dev/stdout +
-stdout_logfile_maxbytes=0 +
-stderr_logfile=/dev/stderr +
-stderr_logfile_maxbytes=0+
 </file> </file>
  
-<file bash uwsgi.ini>+<file bash deploy/uwsgi.ini>
 [uwsgi] [uwsgi]
 +# TODO: ull, revisa si el teu projecte es diu 'mysite' o una altra cosa
 module = mysite.wsgi module = mysite.wsgi
 callable = application callable = application
Línia 139: Línia 152:
 </file> </file>
  
-<file txt uwsgi_params>+<file txt deploy/uwsgi_params>
 uwsgi_param  QUERY_STRING       $query_string; uwsgi_param  QUERY_STRING       $query_string;
 uwsgi_param  REQUEST_METHOD     $request_method; uwsgi_param  REQUEST_METHOD     $request_method;
Línia 158: Línia 171:
 </file> </file>
  
-<file bash django-site.conf>+<file bash deploy/django-site.conf>
  
 server { server {
Línia 168: Línia 181:
         uwsgi_pass unix:///tmp/uwsgi.sock;         uwsgi_pass unix:///tmp/uwsgi.sock;
     }     }
 +    
 +    # TODO: aquí cal afegir alguna cosa perquè funcionin el arxius estàtics
 } }
 </file> </file>
Línia 173: Línia 188:
 <file dockerfile Dockerfile> <file dockerfile Dockerfile>
 # We Use an official Python runtime as a parent image # We Use an official Python runtime as a parent image
-FROM python:3.8-slim+FROM python:3.11.7-bullseye
  
 # install db libs # install db libs
Línia 220: Línia 235:
 <WRAP todo> <WRAP todo>
 Canvia la configuració per a utilitzar el servidor d'aplicacions uWSGI + Nginx enlloc del servidor de desenvolupament. Canvia la configuració per a utilitzar el servidor d'aplicacions uWSGI + Nginx enlloc del servidor de desenvolupament.
 +
 +Ull que alguns arxius van a una nova carpeta ''/deploy''.
  
 Comprova que **tornem a tenir el problema dels arxius estàtics** accedint al /admin i refrescant fins que vegis que no es veuen els CSS. Comprova que **tornem a tenir el problema dels arxius estàtics** accedint al /admin i refrescant fins que vegis que no es veuen els CSS.
django_docker.1643731773.txt.gz · Darrera modificació: 2022/02/01 16:09 per enrique_mieza_sanchez