🔓
Docker
🍀 Instalar Docker
🍀 Empaquetar proyecto Django
Docker es una herramienta que permite empaquetar
☘ Fichero Dockerfile
software en contenedores que incluyen todo lo necesario
☘ Fichero [Link]
para que el programa se ejecute. Con Docker, es posible ☘ Crear proyecto Django
reproducir fielmente un entorno de producción de forma ☘ Conectar base de datos
local. ☘ Ejecutar y cerrar contenedor
🍀 Compartir imagen en Docker Hub
Un contenedor es similar a un ambiente virtual, solo que
este último solo puede aislar paquetes de Python y
🍀 Convertir imagen en archivo .tar
depende de una instalación de Python existente. En
cambio, un contenedor aisla todo el sistema operativo.
🍀 Instalar Docker
El primer paso para usar Docker es crear una cuenta en Docker Hub y luego instalar la
aplicación de escritorio en nuestra máquina local. En el caso de Linux, será necesario instalar
también el paquete docker-compose.
Podemos comprobar la instalación de Docker por medio del siguiente comando:
$ docker --version
Docker version 19.03.12, build 48a66213fe
🍀 Empaquetar proyecto Django
Una imagen de Docker es básicamente una instantánea de lo que contiene el proyecto en ese
momento. Está representada por un fichero Dockerfile y es literalmente una lista de instrucciones
para construirla. Por otra parte, un contenedor es la instancia en ejecución de una imagen.
☘ Fichero Dockerfile
Docker 1
Para crear una imagen, primero creamos un directorio vacío que contendrá únicamente los
recursos para construir dicha imagen. Luego, creamos el archivo Dockerfile que definirá el
contenido de la imagen a través de distintos comandos de compilación. Una vez creado, se
puede ejecutar la imagen en un contenedor.
# syntax=docker/dockerfile:1
# Pull base image
FROM python:3.8
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Install dependencies
COPY [Link] /code/
RUN pip install -r [Link]
# Copy project
COPY . /code/
A continuación se explican los comandos utilizados:
El comando FROM permite importar una imagen base sobre la cual construiremos la nuestra.
El comando ENV establece las variables de entorno. PYTHONDONTWRITEBYTECODE=1 indica que
Python no creará archivos .pyc y PYTHONUNBUFFERED=1 asegura que la salida en consola no
esté almacenada en el búfer de Docker.
El comando WORKDIR establece el directorio de trabajo base dentro de la imagen.
El comando COPY permite copiar ficheros dentro del directorio base.
El comando RUN ejecuta un comando específico, en este caso, instala los paquetes de
Python necesarios para el proyecto.
No hay que olvidar crear el archivo [Link] que contendrá las dependencias necesarias
del proyecto.
Django>=3.0,<4.0
psycopg2>=2.8
☘ Fichero [Link]
A continuación, creamos el fichero [Link] en el directorio del proyecto. Este archivo
describe los servicios que componen la aplicación. Por ejemplo, un servidor web y una base de
datos. El fichero también indica qué imágenes de Docker utilizan estos servicios, cómo se
vinculan entre sí, los volúmenes necesarios para montarse dentro de los contenedores y qué
puertos exponen estos servicios.
version: "3.9"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
Docker 2
command: python [Link] runserver [Link]:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
Note que en el ejemplo se usa el servidor de desarrollo incluido en Django junto con el puerto
8000, lo que no es recomendable para entornos de producción.
☘ Crear proyecto Django
Podemos crear un proyecto Django compilando la imagen anterior por medio del comando
docker-compose run .
$ sudo docker-compose run web django-admin startproject example .
Esto le indica a Compose que ejecute el comando django-admin startproject example . en un
contenedor, utilizando la imagen y la configuración del servicio web. Debido a que la imagen web
aún no existe, Compose la compila desde el directorio actual.
Una vez se crea la imagen del servicio web, Compose la ejecuta y ejecuta el comando de Django
en el contenedor.
💡 Nota:
Si ya se tiene el proyecto Django, podemos construir la imagen ejecutando el comando
docker build . .
☘ Conectar base de datos
Para configurar la base de datos según la imagen de Docker, debemos modificar la variable
DATABASES dentro del fichero project/[Link] de la siguiente manera:
import os
DATABASES = {
'default': {
'ENGINE': '[Link]',
'NAME': [Link]('POSTGRES_NAME'),
'USER': [Link]('POSTGRES_USER'),
'PASSWORD': [Link]('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': 5432,
}
}
☘ Ejecutar y cerrar contenedor
Para ejecutar el contenedor llamamos al comando docker-compose up desde el directorio de nivel
superior del proyecto. Al hacer esto, la aplicación Django se comienza a ejecutar en el puerto
8000.
Docker 3
💡 Nota:
En ciertas plataformas (Windows 10) es posible que deba editar la variable
ALLOWED_HOSTS dentro de [Link] y agregar su nombre de host o dirección IP de
Docker a la lista. Incluso se puede establecer como ALLOWED_HOSTS = ['*'] .
En otra terminal, podemos listar los procesos de Docker en ejecución con el comando docker ps
o docker container ls . Para terminar la ejecución de un contenedor presionamos Ctrl+C y
adicionalmente escribimos docker-compose down desde el nivel superior del directorio del proyecto.
Una vez se haya cerrado la aplicación, podemos eliminar de forma segura el directorio del
proyecto de Django.
🍀 Compartir imagen en Docker Hub
El sitio Docker Hub nos permite compartir públicamente las imágenes creadas y también nos
brinda un repositorio privado. Después de crear una cuenta en el sitio web, ejecutamos el
comando docker login e ingresamos nuestras credenciales.
Para enviar una imagen a Docker Hub, debemos nombrar la imagen local con el nombre de
usuario y el nombre del repositorio previamente creado. Podemos agregar varias imágenes a un
repositorio añadiendo una etiqueta específica (e.g. docs/base:testing ). Si no se especifica, la
etiqueta tendrá como valor :latest .
Podemos nombrar las imágenes locales usando distintos métodos:
Al compilar la imagen, usar el comando docker build -t <user>/<repo>[:<tag>] .
Re-etiquetar una imagen local existente con docker tag <img> <user>/<repo>[:<tag>] .
Usar el comando docker commit <container> <user>/<repo>[:<tag>] para confirmar los cambios.
Luego de nombrar adecuadamente la imagen local, la podemos subir al repositorio para que esté
disponible para ser usada por sus compañeros de equipo o comunidad.
$ docker push <user>/<repo>:<tag>
Los otros usuarios podrán bajar la imagen por medio de los comandos docker pull o docker run .
🍀 Convertir imagen en archivo .tar
También es posible exportar manualmente una imagen Docker en un archivo .tar a través del
comando docker save .
$ docker save <img>:latest > [Link]
Para utilizar una imagen exportada, debemos ejecutar el comando docker load , el cual acepta un
archivo .tar como flujo de entrada. Docker cargará el contenido del fichero y lo añadirá a la lista
de imágenes locales.
$ docker load < [Link]
Docker 4