RousselTMLEARNING

TP · Docker : del descubrimiento al nivel experto

Proyecto 1

Lo que vas a aprender en este TP
  • Instalar Docker
  • Activar el modo SWARM de Docker
  • Crear un archivo Dockerfile
  • Modificar y/o anular un archivo docker compose existente
  • Crear un archivo Docker compose a partir de una necesidad
  • Desplegar un archivo docker compose
  • Crear una pila/servicio docker con un archivo docker compose
  • Monitorear su infraestructura con Prometheus/Grafana
  • Desplegar un registro privado con Harbor
  • Desplegar un registro Harbor
  • Importar una imagen en un registro
  • Buscar vulnerabilidades en una imagen
  • Configurar la sobreescritura de un archivo docker compose
  • Uso avanzado de etiquetas (labels) (Implementación en el Proyecto 2)

Introducción #

Lo que vas a aprender en esta sección
  • Instalar Docker
  • Activar el modo SWARM de Docker
  • Crear un archivo Dockerfile
  • Modificar y/o anular un archivo docker compose existente
  • Crear un archivo Docker compose a partir de una necesidad
  • Desplegar un archivo docker compose
  • Crear una pila/servicio docker con un archivo docker compose
  • Monitorear su infraestructura con Prometheus/Grafana
  • Desplegar un registro privado con Harbor
El objetivo de este proyecto es hacerle manipular diferentes nociones en torno a Docker y sobre todo combinarlas para alcanzar un objetivo. Para esto, instalaremos y configuraremos un clúster de Docker con SWARM activado y desplegaremos en él diferentes subproyectos en forma de stack (pila). El objetivo es configurar esta arquitectura: Una configuración de hardware recomendada es de 16 GB de RAM.

Entorno de prueba #

Para realizar este TP, necesitará un entorno Ubuntu (pero el TP se puede hacer con otros sistemas operativos/distribuciones). En esta máquina, crearemos 3 máquinas virtuales con las siguientes características:
  • Máquina virtual 1 :
    • Nombre : controlplane (manager Swarm)
    • vCPU : mínimo 2
    • RAM : mínimo 2 GB
    • IP : 192.168.56.10
  • Máquina virtual 2 :
    • Nombre : worker1
    • vCPU : mínimo 2
    • RAM : mínimo 2 GB
    • IP : 192.168.56.11
  • Máquina virtual 3 :
    • Nombre : worker2
    • vCPU : mínimo 2
    • RAM : mínimo 2 GB
    • IP : 192.168.56.12
Para ayudarle a configurar este entorno, hemos puesto a su disposición un repositorio con una configuración Vagrant/Virtualbox lista para usar.

RECORDATORIO: Este TP está dedicado a la configuración de Docker, pero dado que es un TP avanzado, necesitará nociones y conocimientos de DevOps que no son exclusivos de Docker pero que se utilizarán en sus configuraciones. Necesitará las siguientes habilidades que puede aprender gratis: Obviamente, pondremos a su disposición el máximo de información para que avance incluso sin estos requisitos previos.

Para esto, necesita instalar Vagrant y Virtualbox en su máquina. Una vez hecho esto, solo necesita ejecutar los siguientes comandos:
git clone https://github.com/RousselTM/docker-formation
cd docker-formation/tp
vagrant up

Preconfiguración #

