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
Ultima revisió Ambdós costats nova versio
django_docker [2022/01/14 15:55]
enrique_mieza_sanchez [Utilitzant uWSGI + Ngnix]
django_docker [2024/02/20 14:58]
enric_mieza_sanchez [Dockeritzant amb el servidor de desenvolupament]
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ó.
  
-Recordem que un dels principis bàsics de Docker és el de "un procés 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 procés per contenidor"]].+{{:django:diagrama_django_produccio.png?direct}}
  
-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 processos utilitza Supervisor, que a mode de //watchdog// vigila que no s'aturi cap dels dos processos.+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"]]. 
 + 
 +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 uwsgi.ini>+<file bash deploy/supervisord.conf> 
 +[supervisord] 
 +# per a dockeritzar necessitem supervisord en foreground 
 +nodaemon=true 
 + 
 +[program:uwsgi] 
 +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term 
 + 
 +[program:nginx] 
 +command=/usr/sbin/nginx -g 'daemon off;' 
 +</file> 
 + 
 +<file bash deploy/uwsgi.ini>
 [uwsgi] [uwsgi]
-socket=app.sockchmod-socket=664 +# TODO: ull, revisa si el teu projecte es diu 'mysite' o una altra cosa 
-# mark the initial process as a master +module mysite.wsgi 
-master=true +callable application 
-# maximum number of worker processes +uid = nginx 
-processes 4 +gid nginx 
-threads 2 +socket = /tmp/uwsgi.sock 
-# Django's wsgi file +chown-socket www-data:www-data 
-module=docker_django_tutorial.wsgi:application+chmod-socket 664 
 +cheaper = 1 
 +processes %(%k + 1)
 # clear environment on exit # clear environment on exit
 vacuum=true vacuum=true
 </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 139: Línia 171:
 </file> </file>
  
-<file bash my_nginx.conf> +<file bash deploy/django-site.conf>
-# the upstream component nginx needs to connect to +
-upstream uwsgi { +
-    # server api:8000; +
-    # use TCP +
-    server unix:/usr/src/app/app.sock; # for a file socket +
-}+
  
-# configuration of the server 
 server { server {
-    # the port your site will be served on 
-    listen    80; 
-    # the domain name it will serve for 
-    server_name example.com; 
-    charset     utf-8; 
-    # max upload size 
-    client_max_body_size 75M; 
-    location /static { 
-        # your Django project's static files - amend as required 
-        alias /usr/src/app/static; 
-    } 
-    # Finally, send all non-media requests to the Django server. 
     location / {     location / {
-        uwsgi_pass  uwsgi; +        try_files $uri @yourapplication;
-        include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed+
     }     }
 +    location @yourapplication {
 +        include uwsgi_params;
 +        uwsgi_pass unix:///tmp/uwsgi.sock;
 +    }
 +    
 +    # TODO: aquí cal afegir alguna cosa perquè funcionin el arxius estàtics
 } }
 </file> </file>
  
 +<file dockerfile Dockerfile>
 +# We Use an official Python runtime as a parent image
 +FROM python:3.11.8-bullseye
  
 +# install db libs
 +RUN apt-get update
 +RUN apt-get install -y default-mysql-client libmariadb-dev
 +RUN apt-get install -y libmariadb-dev-compat gcc gdal-bin libjpeg-dev
 +
 +# install nginx and supervisor
 +RUN apt-get install -y --no-install-recommends \
 +        nginx supervisor
 +RUN useradd --no-create-home nginx
 +# install uwsgi
 +RUN pip3 install uwsgi
 +
 +# adjustments
 +RUN rm /etc/nginx/sites-enabled/default
 +RUN rm -r /root/.cache
 +
 +# production conf files
 +COPY deploy/django-site.conf /etc/nginx/conf.d/
 +COPY deploy/uwsgi.ini /etc/uwsgi/
 +COPY deploy/supervisord.conf /etc/
 +
 +# install app libs
 +COPY requirements.txt requirements.txt
 +RUN pip3 install --no-cache-dir -r requirements.txt
 +
 +# Mounts the application code to the image
 +COPY . code
 +
 +# establish workdir
 +WORKDIR /code
 +
 +EXPOSE 80
 +
 +# runs the development server
 +CMD ["/usr/bin/supervisord"]
 +</file>
 +
 +<WRAP tip>
 +Perquè funcioni bé i veiem la web al port 8000 cal que **modifiqueu el ''docker-compose.yml'' perquè connecti el port 8000 de la màquina host amb el port 80 del contenidor del Nginx**.
 +</WRAP>
 +
 +\\
  
 <WRAP todo> <WRAP todo>
-Canvia la configuració per a utilitzar el servidor d'aplicacions uWSGI 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.
  
-Com creus que seria la millor manera de solventar el problema dels arxius estàtics?+Com creus que seria la millor manera de solventar el problema dels arxius estàtics? Implementa-la.
 </WRAP> </WRAP>
  
django_docker.txt · Darrera modificació: 2024/02/20 14:59 per enric_mieza_sanchez