# Como usar DOCKER en un proyecto de DJANGO

Hola y bienvenidos a este nuevo artículo. Una de las herramientas que más auge ha tenido en los últimos años ha sido **DOCKER y todo su ecosistema**. Nos ha venido a ayudar y hacer más fácil las tareas despliegue y desarrollo de nuestras aplicaciones.

## INTRODUCCION

Para los que no sepan que es DOCKER acá les dejo el enlace donde se explica con más detalles pero en resumen es **poder ejecutar dentro de un contenedor(mini máquina virtual) solo nuestro proyecto de DJANGO y sus dependencias**.

Si, suena raro pero es en realidad bastante simple. Actualmente la mayoría de los ambientes de desarrollo y producción de DJANGO, es una carpeta con todo el código del proyecto, un servidor MYSQL y un virtualenviroment, todo esto en la misma computadora o servidor. Acá puedes ver como hacer una [instalación de DJANGO tradicional](https://www.youtube.com/watch?v=TqSSOhfRzTU).

Si tenemos un problema en nuestro servidor de bases de datos y tenemos más proyectos en el mismo servidor, todos fallan.

Los mismo con un proyecto de DJANGO, todos depende de NGINX o APACHE dado que comparten el los mismos recursos del sistemas.

Docker nos viene a ayudar dando la opción aislar o contener cada proyecto, herramienta (REDIS, RABBITMQ)o servidor de MYSQL en una mini máquina virtual dentro de nuestro servidor, como muestra la imágen.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678025187552/8ed90434-ef50-4319-89b6-987415f7ce5d.png align="center")

En la imagen cada **CONTAINER es independiente de los demás** aunque se ejecutan sobre el mismo KERNEL de sistema.

Si ocurre un error en el **CONTAINER de PHP los demás no se ven afectados**.

## CONFIGURANDO DOCKER

1- En nuestro proyecto de DJANGO creamos en la raíz un archivo llamado DOCKERFILE.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678025237680/cdb5ab8d-9e3f-471a-8e04-97abcae9f575.png align="center")

**2- Agregamos las siguientes líneas para tener las indicaciones de que hará nuestro contenedor.**

```yaml
FROM python:3.8  ***Version de python a usar***
ENV PYTHONBUFFERED 1 ***Variable de entorno que necesitarás si haces deploy ***
WORKDIR /app -- Directorio dentro de nuestro contenedor donde estará el código de la aplicación 

COPY requirements.txt /app/requirements.txt  ** Copiar el requirements local y pasarlo al contendor***

RUN pip3 install -r requirements.txt ***Ejecutar el pip para instalar nuestras dependencias***
COPY . /app   ***Copiar todo nuestro código (.) al directorio /app dentro del contenedor ***

CMD python3 manage.py runserver 0.0.0.0:8000 *** Ejecutar el comando para correr el proyecto en el contenedor***
```

**3- Crear un fichero docker-compose.yml**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678025356521/4a82534b-b9d0-467d-86dd-fd9866b6254e.png align="center")

```yaml
version: '3.8'
services: *** Por cada herramienta o aplicación debemos tener un servicio declarado ***
  backend:
    build:
      context: .
      dockerfile: Dockerfile ***Nuestro dockerfile creado anteriormente *** 
    ports:
      - 8000:8000 ***  puerto local del servidor : puerto interno del contenedor docker ***
    volumes:
      - .:/app
    depends_on:
      - db  *** Necesitamos que se ejecute el sevicio de BD antes de ejecutar el django ***
  db:
    image: mysql:5.7.22 *** Versión de mysql ****
    restart: always
    environment:
      MYSQL_DATABASE: admin
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - .dbdata:/var/lib/mysql  *** montamos todo lo que hay en /var/lib/mysql a nuestro contenedor
    ports:
      - 33066:3306  *** puerto local en le sevidor : puerto interno de docker.

```

Después de tener estos archivos configurados solamente debemos ejecutar :

```bash
sudo docker-compose up
```

Y debemos tener nuestro proyecto listo en [localhost:8000](http://localhost:8000)

Para correr un comando dentro de uno de los contenedores :

```bash
sudo docker-compose exec backend sh
```

Donde BACKEND es el nombre del servicio que creamos en el compose.yml.

**Como dato interesante el contenedor debe estarse ejecutando para poder acceder a él**

Espero les sirva y ayude a entrar en el mundo de DOCKER y todas sus ventajas.

No dudes en contactarme si tienes alguna duda o problema.