Se necesitan las siguientes acciones para preparar su entorno de prueba.

  1. Los dominios

    Debe declarar los siguientes dominios en su máquina (en el archivo hosts). Se utilizarán para acceder a los diferentes subproyectos y deben apuntar a 127.0.0.1 (En el siguiente TP introduciremos Traefik para optimizar la gestión de puertos):
    • tp.elearning.rousseltm.fr: Para acceder a las aplicaciones. Por ejemplo, para acceder a la aplicación 1, usaremos la dirección http://tp.elearning.rousseltm.fr/app1
    • registry.tp.elearning.rousseltm.fr : para acceder a Harbor
    • grafana.tp.elearning.rousseltm.fr : para acceder a Grafana
    • prometheus.tp.elearning.rousseltm.fr : para acceder a Prometheus
    En la empresa, debe utilizar un servidor DNS.
  2. Instalación de Docker

    Puede verificar si sus máquinas se han iniciado correctamente con el siguiente comando:
    vagrant status
    Si se iniciaron correctamente (status running), puede conectarse a la máquina controlplane (futuro manager Swarm) con el siguiente comando:
    vagrant ssh controlplane
    Compruebe que Docker está instalado, iniciado y habilitado al arranque en todas las máquinas virtuales, y que el usuario vagrant puede ejecutar comandos docker.
  3. Modo SWARM

    Debe configurar el clúster de Docker con el modo SWARM activado. La máquina 'controlplane' debe ser el administrador del clúster y las máquinas 'workerX' deben ser los trabajadores del clúster. Como las máquinas tienen varias direcciones IP, usaremos la IP 192.168.56.10 como dirección de gestión del plano de control.
    RECORDATORIO: En todas las máquinas creadas por Vagrant hay una carpeta /vagrant que corresponde al montaje de la carpeta donde se encuentra el archivo Vagrantfile: es decir, el contenido de la carpeta tp del repositorio. Por lo tanto, puede utilizar esta carpeta para compartir archivos entre las máquinas. Por ejemplo, el archivo que contiene los tokens para unirse al clúster. Obviamente en Producción, deberá utilizar una solución más segura.
    Debe proporcionar el comando de Docker que permitirá almacenar en /vagrant/swarm-token-worker el token para unirse al clúster como trabajador (worker).
  4. Red compartida

    Debe crear las siguientes redes:
    • common-proxy: para la comunicación entre contenedores a través del proxy. Se usará completamente en el siguiente TP con el uso de Traefik.
    • common-observability: para la comunicación entre los contenedores de observabilidad
    Realizaremos una implementación mixta para manipular la comunicación entre los subproyectos implementados con el modo SWARM y aquellos sin el modo SWARM. Por lo tanto, es necesario configurar el parámetro correcto en la red 'common-proxy' durante su creación.

Subproyecto 1 #

Lo que vas a aprender en esta sección
  • Desplegar un registro Harbor
  • Importar una imagen en un registro
  • Buscar vulnerabilidades en una imagen
  • Configurar la sobreescritura de un archivo docker compose
  • Uso avanzado de etiquetas (labels) (Implementación en el Proyecto 2)
Vamos a crear un registro de docker con Harbor en la máquina controlplane (manager del clúster). Lo haremos funcionar en el dominio registry.tp.elearning.rousseltm.fr. Para este primer proyecto, lo implementaremos en HTTP en el puerto 5000 (puerto predeterminado de los registros Docker en HTTP).
RECORDATORIO: El sitio oficial de Harbor https://goharbor.io/ y puede revisar el video de presentación de Harbor en esta dirección: Presentación y despliegue de Harbor
  1. Despliegue

    Debe instalar Harbor con el servicio trivy en el puerto 5000. Si todo está bien, debería poder acceder a Harbor desde la máquina anfitriona en la dirección
    http://registry.tp.elearning.rousseltm.fr:5000
    INFORMACIÓN: Cree una carpeta llamada 'projects' en la carpeta tp del repositorio: es visible en todas las máquinas virtuales en /vagrant/projects. Para usar las rutas de este TP, cree en cada VM el enlace sudo ln -s /vagrant/projects /opt/projects. Así que puede usarla para gestionar los archivos de sus subproyectos. Recomendamos 1 carpeta por subproyecto.
  2. Personalización

    El script install.sh generó un archivo docker-compose.yml por lo que si deseamos modificar parámetros deberemos editar este archivo. Pero perderemos todas nuestras modificaciones en cada ejecución del script.

    Debe proponer una solución para evitar esto sabiendo que queremos que el contenedor 'proxy' se conecte a la red 'common-proxy' y que tenga la etiqueta (label) dt.owner (Explicación de esta etiqueta Dynatrace) con el valor 'equipe1'. Al mismo tiempo, agregue una etiqueta para decirle a Filebeat que no tome en cuenta sus registros (logs).

    Inicialmente lo desplegaremos simplemente con 'docker compose' para probar y posteriormente en forma de stack 'docker stack'.

    ATENCIÓN: La sobreescritura también debe ser tomada en cuenta por el script install.sh

