Categoría: Laboratorios

  • Desplegar un servicio web con node.js y crear un contenedor que despligue el servicio

    JavaScript ha pasado de ser un lenguaje utilizado para brindar interactividad a las páginas web, a ser utilizado ahora también en el lado de los servidores gracias a Node.js. Si aún no tienes claro qué es Node.js, puedes revisar este artículo sobre qué es Node.js, donde aprenderás los conceptos básicos que necesitas saber sobre él. Dentro de Node, el código se organiza por módulos o paquetes, así que al momento de trabajar con él va a ser necesario agregar más módulos, es aquí donde entra npm, es el ecosistema más grande de librerías de código abierto en el mundo.

    Node.js permite crear un servidor web, para crearlo, vamos a utilizar NPM (Node Package Manager) y express.js un frawework web.

    Crear un nuevo directorio llamado Node-js

    $ mkdir Node-js

    acceder a este directorio

    $ cd Node-js

    iniciar el proyecto

    $ npm init

    Luego obtendra la siguiente salida y debera ingresar algunos datos, como muestra la siguiente imagen.

    npm init genera un archivo package.json

    Este fichero contiene la información anteriormente proporcionada y además se encarga de controlar los paquetes que instalamos para el proyecto. Por ejemplo, para poder crear nuestro servidor rápidamente, vamos a instalar un paquete llamado express.js

    Hay una parte importante que nos permitirá ver el funcionamiento del servidor web

    app.use(express.static(__dirname + '/public/'));
    • __dirname es la raíz del proyecto

    Esta línea le indica al servidor que cuando un usuario haga una petición de archivos estáticos, por ejemplo, http://localhost:8080/index.html enviará como respuesta el contenido de ./public/index.html

    Luego, se crear la carpeta public y el archivo index.html con el editor de preferencia o en línea de comandos.

    Para ejecutar el servidor web, se posiciona dentro del directorio Node-js y se ejecuta el siguiente comando:

    $ node index.js

    Se observara el siguiente mensaje por consola

    Por último, abrir el navegador web y se obtendra el index.html, utilizando http://localhost:8080 o http://localhost:8080/index.html

    Crea un Dockerfile para Node.js

    Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario puede llamar en la línea de comandos para ensamblar una imagen. Cuando le decimos a Docker que cree nuestra imagen ejecutando el comando docker build, Docker lee estas instrucciones y las ejecuta una por una y crea una imagen de Docker como resultado.

    Repasemos el proceso de creación de un Dockerfile para nuestra aplicación. En la raíz de su directorio de trabajo, cree un archivo llamado Dockerfile y abra este archivo en su editor de texto.

    Lo primero que debemos hacer es agregar una línea en nuestro Dockerfile que le diga a Docker qué imagen base nos gustaría usar para nuestra aplicación.

    FROM node:carbon

    Para facilitar las cosas al ejecutar el resto de nuestros comandos, creemos un directorio de trabajo. Esto le indica a Docker que use esta ruta como la ubicación predeterminada para todos los comandos posteriores. De esta manera, no tenemos que escribir las rutas de archivo completas, pero podemos usar rutas relativas basadas en el directorio de trabajo.

    WORKDIR /usr/src/app

    Por lo general, lo primero que hace una vez que ha descargado un proyecto escrito en Node.js es instalar paquetes npm. Esto asegura que su aplicación tenga todas sus dependencias instaladas en el directorio node_modules donde el tiempo de ejecución de Node podrá encontrarlas.

    Antes de que podamos ejecutar npm install, necesitamos incluir nuestros archivos package.json y package-lock.json en nuestras imágenes. Usamos el COPYcomando para hacer esto. El comando COPY toma dos parámetros. El primer parámetro le dice a Docker qué archivo (s) le gustaría copiar en la imagen. El segundo parámetro le dice a Docker dónde desea que se copien esos archivos. Copiaremos el archivo package.json y package-lock.json en nuestro directorio de trabajo /usr/src/app

    COPY . .

    Una vez que tenemos nuestros archivos package.json dentro de la imagen, podemos usar el comando RUN para ejecutar el comando npm install. Esto funciona exactamente igual que si estuviéramos ejecutando npm install localmente en nuestra máquina, pero esta vez estos módulos de nodo se instalarán en el directorio node_modules dentro de nuestra imagen.

    RUN npm install

    Ahora, todo lo que tenemos que hacer es decirle a Docker qué comando queremos ejecutar cuando nuestra imagen se ejecuta dentro de un contenedor. Hacemos esto con el comando CMD.

    CMD ["npm", "start"]
    

    Aquí está el Dockerfile completo.

    FROM node:carbon
    
    WORKDIR /usr/src/app
    
    COPY . .
    
    RUN npm install
    
    EXPOSE 8080
    
    CMD ["npm", "start"]
    

    Luego, se procede a contruir la imagen de Docker a partir del fichero Dockerfile que hemos realizado.

    docker build -t node-js-server-web-blog ./
    

    Para finalizar, se debe ejecutar el contenedor de Docker con la imagen anteriormente creada.

    docker run --name=node-js-server-web-blog -p 8080:8080 -d node-js-server-web-blog
    

    Abrir el navegador web y se obtendra el index.html, utilizando http://localhost:8080 o http://localhost:8080/index.html

    Aquí se puede encontrar una aplicación de ejemplo que ejercita todos los aspectos que se discutieron.

    Si desea, observar el resultado final, sin necesidad de hacer todo el proceso, ya he preparado una imagen de Docker, la cual puede ejecutar con el siguiente comando

    $ docker run --name=node-js-server-web-blog -p 8080:8080 -d jsgiraldoh/node-js-server-web-blog

    Referencias

  • Django postgres secrets Parte 2

    Sobre secretos

    En términos de los servicios de Docker Swarm, un secreto es una masa de datos, como una contraseña, una clave privada SSH, un certificado SSL u otro dato que no debe transmitirse a través de una red o almacenarse sin cifrar en un Dockerfile o en el de su aplicación. código fuente. Puede usar los secretos de Docker para administrar de forma centralizada estos datos y transmitirlos de forma segura solo a aquellos contenedores que necesitan acceder a ellos. Los secretos se cifran durante el tránsito y en reposo en un Docker Swarm. Un secreto determinado solo es accesible para aquellos servicios a los que se les ha otorgado acceso explícito a él, y solo mientras esas tareas de servicio están en ejecución.

    Puede usar secretos para administrar los datos confidenciales que un contenedor necesita en tiempo de ejecución, pero no desea almacenarlos en la imagen o en el control de fuente, como:

    • Nombres de usuario y contraseñas
    • Certificados y claves TLS
    • Claves SSH
    • Otros datos importantes como el nombre de una base de datos o servidor interno
    • Cadenas genéricas o contenido binario (hasta 500 kb de tamaño)

    Otro caso de uso para usar secretos es proporcionar una capa de abstracción entre el contenedor y un conjunto de credenciales. Considere un escenario en el que tiene entornos de desarrollo, prueba y producción separados para su aplicación. Cada uno de estos entornos puede tener diferentes credenciales, almacenadas en los Swarm de desarrollo, prueba y producción con el mismo nombre secreto. Sus contenedores solo necesitan saber el nombre del secreto para funcionar en los tres entornos.

    Cómo administra Docker los secretos

    Cuando agrega un secreto al enjambre, Docker envía el secreto al administrador del enjambre a través de una conexión TLS mutua. El secreto se almacena en el registro de Raft, que está encriptado. Todo el registro de Raft se replica en los demás administradores, lo que garantiza las mismas garantías de alta disponibilidad para los secretos que para el resto de los datos de administración de enjambres.

    Cuando concede acceso a un secreto a un servicio recién creado o en ejecución, el secreto descifrado se monta en el contenedor en un sistema de archivos en memoria. La ubicación del punto de montaje dentro del contenedor está predeterminada /run/secrets/<secret_name> en contenedores de Linux o C:\ProgramData\Docker\secretsen contenedores de Windows. También puede especificar una ubicación personalizada.

    Docker Secrets

    Como podemos observar en el archivo Compose, configuramos la db contraseña en texto plano. Para evitar esto, podemos aprovechar los secretos de la ventana acoplable para almacenar la contraseña y compartirla de forma segura con los servicios que la necesiten. Podemos definir secretos y hacer referencia a ellos en los servicios como se muestra a continuación. La contraseña se almacena localmente en el project/db/password.txt archivo y se monta en los contenedores debajo /run/secrets/<secret-name>.

    version: "3"
    
    services:
      db:
        image: postgres
        secrets:
          - db-password
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    
    secrets:
      db-password:
        file: db/password.txt
    

    Aquí se puede encontrar una aplicación de ejemplo que ejercita todos los aspectos que se discutieron.

    Verificando el despliegue

    En este punto, su aplicación Django debería estar ejecutándose en el puerto 8000 de su host Docker. En Docker Desktop para Mac y Docker Desktop para Windows, vaya a http://localhost:8000 en un navegador web para ver la página de bienvenida de Django.

    Luego para verificar que la base de datos postgres, quedo bien configurada en el proyecto debemos dirigirnos al siguiente enlace, http://localhost:8000/admin. Esto nos debera mostrar la siguiente salida.

    Si presenta algún incoveniente o error, debera ejecutar el siguiente comando; para que los scripts de administración preparen todos los elementos necesarios(tablas, sessiones, autorizaciones, etc) para su correcto funcionamiento.

    docker-compose run web python manage.py migrate
    

    Recuerde ejecutar este comando en el espacio de trabajo donde tienen los archivos necesarios para su correcta ejecución, si no lo recuerda en este punto, Aqui esta el enlace para que recuerde el proceso de la primera parte de este tutorial.

    Obtendrá una salida parecida a la siguiente imagen.

    Luego de que tenga todos los elementos listos, podra crear el super usuario, el cual le permitira acceder a la parte administrativa.

    docker-compose run web python manage.py createsuperuser

    Para este ejemplo, se uso como usuario root y contraseña root, el correo electronico tiene validaciones así que debe estar bien escrito.

    Por ultimo podra ingresar al portar con su usuario y contraseña y podra asegurarse de que todo quedo bien configurado.

    Referencias

  • Django postgres Parte 1

    Inicio rápido: Compose y Django

    Esta guía de inicio rápido demuestra cómo usar Docker Compose para configurar y ejecutar una aplicación Django / PostgreSQL simple. Antes de comenzar, Instale-compose.

    Para este proyecto, necesita crear un Dockerfile, un archivo de dependencias de Python y un archivo docker-compose.yml. (Puede usar una extensión .yml o .yaml para este archivo).

    1. Cree un directorio de proyecto vacío. Puede nombrar el directorio con algo fácil de recordar. Este directorio es el contexto de la imagen de su aplicación. El directorio solo debe contener recursos para construir esa imagen.
    2. Crea un nuevo archivo llamado Dockerfile en el directorio de tu proyecto. El Dockerfile define el contenido de la imagen de una aplicación a través de uno o más comandos de compilación que configuran esa imagen. Una vez construida, puede ejecutar la imagen en un contenedor. Para obtener más información sobre Dockerfileconsulte la guía del usuario de Docker y la referencia de Dockerfile.
    3. Agregue el siguiente contenido al Dockerfile.
    FROM python:3
    
    ENV PYTHONUNBUFFERED=1
    WORKDIR /code
    COPY requirements.txt /code/
    RUN pip install -r requirements.txt
    COPY . /code/
    

    Este Dockerfile comienza con una imagen principal de Python 3. La imagen principal se modifica agregando un nuevo directorio code. La imagen principal se modifica aún más instalando los requisitos de Python definidos en el archivo requirements.txt.

    1. Guarde y cierre el Dockerfile.
    2. Cree un requirements.txt en el directorio de su proyecto.

    Este archivo es utilizado por el 

    RUN pip install -r requirements.txt
    

    comando en su Dockerfile.

    1. Agregue el software requerido en el archivo.
    Django>=3.0,<4.0
    psycopg2-binary>=2.
    
    1. Guarde y cierre el requirements.txt archivo.
    2. Crea un archivo llamado docker-compose.yml en el directorio de tu proyecto.

    El docker-compose.yml archivo describe los servicios que hacen que su aplicación. En este ejemplo, esos servicios son un servidor web y una base de datos. El archivo de redacción también describe qué imágenes de Docker utilizan estos servicios, cómo se vinculan, los volúmenes que puedan necesitar para montarse dentro de los contenedores. Finalmente, el docker-compose.yml archivo describe qué puertos exponen estos servicios. Consulte la docker-compose.yml referencia para obtener más información sobre cómo funciona este archivo.

    1. Agregue la siguiente configuración al archivo.
    version: "3"
    
    services:
      db:
        image: postgres
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    
    1. Guarde y cierre el archivo docker-compose.yml.

    Crea un proyecto Django

    En este paso, crea un proyecto de inicio de Django compilando la imagen a partir del contexto de compilación definido en el procedimiento anterior.

    1. Cambie a la raíz del directorio de su proyecto.
    2. Cree el proyecto Django ejecutando el comando docker-compose run de la siguiente manera.
    sudo docker-compose run web django-admin startproject composeexample .
    

    Esto indica a Compose que se ejecute django-admin startproject composeexample en un contenedor, utilizando la imagen web y la configuración del servicio. Debido a que la imagen web aún no existe, Compose la compila desde el directorio actual, como se especifica en la build: . línea en docker-compose.yml.

    Una vez que se crea web la imagen del servicio, Compose la ejecuta y ejecuta el django-admin startproject comando en el contenedor. Este comando le indica a Django que cree un conjunto de archivos y directorios que representan un proyecto de Django.

    Una vez que se complete el comando docker-compose, enumere el contenido de su proyecto.

    Si está ejecutando Docker en Linux, los archivos django-admin creados son propiedad de root. Esto sucede porque el contenedor se ejecuta como usuario root. Cambie la propiedad de los nuevos archivos.

    sudo chown -R $USER:$USER .
    

    Si está ejecutando Docker en Mac o Windows, ya debería tener la propiedad de todos los archivos, incluidos los generados por django-admin. Enumere los archivos solo para verificar esto.

    Conecta la base de datos

    En esta sección, configura la conexión de la base de datos para Django.

    1. En el directorio de su proyecto, edite el archivo composeexample/settings.py.
    2. Reemplace DATABASES = … con lo siguiente:
    # settings.py
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'postgres',
            'USER': 'postgres',
            'PASSWORD': 'postgres',
            'HOST': 'db',
            'PORT': 5432,
        }
    }
    

    Esta configuración está determinada por la imagen de Docker de postgres especificada en docker-compose.yml.

    1. Guarde y cierre el archivo.
    2. Ejecute el comando docker-compose up desde el directorio de nivel superior de su proyecto.

    En este punto, su aplicación Django debería estar ejecutándose en el puerto 8000 de su host Docker. En Docker Desktop para Mac y Docker Desktop para Windows, vaya a http://localhost:8000 en un navegador web para ver la página de bienvenida de Django.

    1. Enumere los contenedores en ejecución.

    En otra ventana de terminal, enumere los procesos de Docker en ejecución con el docker container ls comando.

    CONTAINER ID   IMAGE                                   COMMAND                  CREATED             STATUS             PORTS                                                                                                      NAMES
    da3a09ce1c1d   django-postgres_web                     "python manage.py ru…"   6 minutes ago       Up 2 seconds       0.0.0.0:8000->8000/tcp                                                                                     django-postgres_web_1
    9b62a081919d   postgres                                "docker-entrypoint.s…"   6 minutes ago       Up 4 seconds       5432/tcp                                                                                                   django-postgres_db_1
    

    Aquí se puede encontrar una aplicación de ejemplo que ejercita todos los aspectos que se discutieron.

    Referencia

    https://docs.docker.com/compose/django

    Kubernetes

    cd k8s-resources
    
    kubectl apply -f 'archivo'
    
    kubectl port-forward --address 0.0.0.0 svc/my-service 8000 --namespace default
    

    Nota: Es importante tener en cuenta, que debe crear un directorio /code, donde se encuentren los archivos generados en el espacio de trabajo (composeexample/, requirements.txt, manage.py). Para que el cluster pueda montar bien el volumen y todo pueda funcionar correctamente.