Crear una imagen docker desde cero y paso a paso

Este es uno de los capítulos del tutorial Tutorial de Docker. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

En el capítulo anterior de este tutorial de docker, viste como podías crear tus propias imágenes docker. Ha llegado el momento de poner en práctica esos conocimientos y crear una imagen de forma práctica. En este sentido, y siguiendo la propuesta que hizo Daniel Primo en Web Reactiva, he creado una sencilla API Rest con frases de Chiquito de la Calzada. Esta API Rest, en función de la opción que elijas, o bien te devuelve una frase aleatoria, o bien, te devuelve todas las frases almacenadas en la base de datos. Así, en este nuevo capítulo del tutorial sobre docker, encontrarás como crear una imagen docker desde cero y paso a paso.

Además, y para poner el punto final, y la guinda al pastel, y de paso echarte unas risas, te explicaré como puedes oir las frases. Si como lo has leído. Se trata de no solo generar una frase de forma aleatoria, sino además y escucharla. De esta manera no solo verás como crear una imagen docker desde cero y paso a paso, sino que además te divertirás un rato.

Crear una imagen docker desde cero y paso a paso

Crear una imagen docker desde cero y paso a paso

Dependencias

Indicarte que para este ejemplo, he utilizado para empezar y fundamental, como lenguaje de programación Python 3. Por otro lado, para el tema de crear el API Rest, he utilizado un framework llamado Flask, que te permite de forma sencilla crearla. Además para la base de datos, dado lo que vas a hacer, me he decantado por SQLite, por tratarse de una base de datos bastante reducida.

La base de datos la he creado de la forma mas sencilla, SQLite desde Bash. No me he querido complicar la existencia, por aquello de que ni es mas que un sencillo ejemplo.

El contenido de la base de datos lo he sacado de las frases míticas de Chiquito de la Calzada.

La base de datos

La base de datos es realmente muy, pero que muy sencilla. Tan solo tiene una tabla, que está definida de la siguiente forma,

CREATE TABLE IF NOT EXISTS JOKES(
ID INTEGER PRIMARY KEY,
AUTHOR TEXT,
VALUE TEXT,
CREATED_AT NUMERIC,
UPDATED_AT NUMERIC);

Y por supuesto, para crear la base de datos e introducir todas las frases he utilizado un sencillo script create.sh que puedes encontrar en el repositorio de GitHub. Ejecutando ese sencillo script, tendrás generada tu base de datos frases.d.

La aplicación

Como he comentado anteriormente, la aplicación está implementada en Python 3 y utilizando el framework Flask. Igualmente, por supuesto, la aplicación también la tienes disponible en el repositorio de GitHub. Para que te hagas una idea de la sencillez de la aplicación indicarte que tiene poco mas de 70 líneas de código.

He creado diferentes rutas. Un total de tres. Pocas, aunque suficientes para poner en marcha el ejemplo. Las rutas son las siguientes,

  • /api/1.0/jokes que te permitirá obtener todas las frases de la base de datos
  • /api/1.0/jokes/<numero> te devolverá una frase. En concreto son 1358 frases con lo que ese el máximo número que puedes poner… Esto es importante, si no te devolverá un error, básicamente un 404.
  • /api/1.0/jokes/random que te devolverá una frase de forma aleatoria.

Así, cuando inicies el contenedor, siguiendo las instrucciones que te indicaré mas adelante, si en tu navegador te diriges a la url https://127.0.0.1:5000/api/1.0/jokes/random, obtendrás algo como lo que te muestro a continuación,

{
    "author": "Chiquito de la calzada",
    "created_at": "2019-10-12T08:48:13",
    "id": 910,
    "updated_at": "2019-10-12T08:48:13",
    "url": "https://127.0.0.1:5000/api/1.0/jokes/910",
    "value": "Eres más pesadoorr que la María Teresa Campooorrss hasiendo un telediariorrr!!! cobarde!!!"
}

El Dockerfile

Ahora que ya sabes todo lo necesario para crear la imagen, el siguiente paso es crear el Dockerfile. El contenido del Dockerfile, será como sigue,

ROM ubuntu
RUN apt-get update -y
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN apt-get install -y $(grep -vE "^\s*#" requirements.txt  | tr "\n" " ")
COPY src/* /app/
ENTRYPOINT ["python3"]
CMD ["app.py"]

Me ha parecido muy interesante la solución para poner las dependencias en un archivo. El contenido del archivo requirements.txt es el siguiente,

python3-flask
python3-itsdangerous
python3-pyinotify
ipython3-werkzeug

Por otro lado, copias todo lo que hay en el directorio src en el directorio app de tu imagen. En ese directorio, se encuentra la aplicación propiamente, y por supuesto la base de datos, frases.db. Por último, debes indicar como iniciar la aplicación, que lo haces declarando tanto el ENTRYPOINT como el CMD.

Crear la imagen

Para crear la imagen tan solo tienes que ejecutar la siguiente instrucción,

docker build -t atareao/chiquito:latest .

Por supuesto cambia atareao por tu nombre de usuario en Docker Hub, para poder subir posteriormente la imagen y así compartirla con otros.

Iniciando el contenedor

Ahora que ya tienes tu contenedor, es el momento de ponerlo en funcionamiento. Para ello, simplemente tienes que ejecutar la siguiente instrucción como ya viste en capítulos anteriores del tutorial,

docker run -d --name chiquito -p 5000:5000 atareao/chiquito

Ahora ya te puedes ir a la dirección que te he indicado anteriormente, y empezar a realizar llamadas como si no hubiera un mañana.

Compartir tu imagen

Por supuesto, la gracia de todo esto, es poder compartir la imagen con otros. Para ello, necesitas tener creada una cuenta en Docker Hub, tal y como te explico en el capítulo sobre como encontrar imágenes docker. Una vez creada la cuenta, el primer paso es autenticarte. Para ello, tienes que ejecutar la siguiente instrucción, que te pedirá usuario y contraseña,

docker login

Una vez ya te has autenticado, para subir tu imagen tan solo tienes que ejecutar la siguiente instrucción en el terminal,

docker push atareao/chiquito:latest

Escuchando

Por último queda escuchar las frases de Chiquito de la Calzada. Te tengo que advertir, antes de que te pongas a ello, que esto es realmente adictivo. O sea, que no te lo pongas un domingo por la tarde, porque puedes invertir todo tu tiempo escuchando.

¿Que necesitas? Necesitarás algunas herramientas para filtrar y reproducir las frases. Así, abre un terminal y ejecuta la siguiente instrucción para instalar todas las dependencias necesarias de un golpe,

sudo apt install curl jq gtts-cli sox

Y al lío. Una vez tengas el contenedor levantado, ejecuta la siguiente instrucción,

curl -s https://127.0.0.1:5000/api/1.0/jokes/random | jq '.value' | gtts-cli -l es -f - | play -t mp3 -

Con curl realizas la llamada a la API. Con jq parseas el resultado para obtener única y exclusivamente la frase. Con la herramienta gtts-cli conviertes la frase en audio, y por último, con play la reproduces.

Indicarte que si no sabes de que va esto de los pipes |, le des un vistazo al capítulo redirigir entrada y salida en Linux del tutorial del terminal.

Repositorios

Por último te dejo enlace a los repositorios para que lo tengas de la mano,


Imagen de portada de Dan Burton en Unsplash

1 comentario en “Crear una imagen docker desde cero y paso a paso

  1. MI
    Miguel hace 2 años

    La orden correcta para arrancar el contenedor es

    docker run -d –name chiquito -p 5000:8000 atareao/chiquito

    ya que el contenedor arranca el servidor flask en el puerto 8000

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *