Docker es una plataforma abierta para construir, enviar y ejecutar aplicaciones distribuidas. Brinda a los programadores, equipos de desarrollo e ingenieros de operaciones de la caja de herramientas comunes que necesitan para aprovechar la naturaleza distribuida y en red de las aplicaciones modernas.
La contenedorización ofrece varias ventajas, como un aprovisionamiento más rápido o entornos aislados y fáciles de recrear.
Si no sabe qué es la contenedorización, puede pensar en ella como una forma simplificada de virtualización. O mejor aún, puede buscar una descripción detallada, que no es el propósito de esta publicación.
Para empezar, me gustaría contarles que me interesé en «Dockerizar» mis aplicaciones de Django para mejorar mis canalizaciones de implementación.
Si bien la documentación en Docker es muy buena, sus ejemplos son demasiado generales para mí, así que decidí investigar un poco sobre cómo hacerlo.
En esta publicación, tengo la intención de dar un paseo por «Dockerizando Django» y exponer un puerto desarrollado uwsgi , que se puede usar para la producción a diferencia del servidor de desarrollo de Django.
Explicaré la mayoría de los pasos, sin embargo, recomiendo leer el tutorial de docker sobre imágenes . Asumo que tiene Docker instalado y funcionando.
En la raíz de nuestro proyecto Django (misma carpeta que manage.py) tendremos alguna estructura:
Este le dice a Docker cómo construir la imagen. Mi Dockerfile, por ejemplo, se ve así:
DESDE ubuntu:14.04 EJECUTAR configuración regional-gen en_US.UTF-8 ENV LANG es_US.UTF-8 ENV IDIOMA es_US:es ENV PYTHONBUFFED 1 AÑADIR ./requisitos /requisitos AGREGAR ./install_os_dependencies.sh /install_os_dependencies.sh AGREGAR ./requisitos. apt /requisitos.apt AÑADIR ./mi_proyecto.ini /mi_proyecto.ini EJECUTAR ./install_os_dependencies.sh instalar EJECUTAR pip3 install -r "requisitos/requisitos.txt" EJECUTAR groupadd -r agregar && useradd -r -g agregar agregar AGREGAR . /aplicación EJECUTAR chown -R django /aplicación EJECUTAR chgrp -R django /aplicación WORKDIR /aplicación EXPONER 8000 CMD sudo -u django uwsgi mi_proyecto.ini --maestro
Esto construirá nuestra imagen usando como base ubuntu de dockerhub .
Puede cambiar esto cambiando la primera línea, siempre que obtenga los requisitos para su otra imagen:
DESDE ubuntu:14.04
CleanNecesita generar los entornos locales para evitar algunos problemas con Python y Unicode. Eso puede no ser necesario con otras imágenes.
EJECUTAR configuración regional-gen en_US.UTF-8 ENV LANG es_US.UTF-8 ENV IDIOMA es_US:es ENV PYTHONBUFFED 1
A continuación, una línea de código para agregar los archivos necesarios en la construcción de nuestra imagen:
AÑADIR ./requisitos /requisitos AGREGAR ./install_os_dependencies.sh /install_os_dependencies.sh AGREGAR ./requisitos.apt /requisitos.apt AÑADIR ./mi_proyecto.ini /mi_proyecto.ini install_os_dependencies.sh es un script bash que instalará los requisitos del sistema, que se enumeran en require.apt. Se inicia con:
EJECUTAR ./install_os_dependencies.sh instalar
Ahora bien, como estoy usando Python3 para este proyecto, mis requisitos.apt deben reflejar que:
##dependencias de compilación básicas de varias aplicaciones de Django para Ubuntu 14.04 Instalación del metapaquete #build-essential: make, gcc, g++, construir-esencial #requerido para traducir obtener texto python3-dev python3-pip ##dependencias compartidas de: # #Almohada, pylibmc zlib1g-dev ## Dependencias Postgresql y psycopg2 libpq-dev ##Dependencias de almohadas libtiff4-dev libjpeg8-dev libfreetype6-dev liblcms1-dev libwebp-dev ##pylibmc libmemcached-dev libssl-dev ##extensiones-django Graphviz-dev ##lxml libxml2-dev libxslt-dev
En este punto, nuestra imagen ya tiene las dependencias básicas del sistema, instalamos nuestras dependencias de Python:
EJECUTAR pip3 install -r "requisitos/requisitos.txt"
Para este proyecto, instalaré solo Django y uwsgi, por lo que el archivo es muy corto:
django==1.8.4 uWSGI==2.0.11.1
Ahora que todos los requisitos están instalados, crearemos un nuevo usuario con permisos más bajos, que usaremos para ejecutar uwsgi:
EJECUTAR groupadd -r agregar && useradd -r -g agregar agregar AGREGAR . /aplicación EJECUTAR chown -R django /aplicación EJECUTAR chgrp -R django /aplicación WORKDIR /aplicación
Como ya tenemos nuestra aplicación y todos sus requisitos instalados, necesitamos exponer un puerto para hablar con el mundo (8000 en este caso):
EXPONER 8000
En este punto, podremos ejecutar el servidor de desarrollo de nuestro Django y exponerlo, pero eso no sería útil para la producción.
Por tanto, agregaré uwsgi para ejecutar mi aplicación Python.
De la siguiente manera:
[whisky] http = :8000 chdir = /aplicación/ env = DJANGO_SETTINGS_MODULE=config.settings archivo wsgi = config/wsgi.py procesos = 4 hilos = 2
Con la directiva http, estamos diciendo que sirva http. Es posible que desee utilizar sockets tcp o sockets Unix, lo que resultó un cambio en esa configuración.
Por ahora, solo quiero acceder al servidor desde mi navegador local, por lo que http es suficiente.
Para ir terminando establecemos una variable de entorno para seleccionar una de nuestras configuraciones.
Si tiene configuraciones específicas de instancia, puede cambiarlas aquí (local, prueba, producción, etc.).
La última línea en nuestro Dockerfile define qué comando se ejecutará cuando comencemos nuestra imagen
CMD sudo -u django uwsgi mi_proyecto.ini --maestro
Como ya hemos terminado de construir nuestro Dockerfile. Es hora de verificar si podemos construir nuestra imagen (no olvide el.):
ventana acoplable construir -t django_app.
Si todo funciona, deberíamos tener algo como esto:
Construido con exito dd40ad889782
ventana acoplable ejecutable -p 8000:8000 -ti dd40ad889782
Finalmente, le decimos a Docker qué puertos queremos reenviar (host: guest) con -p. -ti nos permite detener el contenedor con ctrl + C. Si no nos importa esto, esa bandera puede omitirse.
No se mencionan las bases de datos, porque están más relacionadas con la configuración de Django que con la configuración de Docker . Puede usar sqlite para que funcione.
docker exec -it nombre_raro bash
Donde rare_name es el nombre asignado por Docker a su contenedor.
Si desea verificar sus contenedores en ejecución, puede ejecutar:
ventana acoplable p
Para terminar, quiero agradecer su lectura, espero que con los pasos aquí enunciados pueda iniciar.
Tenga en cuenta que mantuve la mayoría de las cosas al mínimo para evitar una complejidad innecesaria.