¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Kubernetes
  3. Compilar y almacenar imágenes de Docker
Extrait - Kubernetes Administre la plataforma de despliegue de sus aplicaciones en contenedores
Extractos del libro
Kubernetes Administre la plataforma de despliegue de sus aplicaciones en contenedores
5 opiniones
Volver a la página de compra del libro

Compilar y almacenar imágenes de Docker

Objetivos del capítulo y requisitos previos

Este capítulo es una introducción al mecanismo de compilación y almacenamiento de imágenes de Docker en un registro privado.

Se creará una pequeña aplicación para comprender los pasos esenciales para compilar una imagen, así como ciertos consejos para aplicar en caso de que un programa requiera una fase de compilación.

Seguidamente, vendrá la presentación del mecanismo que se debe utilizar para recuperar imágenes desde un registro privado, así como la presentación de algunos servicios gestionados.

Crear una imagen de Docker

1. Aplicar un ejemplo Flask HealthCheck

a. Presentación de la aplicación

Esta aplicación se usa como ejemplo en el capítulo Ciclo de vida de un contenedor en Kubernetes. Contiene una página de inicio y los siguientes puntos de entrada:

  • Visualización del contenido de las variables de entorno.

  • Visualización del estado del contenedor (healthcheck).

Dado que su contenido es relativamente simple, esta aplicación se utilizará para presentar los mecanismos de compilación que se implementarán para crear una imagen de contenedor y un ejemplo de integración en Kubernetes.

b. Presentación de las dependencias

La aplicación se escribirá utilizando el framework Flask (librería Python).

La aplicación en sí constará de las siguientes partes:

  • Importación de dependencias.

  • Inicialización de la aplicación.

  • Exposición del estado de salud del contenedor y visualización de variables de entorno.

  • Visualización de un mensaje de bienvenida en la raíz.

c. Describir las dependencias

El programa se basa en Flask. Se trata de una librería Python muy ligera para crear sitios web.

El control del estado del contenedor se realizará mediante la función HealthCheck de la librería healthcheck.

Para poder controlar el entorno de ejecución del programa, también se importará la función EnvironmentDump (siempre en la librería healthcheck).

A continuación, se muestra el código de Python que permite realizar estas importaciones: 

from flask import Flask 
from healthcheck import HealthCheck, EnvironmentDump 

d. Instalar las dependencias

Las dependencias de Python se almacenan en un archivo de texto. A continuación, se muestra el contenido de este archivo:

Flask 
healthcheck 
six 

 Guarde este contenido con el nombre requirements.txt.

La instalación se realizará mediante el siguiente comando:

$ sudo -H pip3 install -r requirements.txt 

Reemplace el comando pip3 por pip si su ordenador solo dispone de la versión 3 de Python.

e. Inicializar la aplicación

Esencialmente, la inicialización de la aplicación consistirá en instanciar un objeto Flask.

Además de esta declaración, la instanciación de los objetos health...

Imagen de Docker multietapa (multistage)

1. Origen de la necesidad

En el caso de una aplicación sencilla como la presentada (Python + Flask), el archivo Dockerfile no necesita ser especialmente complejo. De hecho, no hay compilación y basta con copiar los archivos.

Por otro lado, cuando se requiere una compilación, la situación es más compleja. Para evitar este problema, puede utilizar las siguientes soluciones:

  • Instalar y compilar el programa en la imagen.

  • Compilar el programa fuera de la imagen.

La primera solución es problemática, ya que la imagen resultante será más grande y contendrá herramientas de compilación. En general, no se recomienda dejar este tipo de herramientas en la imagen del contenedor, ya que su presencia puede causar problemas de seguridad.

La segunda solución también es problemática, dado que la generación del programa no la gestiona Docker, sino una entidad externa (un software de Jenkins, Gitlab, etc.).

La respuesta a ambos problemas es utilizar una imagen multietapa. Estas imágenes utilizan varias imágenes de origen (una para compilar y otra para ejecutar el programa) y se hace referencia a ellas usando su nombre.

2. Ejemplo de compilación con Maven

De esta manera, la creación de una imagen de alojamiento de un programa Java compilado con Maven se realizará en dos fases:

  • Un primer paso de compilación...

Análisis de imágenes

1. Histórico de los comandos

Una buena forma de analizar el contenido de una imagen es recuperar el historial de las instrucciones utilizadas para construirla. Este historial se recupera mediante el comando Docker seguido de:

  • La palabra clave history.

  • El nombre de la imagen que hay que analizar.

A continuación, se muestra la historia de la imagen docker.io/yannig/flask-healthcheck:v1:

$ docker history docker.io/yannig/flask-healthcheck:v1 

Este comando devolverá el siguiente contenido:

IMAGE        CREATED      CREATED BY                       ... 
f78d6979355e 2 hours ago  /bin/sh -c #(nop)  CMD ["run" "--... 
c31b1d411468 2 hours ago  /bin/sh -c #(nop)  ENTRYPOINT ["f... 
8d2e89c71994 2 hours ago  /bin/sh -c #(nop) COPY dir:98a0fa... 
... 

2. Análisis de la imagen: Dive

a. Presentación de Dive

Dive es una interesante herramienta para analizar el contenido de una imagen. Permite recuperar el historial de la imagen, así como la lista de archivos presentes para cada modificación.

Para obtener más información sobre este software, visite la siguiente...

Utilizar registros de Docker privados

1. Origen de la necesidad

En los ejemplos anteriores, las imágenes se almacenaban en un registro público (Docker Hub). Por diversas razones, es posible que el desarrollo de una aplicación se deba realizar en un contexto confidencial (seguridad, desarrollo propietario, etc.).

En tales casos, es imperativo utilizar un registro privado. Estos registros privados pueden estar alojados en un tercero (Google, Azure o Amazon ofrecen este tipo de servicios) o en un registro de imágenes interno.

El procedimiento para actualizar una imagen en un registro privado no es diferente al que se utiliza para un registro público. La diferencia estará en la recuperación de la imagen en el clúster.

2. Desplegar la imagen de un registro privado

a. Exposición del problema

La imagen está publicada, pero, como no es pública, Kubernetes necesitará tener una cuenta para poder recuperarla.

Esta cuenta tiene la siguiente forma:

  • Un identificador (p. ej.: my-pull-user).

  • Una contraseña.

  • Una dirección de registro (p. ej.: registry.gitlab.com/my-company).

b. Crear el secreto

Usando esta información, es posible crear un secreto de tipo docker-registry usando el comando kubectl y las siguientes opciones:

  • La acción create seguida del tipo (secret).

  • El tipo de secreto que hay que crear (docker-registry) seguido de su nombre.

  • La opción --docker-server seguida de la dirección de registro.

  • La opción --docker-username seguida de un identificador de conexión.

  • La opción --docker-password seguida de la contraseña.

Un secreto es parte de un espacio de nombres. No olvide especificar este último usando la opción --namespace si se debe usar en un espacio diferente al predeterminado.

A continuación, se muestra un ejemplo de cómo crear el secreto my-docker-registry-cred en el espacio de nombres my-namespace:

$ kubectl create secret docker-registry my-docker-registry-cred \ 
  --docker-server=registry.gitlab.com/my-company \ 
  --namespace=my-namespace \ 
  --docker-username=my-pull-user \ 
  --docker-password=my-password 

c. Utilizar el secreto

Una vez que se ha creado el secreto, es posible hacer referencia a él en una declaración de pod, a nivel del campo spec --> imagePullSecrets. Lo último...