Subproyecto 2 #

  1. Build de la imagen

    Debe crear un Dockerfile para construir una imagen para la siguiente aplicación GO que se llamará simple-app y tendrá la etiqueta 1.0: Esta aplicación debe generar un binario '/app/simple-app' y usar '/app' como directorio de trabajo.
  2. Adición de la imagen al registro Harbor

    Debe enviar esta imagen al proyecto (Explicación sobre el concepto de proyecto en Harbor) 'library' en Harbor. Elegimos 'library' porque es el proyecto público predeterminado. Así, la imagen podrá ser utilizada en otros proyectos (Ver el siguiente TP). Para recordar, tras su instalación, Harbor está disponible en la dirección
    http://registry.tp.elearning.rousseltm.fr:5000
  3. Análisis de vulnerabilidades (Scan)

    Debe escanear la imagen importada para verificar sus vulnerabilidades contra las fallas CVE.

  4. Despliegue Docker

    La configuración a construir debe satisfacer estas necesidades:
    • Aplicación 2-tier: go y redis
    • Los servicios solo deben ejecutarse en los workers. Esta configuración debe ser externalizada para permitir compartirla con otras aplicaciones en el mismo caso.
    • Los servicios deben usar las últimas versiones (en producción use versiones fijas) de las imágenes oficiales y la aplicación GO usar la imagen construida anteriormente y disponible en Harbor.
    • 1 instancia de cada servicio
    • El servicio GO debe exportar la variable de entorno APP='APP1'
    • El servicio GO debe exportar la variable de entorno TASK_SLOT donde debe poner el número de réplica del contenedor (Las plantillas (templates)).
    • El servicio de la aplicación go debe estar conectado a la red 'common-proxy'
  5. Balanceo de carga (Load balancing)

    Debe verificar que cuando llame a la URL de la aplicación (http://tp.elearning.rousseltm.fr) realmente devuelve esta página y que los campos resaltados cambian cuando actualiza la página, alternando bien entre los dos contenedores:

Subproyecto 3 #

Subproyecto de observabilidad que consta de Prometheus, Grafana, Node exporter y cAdvisor. Este subproyecto es el de observabilidad y, por tanto, nos permitirá tener visibilidad sobre todo nuestro proyecto.

  1. Despliegue Docker

    La configuración a construir debe satisfacer estas necesidades:
    • Hacer accesible Grafana en el puerto 3000
    • Hacer accesible Prometheus en el puerto 9090
  2. Configuración de los servicios

    La configuración a construir debe satisfacer estas necesidades:
    • Importar automáticamente a Grafana la fuente de datos (datasource) de Prometheus y Elasticsearch
    • Importar los paneles (dashboards) con el ID: 609
    • Recopilar métricas de Traefik
    • Recopilar métricas de todos los nodos del clúster
    • Recopilar métricas de todos los contenedores

Nivel de dificultad : ●●●○○ (3/5)

Mi seguimiento

  • ⏱ Duración estimada : ≈ 1 h 31

🧪 Iniciar el entorno de prácticas ↗

Inicia sesión para seguir tu progreso y tomar notas. Iniciar sesión

💬 Hacer una pregunta

Glossaire de la formation

Microservicios

Arquitectura donde una aplicación se divide en varios servicios pequeños e independientes, a menudo desplegados en la nube.

Docker

Herramienta que permite virtualizar y empaquetar aplicaciones dentro de contenedores ligeros para un despliegue óptimo.Ejemplo de despliegue de un con...

Prometheus

Sistema de monitorización y alertas de código abierto, particularmente adaptado para la recopilación de métricas en entornos dinámicos (como Kubernete...

Kubernetes

Plataforma de código abierto de orquestación de contenedores que permite automatizar el despliegue, el escalado y la gestión de aplicaciones en conten...

CI/CD

Integración Continua y Despliegue Continuo. Prácticas DevOps destinadas a automatizar las pruebas y el despliegue de aplicaciones para entregar de for...

Terraform

Herramienta de Infraestructura como Código (IaC) que permite definir y aprovisionar recursos de infraestructura en la nube y on-premise a través de ar...

Métricas

Medidas numéricas recopiladas a intervalos regulares (ej: CPU, RAM, tiempo de respuesta) utilizadas para evaluar el estado de salud general de un sist...

DevOps

Cultura, movimiento y prácticas destinadas a unificar el desarrollo de software (Dev) y la administración de infraestructuras informáticas (Ops).

API Gateway

Pasarela que sirve de punto de entrada único para todas las solicitudes hacia arquitecturas de microservicios. Gestiona el enrutamiento, la seguridad ...

Arquitectura

Diseño global y estructural de un sistema informático, definiendo sus diferentes componentes, sus relaciones y los principios que guían su evolución.

Artefacto (Artifact)

Resultado final de un proceso de compilación o construcción de software (build), como un archivo .jar, un archivo zip o una imagen de Docker, listo pa...

Repositorio (Repository)

Depósito de almacenamiento centralizado. Puede referirse a un repositorio de código fuente (ej: Git) o a un repositorio de artefactos y binarios (ej: ...

Ansible

Herramienta de automatización informática de código abierto (IaC) que permite la gestión de configuraciones, el despliegue de aplicaciones y la orques...

Artículos recomendados

Bonnes pratiques Docker : images, exécution, sécurité et exploitation

Les bonnes pratiques Docker : Dockerfile et builds multi-étapes, images minimales et reproductibl...

Aide-mémoire Docker : Les commandes essentielles

Un guide pratique regroupant toutes les commandes indispensables pour manipuler les images, les c...

Sécurité réseau des conteneurs (container network security) et networking Kubernetes

Sécuriser le réseau des conteneurs : fonctionnement du networking Docker et Kubernetes, CNI, Netw...

Container registry : choisir et sécuriser son registre d'images (Docker Hub, Harbor, GHCR, ECR)

Comprendre les registres de conteneurs : Docker Hub, GitHub Container Registry, registres cloud (...

Docker : vue d'ensemble, architecture et premiers pas

Découvrir Docker : conteneurs vs machines virtuelles, architecture client/daemon/registre, images...

Traefik : vue d'ensemble, architecture et premier déploiement

Découvrir Traefik : reverse proxy et load balancer cloud-native, entrypoints, routers, services, ...

Sécuriser Kubernetes : RBAC, NetworkPolicies, sécurité réseau des conteneurs et Pod Security

Sécuriser Kubernetes : RBAC (Role, ClusterRole, bindings), ServiceAccounts, NetworkPolicies, Pod ...

HAProxy comme Ingress Controller Kubernetes : Le Guide de Production

Découvrez comment utiliser HAProxy comme Ingress Controller dans Kubernetes. Architecture Direct-...

Traefik : les providers (Docker, Kubernetes, Nomad, Consul, fichiers, clés-valeurs)

Les providers alimentent la configuration dynamique de Traefik : découverte des services Docker, ...

Apoyar

♥ APOYAR

Apoya RousselTM Learning

Los cursos, artículos, prácticas y certificados siguen siendo gratuitos y sin publicidad intrusiva. Una contribución libre, por el importe que elijas, financia el alojamiento, los entornos de prácticas y nuevos contenidos.

Contribuir con PayPal Importe libre · tarjeta o cuenta PayPalMás información
QR code PayPal
O escanea este código QR con tu teléfono

¡Gracias, cada contribución cuenta!