La virtualización#

La virtualización es una tecnología que permite la creación de entornos virtuales o máquinas virtuales (VM) que funcionan de manera independiente en un mismo sistema físico. Consiste en la abstracción de los recursos físicos, como la CPU, la memoria, el almacenamiento y los dispositivos de entrada/salida, para asignarlos y compartirlos entre varias máquinas virtuales.

El objetivo principal de la virtualización es maximizar la utilización de los recursos físicos y mejorar la eficiencia de los sistemas informáticos. Al utilizar la virtualización, es posible ejecutar múltiples sistemas operativos y aplicaciones en un único servidor o computadora, lo que reduce la necesidad de hardware físico adicional.

Algunos conceptos clave relacionados con la virtualización son:

  • Hipervisor: También conocido como monitor de máquina virtual (VMM), es el software o firmware responsable de crear y gestionar las máquinas virtuales. Se encarga de asignar y administrar los recursos físicos entre las VM.

    Existen dos tipos principales de hipervisores:

    • Hipervisor de tipo 1 o "nativo" (Bare Metal Hypervisor): Este tipo de hipervisor se ejecuta directamente sobre el hardware físico sin depender de un sistema operativo anfitrión. Actúa como una capa de virtualización entre el hardware y las máquinas virtuales. Algunos ejemplos de hipervisores de tipo 1 son:

      • VMware ESXi

      • Microsoft Hyper-V

      • Citrix XenServer

      • KVM (Kernel-based Virtual Machine)

      • Oracle VM Server

    • Hipervisor de tipo 2 o "hosted" (Hosted Hypervisor): Este tipo de hipervisor se ejecuta como una aplicación dentro de un sistema operativo anfitrión. Utiliza los recursos y servicios del sistema operativo subyacente para proporcionar la virtualización. Algunos ejemplos de hipervisores de tipo 2 son:

      • VMware Workstation

      • Oracle VirtualBox

      • Microsoft Virtual PC

      • Parallels Desktop

  • Máquina virtual (VM): Es un entorno virtual que emula una computadora completa con su propio sistema operativo, aplicaciones y configuraciones. Cada VM se ejecuta de forma aislada y puede ser tratada como una entidad independiente.

  • Host: Es el sistema físico o servidor que ejecuta el hipervisor y aloja las máquinas virtuales.

  • Guest: Es la máquina virtual que se ejecuta dentro de un host. Puede ser un sistema operativo completo o una instancia de una aplicación específica.

  • Portabilidad: Las máquinas virtuales son independientes del hardware subyacente, lo que facilita su migración entre diferentes servidores físicos sin necesidad de modificar el sistema operativo o las aplicaciones.

  • Escalabilidad: La virtualización permite escalar verticalmente (aumentar los recursos asignados a una VM) o escalar horizontalmente (agregar más VM) según las necesidades de carga de trabajo.

La virtualización se utiliza en diversos entornos, como servidores, redes, almacenamiento y escritorios, proporcionando flexibilidad, eficiencia y mayor aprovechamiento de los recursos informáticos.

Que sus componentes sean virtuales no quiere decir necesariamente que no existan. Por ejemplo, una máquina virtual puede tener unos recursos reservados de 2 GB de RAM y 20 GB de disco duro, que salen del PC donde está instalada la máquina virtual.

Hay varias aplicaciones muy conocidas capaces de hacer esto; las más famosas son VMware, VirtualBox, QEMU, etc.

VirtualBox#

../_images/virtualbox.png

Resumen:

OVF/OVA : es un estándar abierto para empaquetar y distribuir un dispositivo virtual que consta de una o varias máquinas virtuales (VM).

Clonación completa: se crea una copia exacta e independiente de la máquina original, incluyendo todos los archivos de disco duro virtual. Tarda más y ocupa más espacio, pero el clon no depende para nada de la máquina original (se puede mover o borrar cualquiera de las dos).

Clonación enlazada: se crea una nueva máquina, pero sus discos virtuales no son una copia, sino archivos de diferencias vinculados a los discos de la máquina original (VirtualBox crea para ello una instantánea de la original). Por eso el clon se crea casi al instante y ocupa muy poco espacio: solo va guardando lo que cambia respecto a la original. A cambio, la máquina original no se puede borrar mientras existan sus clones, y no podrás mover el clon a otro ordenador sin mover también los discos originales. Es la que usaremos en los casos prácticos para crear varias máquinas a partir de una misma base.

Al clonar, en Política de dirección MAC conviene elegir "Generar nuevas direcciones MAC para todos los adaptadores de red": como ya sabemos, en una misma LAN no puede haber dos interfaces de red con igual MAC, y si el clon conserva las MAC de la original tendremos problemas de red a nivel de enlace en cuanto arranquen las dos a la vez. Si nos encontramos con MAC duplicadas después de clonar, hay que cambiarlas a mano en la configuración de red de la MV.

VirtualBox Guest Additions es un conjunto de controladores y aplicaciones del sistema que mejoran el rendimiento y la funcionalidad de un sistema operativo invitado que se ejecuta dentro de una máquina virtual de VirtualBox. Cuando instalas las Guest Additions en el sistema operativo invitado, se habilitan funciones como carpetas compartidas, integración de ratón sin problemas, mejor soporte de video y mejor rendimiento.

El paquete de Guest Additions proporciona controladores adicionales para el hardware de tu máquina virtual, incluyendo gráficos, redes y dispositivos de entrada. También incluye utilidades que te permiten redimensionar la ventana de la máquina virtual dinámicamente, compartir carpetas entre el sistema anfitrión y el invitado, y habilitar el intercambio de portapapeles.

Las instantáneas (snapshots) en VirtualBox son una característica que te permite guardar el estado actual de una máquina virtual en un punto específico del tiempo. Con las instantáneas, puedes capturar una imagen completa de la máquina virtual, incluyendo su configuración, discos virtuales y memoria, y luego restaurarla posteriormente si es necesario.

Al crear una instantánea, VirtualBox guarda una copia del estado actual de la máquina virtual, incluyendo los registros de la CPU, la memoria y el estado de los discos virtuales. Esto te permite revertir fácilmente a ese punto en el tiempo en caso de que realices cambios o configuraciones que desees deshacer más adelante.

Las tecnologías VT-x (Intel Virtualization Technology) y AMD-V (AMD Virtualization) son extensiones de hardware que proporcionan soporte para la virtualización en procesadores Intel y AMD, respectivamente. Estas tecnologías permiten que los hipervisores, como VirtualBox, ejecuten máquinas virtuales de manera más eficiente y segura. Si habilitamos esa opción, entonces también podremos habilitar "Habilitar paginación anidada" que mejorará aún más el rendimiento del sistema permitiendo gestionar la memoria por medio del hardware y no del software.

los discos duros estáticos tienen un tamaño fijo, ofrecen un rendimiento constante pero pueden ocupar más espacio en el almacenamiento del host. Los discos duros dinámicos crecen según sea necesario, permiten un uso eficiente del almacenamiento y son más fáciles de migrar y copiar, pero pueden experimentar fragmentación y pueden tener un rendimiento ligeramente inferior en comparación con los discos estáticos

La opción PAE/NX permite habilitar el acceso a más de 4 GB de memoria RAM en sistemas de 32 bits y se habilita la protección NX para mejorar la seguridad del sistema. Si se deshabilita, el sistema operativo y las aplicaciones estarán limitados a utilizar solo 4 GB de memoria y no se aprovechará la protección NX.

En “Carpetas Compartidas”, podemos crear una carpeta compartida entre la máquina anfitrión y la invitada. Para ello, hacemos clic en “Agregar Carpeta compartida”…

En Avanzado, podemos cambiar otras opciones, como puede ser el permitir que ambos sistemas, el invitado y el anfitrión, puedan compartir el portapapeles, lo que permitirá copiar y pegar de uno a otro.

  • RED

    • Cable conectado que se encuentra en la parte de opciones avanzadas en la sección de red de la MV (también en el menú contextual del icono de red que se encuentra en la parte inferior derecha de la ventana de la MV, eligiendo Connect Network Adapter, o a través del menú de la MV Dispositivos -> Red).

    • Modo NAT es la forma más sencilla que tiene una MV para acceder a una red externa. Por lo general, no se requiere ninguna configuración en la red, ni en el anfitrión ni en el invitado. Por esta razón, es el modo de red por defecto en VB. En modo NAT, VB coloca un router entre el exterior (hacia donde hace NAT) y el invitado. Dicho router posee un servidor DHCP que sirve hacia el interior. Este router mapea el tráfico desde y hacia la MV de forma transparente. Cada MV en modo NAT tendrá su propio router, por lo que estarán en redes aisladas, lo que implica, que por defecto, las MMVV que tienen su tarjeta de red en modo NAT no pueden verse entre sí.

    • Modo Red NAT, el cual funciona como el router de nuestra casa, es decir, los equipos que estén dentro de la misma red NAT podrán comunicarse entre sí, y es aquí donde radica la diferencia con el modo NAT el cual siempre constituye una red con un único equipo y no de varios como ahora es el caso. Para utilizarlo tenemos que crear la red NAT : Desde el menú Archivo -> Preferencias -> Red -> Redes NAT.

    • Modo Adaptador puente simula que la tarjeta virtual está conectada al mismo switch que la tarjeta física del anfitrión, por lo tanto, la MV se va a comportar como si fuese un equipo más dentro de la misma red física en la que está el equipo anfitrión.

    • Modo Red interna, podemos construir redes aisladas, en las cuales solo habrá comunicación entre las MsVs que pertenezcan a la misma red interna.

    • Modo Solo-anfitrión se utiliza para crear una red interna a la que pertenecerá también el equipo anfitrión, algo que no sucede en el modo Red interna.

Comandos útiles de VirtualBox#

  • VBoxManage list vms: Listar máquinas virtuales

  • VBoxManage list runningvms: Listar máquinas virtuales que están ejecutándose

  • VBoxManage startvm 'Ubuntu Server 24.04' --type headless: Ejecutarla sin entorno gráfico

  • VBoxManage controlvm 'Ubuntu Server 24.04' savestate: Guardar el estado

En modo gráfico (Ctrl_derecho es la tecla anfitrión por defecto):

  • Ctrl_derecho : libera el ratón y el teclado capturados por la MV

  • Ctrl_derecho + Supr : Ctrl + Alt + Supr

  • Ctrl_derecho + f : pasar/volver de pantalla completa

  • Ctrl_derecho + c : pasar/volver de modo escalado

Caso práctico: MV Ubuntu Server 26.04#

  • Descárgate el sistema operativo Ubuntu Server 26.04 LTS en formato (ISO) de su página oficial

  • Utiliza un disco de 200 GB y 2 GB de RAM

  • Iniciamos la máquina y procedemos a la instalación, llama a esta máquina virtual MV Ubuntu Server 26.04

  • Utiliza un adaptador puente para la red con IP 10.4.X.Y/8 (255.0.0.0), donde X.Y son parte de las ips de vuestros equipos, en el caso de que tengas un portátil utiliza DHCP o una Red Nat.

  • DNS 8.8.8.8, Gateway 10.0.0.2 y subred 10.0.0.0/8

  • Hacemos el siguiente esquema de particiones, para ello selecciona (x) Custom storage layout

    ../_images/MV_Ubuntu_Server_22.04.jpg
  • Usuario: tunombre y utiliza de contraseña: alumno Para el nombre del servidor utiliza compute-0-0, si no lo has hecho durante la instalación modifica el archivo /etc/hostname

Vídeos Ubuntu 26.04:

Vídeos Ubuntu 24.04: vídeo de instalación , vídeo de configuración ssh server + MobaXterm, vídeo ssh-copy.id , Gestión de usuarios

Caso práctico: Windows 11#

  • Descárgate la ISO de Windows 11 de la página de Microsoft

  • Creamos una nueva máquina virtual llamada Windows11

  • Creamos una máquina virtual con 100GB de disco duro reservado dinámicamente, 4GB de RAM, dos procesadores, un adaptador en modo puente y una memoria de vídeo de 128MB. Omite la instalación desatendida y habilita EFI, Secure Boot y el TPM

  • Para la instalación desconecta el cable de red virtual:

    Configuración/Red/Adaptador1/Avanzadas/[ ]Cable conectado

  • En el caso de que aparezca el aviso de "startup.nsh" en VirtualBox, presionamos shift+F10 y cambiamos el idioma a English, vamos a continuar y pasamos al menú de instalación.

  • Selecciona "No tengo clave de producto" y selecciona Windows 11 Education

  • Selecciona la instalación personalizada : instalar solo Windows (avanzado)

  • Configuramos Windows con una cuenta local [1], para ello :

    • Omitimos una segunda distribución de teclado y cuando se quiera conectar a una red seleccionamos "No tengo internet"

    • Seguimos con Continuar con la configuración limitada

    • Configuramos Windows con una cuenta local

      • usuario : tunombre

      • contraseña : @lumn0

    • Preguntas de seguridad para esta cuenta:

      • ¿Cuál era el nombre de tu primera mascota? @lumn0

      • ¿Cuál es el nombre de la ciudad en la que naciste? @lumn0

      • ¿Cuál era tu apodo de infancia? @lumn0

  • No permitimos que Microsoft y las aplicaciones usen tu ubicación, ni permitimos que encuentren nuestro dispositivo, es decir que en las siguientes preguntas, le diremos que "No" o "Solo los obligatorios": le daremos los mínimos permisos a Microsoft sobre nuestros datos y máquinas.

  • De igual manera rechazamos la ayuda del asistente digital y no usamos el reconocimiento de voz en línea

Notas

Caso práctico: Windows Server 2022#

Windows Server es la plataforma para crear una infraestructura de aplicaciones conectadas, redes y servicios web. Como administrador de Windows Server, probablemente haya usado muchas de las consolas nativas de Administración de Microsoft (MMC) de Windows Server para mantener la infraestructura segura y disponible.

  • Windows Server Standard: la licencia da derecho a ejecutar como máximo dos máquinas virtuales. Es ideal para un entorno no virtualizado o poco virtualizado.

  • Windows Server Datacenter: permite ejecutar un número ilimitado de máquinas virtuales. Se recomienda para un entorno altamente virtualizado que requiera características de alta disponibilidad, incluida la agrupación en clústeres.

  • Respecto a la interfaz de usuario, durante la instalación se ofrecen dos posibilidades (desde Windows Server 2016 la elección es definitiva: ya no se puede pasar de una a otra después de instalar, como sí permitía Windows Server 2012):

    • Server Core: reduce el espacio requerido en el disco, la posible superficie expuesta a ataques y especialmente los requisitos de servicio y reinicio del servidor.

    • Servidor con experiencia de escritorio (GUI): ofrece los elementos de la interfaz de usuario y las herramientas de administración gráficas.

Si no dispones de una licencia de Windows Server 2022, puedes obtener, de forma totalmente gratuita, una versión de evaluación plenamente funcional durante un periodo de 180 días en la siguiente dirección https://www.microsoft.com/es-ES/evalcenter/evaluate-windows-server-2022

  • Creamos una máquina virtual con 100GB de disco duro reservado dinámicamente, 2GB de RAM, 2CPU, un adaptador en modo puente y una memoria de vídeo de 128MB

  • Para la instalación seleccionamos: Windows Server 2022 Standard Evaluation (experiencia de escritorio)

  • Contraseña del Administrador: @lumn0

  • Utiliza un adaptador puente para la red con IP 10.4.X.Y/8 (255.0.0.0), donde X.Y son parte de las ips de vuestros equipos, en el caso de que tengas un portátil utiliza DHCP, DNS 8.8.8.8, Gateway 10.0.0.2

  • Configurar nombre: Panel / Servidor local : Cambiamos nombre equipo, le llamamos SRV-tunombre

  • Comprobar que la zona horaria sea la correcta : Servidor local / Ajustar zona horaria

  • Habilitamos ping : Administrador del servidor / Panel / Herramientas, buscamos la opción de Firewall de Windows con seguridad avanzada y nos vamos a las reglas de entrada, que es donde el firewall nos está bloqueando el tráfico. Buscamos la regla “Archivos e impresoras compartidas (petición eco: ICMPv4 de entrada)” y, con el botón derecho, la habilitamos

Caso práctico: Windows Server 2022 sin GUI#

  • Creamos una máquina virtual llamada WS22tunombre, con 100GB de disco duro reservado dinámicamente, 2GB de RAM, 2CPU, un adaptador en modo puente y una memoria de vídeo de 128MB

  • Para la instalación seleccionamos: Windows Server 2022 Standard Evaluation, sin "experiencia de escritorio" (la versión Server Core, sin la mayor parte del entorno gráfico)

  • Instalación nueva : Personalizada, instalar solo Windows (avanzado) y usamos todo el disco.

  • Contraseña del Administrador: @lumn0

  • Instala el servidor ssh

  • Utiliza un adaptador puente para la red con IP 10.4.X.Y/8 (255.0.0.0), donde X.Y son parte de las ips de vuestros equipos, en el caso de que tengas un portátil utiliza DHCP, DNS 8.8.8.8, Gateway 10.0.0.2

  • Cambia el nombre por WS22tunombre

  • Habilita el ping

  • Instala el editor vi

ayuda: Configuración de Windows (PowerShell)

Docker#

Docker es una plataforma de código abierto en la que se usan contenedores que permite empaquetar, distribuir y ejecutar aplicaciones en entornos aislados

A diferencia de las máquinas virtuales, los contenedores comparten el kernel del sistema operativo subyacente y solo virtualizan los recursos a nivel de aplicación, lo que los hace más ligeros y rápidos.

Componentes principales

  • Imagen: Plantilla de solo lectura que contiene el sistema operativo, el entorno de ejecución y la aplicación.

  • Contenedor: Instancia en ejecución de una imagen.

  • Docker Engine: Motor que gestiona los contenedores, incluida la creación, ejecución y eliminación.

  • Dockerfile: Archivo de texto que contiene las instrucciones para construir una imagen.

Dockerfile y construcción de imágenes

  • Un Dockerfile especifica cómo se debe ensamblar una imagen.

  • Se utiliza el comando docker build para construir una imagen a partir de un Dockerfile.

Docker Hub

Registro público de imágenes Docker donde puedes encontrar imágenes preconstruidas para muchas aplicaciones y sistemas operativos.

Redes y volúmenes

  • Docker permite la creación de redes virtuales para conectar contenedores entre sí.

  • Los volúmenes permiten persistir datos más allá del ciclo de vida de un contenedor.

Orquestación de contenedores

Herramientas como Docker Swarm y Kubernetes permiten gestionar y escalar grandes clústeres de contenedores.

Tipos de redes

  • Bridge (puente)

    • Es la red predeterminada en Docker.

    • Permite la comunicación entre los contenedores en el mismo host.

    • Cada contenedor tiene su propia dirección IP en la subred de la red puente.

    • Útil para aplicaciones que se ejecutan en un solo host y necesitan comunicarse entre sí.

  • Host (anfitrión)

    • Los contenedores comparten el espacio de red con el host.

    • No hay aislamiento de red entre los contenedores y el host.

    • Los contenedores pueden acceder a los mismos puertos que el host.

    • Proporciona un mejor rendimiento en comparación con las redes puente para aplicaciones que necesitan acceder a recursos del host.

  • Overlay (superposición)

    • Permite la comunicación entre contenedores en hosts diferentes en un clúster de Docker Swarm.

    • Utiliza la tecnología de redes de superposición para conectar contenedores en diferentes hosts.

    • Proporciona una red virtualizada única para el clúster, independiente de la infraestructura subyacente.

  • Macvlan

    • Asigna una dirección MAC única a cada contenedor, lo que los hace aparecer como dispositivos físicos en la red.

    • Los contenedores tienen su propia dirección IP en la red física.

    • Útil para integrar contenedores en redes existentes que dependen de la comunicación a nivel de capa 2.

  • None (ninguna)

    • No se asigna ninguna red al contenedor.

    • Útil para contenedores que no necesitan acceso de red en absoluto.

Gestión de imágenes y contenedores#

  • docker build: construir una imagen a partir de un Dockerfile.

  • docker tag: Etiquetamos la imagen.

  • docker push: Subimos la imagen.

  • docker pull: Descarga una imagen de Docker Hub u otro repositorio.

  • docker images: lista las imágenes.

  • docker rmi: Elimina una imagen.

  • docker run: Crea y ejecuta un contenedor a partir de una imagen.

  • docker ps: Muestra los contenedores en ejecución.

  • docker ps -a: Muestra todos los contenedores.

  • docker exec -it compute-0-0 /bin/bash : Acceder a una shell Bash dentro de un contenedor.

  • docker stop / docker start: Detiene o inicia un contenedor.

  • docker commit: Guarda los cambios de un contenedor en la imagen.

  • docker rm: Elimina un contenedor.

Caso práctico: Instalación de Docker en Ubuntu 24.04 LTS#

# Desinstalación de versiones antiguas
sudo apt-get remove docker.io
sudo apt-get remove docker-doc
sudo apt-get remove docker-compose
sudo apt-get remove docker-compose-v2
sudo apt-get remove podman-docker
sudo apt-get remove containerd
sudo apt-get remove runc

# Añade la clave GPG oficial de Docker:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Añadir el repositorio a las fuentes de APT:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

#Instalar los paquetes de Docker Engine
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin

#Asignación de permisos al usuario para ejecutar docker cli
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

#Configuración del arranque automático de los servicios
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

#Comprobaciones
docker ps

Caso práctico: construir una imagen de docker y subirla al repositorio#

Lo primero que haremos es darnos de alta en Docker Hub es un repositorio de imágenes de contenedores público y centralizado, donde los usuarios pueden:

  • Almacenar y compartir imágenes de contenedores

  • Descubrir imágenes de contenedores

  • Colaborar en proyectos

  • Automatizar flujos de trabajo

Para construir una imagen de Docker, necesitamos crear el archivo Dockerfile, veamos el siguiente para construirnos una imagen de Ubuntu 24.04:

# Usar Ubuntu 24.04 como imagen base
FROM ubuntu:24.04

# Actualizar los repositorios y paquetes
RUN apt-get update && apt-get upgrade -y

Las instrucciones más comunes en un Dockerfile:

  1. FROM: Define la imagen base desde la cual se construirá la nueva imagen.

  2. COPY o ADD: Copian archivos o directorios desde el sistema de archivos del host al sistema de archivos del contenedor.

  3. RUN: Ejecuta comandos en el contenedor durante la fase de construcción.

  4. WORKDIR: Establece el directorio de trabajo para las instrucciones RUN, CMD, ENTRYPOINT, COPY y ADD.

  5. CMD: Especifica un comando que se ejecuta cuando se inicia un contenedor.

  6. ENTRYPOINT: Configura un contenedor para que se ejecute como un ejecutable.

  7. EXPOSE: Indica que el contenedor escucha en puertos específicos en tiempo de ejecución.

  8. ENV: Establece variables de entorno.

Construimos la imagen:

docker build -t ubuntu:24.04 .

Etiquetamos la imagen:

docker tag ubuntu:24.04 dgtrabada/ubuntu:24.04

Para subir la imagen, primero iniciar sesión en Docker Hub y luego la subimos push:

docker login

docker push dgtrabada/ubuntu:24.04
../_images/docker_pull.png

Vamos a instalar el editor vim y la actualizamos:

#Listar imágenes:
$ docker images

REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
dgtrabada/ubuntu   24.04     e9b7aed9fff2   10 minutes ago   267MB

#Creamos un nuevo contenedor
docker run -it dgtrabada/ubuntu:24.04 /bin/bash

#instalamos el editor vim
root@e9b7aed9fff2:/# apt-get install -y vim

#nos salimos del contenedor (Ctrl+d)
#listamos los contenedores:
$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND         CREATED         STATUS         PORTS     NAMES
406694d11d68   dgtrabada/ubuntu:24.04   "/bin/bash"   2 minutes ago   Up 2 minutes

#mandamos los cambios a la imagen
$ docker commit 406694d11d68 dgtrabada/ubuntu:24.04
sha256:bffbb89703458ec685907be409c758e07207a3420d513780b247aa9d4ebe1d2a

#subimos la imagen a Docker Hub
$ docker push dgtrabada/ubuntu:24.04

Para ejecutar este contenedor en cualquier otro ordenador con docker lo único que tenemos que hacer es:

#Se bajará la imagen
$ docker pull dgtrabada/ubuntu:24.04

#Crear un nuevo contenedor
docker run -it dgtrabada/ubuntu:24.04 /bin/bash
../_images/docker.png

Caso práctico: Instalar servidor de ssh, ip y ping#

Nos bajamos la imagen del repositorio, creamos un contenedor e instalamos los comandos:

root@4e7e1f17f985:/# apt update
root@4e7e1f17f985:/# apt-get install -y iproute2 iputils-ping
root@4e7e1f17f985:/# apt-get install -y openssh-server

Configuramos ssh para poder iniciar sesión como root:

root@4e7e1f17f985:/# mkdir /var/run/sshd
root@4e7e1f17f985:/# echo 'root:alumno' | chpasswd
root@4e7e1f17f985:/# sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

#Por último lanzamos el demonio sshd y ya puedes conectarte por ssh
root@4e7e1f17f985:/# /usr/sbin/sshd -D &
../_images/docker_ssh.png

Salimos del contenedor y mandamos los cambios a la imagen

$ docker commit 4e7e1f17f985 dgtrabada/ubuntu:24.04
sha256:fc2ab89b8f222c6b10d9c66e3c055e9e1c0dbfa45add33e603b8043b6c1a1beb

#subimos la imagen a Docker Hub
$ docker push dgtrabada/ubuntu:24.04

#podemos lanzar el sshd del contenedor con:
docker exec -it 4e7e1f17f985 /usr/sbin/sshd

Fíjate que podríamos haber hecho lo mismo con el siguiente Dockerfile:

# Usar Ubuntu 24.04 como imagen base
FROM ubuntu:24.04

# Actualizar los repositorios y paquetes
RUN apt-get update && apt-get upgrade -y

# Instalamos
RUN apt-get install -y vim iproute2 iputils-ping openssh-server

RUN mkdir /var/run/sshd

# Cambiar la contraseña del usuario root
RUN echo 'root:alumno' | chpasswd

# Permitir el acceso por SSH al root
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

Caso práctico: Contenedores en una misma subred#

docker tiene por defecto 3 redes

root@UStunombre:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e6ab6d5cdeea   bridge    bridge    local
a39dbd6d158e   host      host      local
1092da8fd7e1   none      null      local

Vamos a crear una nueva subred llamada red16, que por defecto se creará en modo bridge:

docker network create --subnet=172.16.0.0/16 red16

Crearemos un contenedor con ip 172.16.0.100 llamado compute-0-0

#primero lo creamos
docker run -it --network red16 --ip 172.16.0.100  --hostname compute-0-0 --name compute-0-0 dgtrabada/ubuntu:24.04 /bin/bash

#Para lanzar el contenedor:
docker start  compute-0-0

#levantamos el servidor ssh
docker exec -it compute-0-0 /usr/sbin/sshd -D &

Hacemos lo mismo para compute-0-1 compute-0-2, con ips 172.16.0.101 y 172.16.0.102, lanza los tres contenedores [2] y haz que se pueda acceder por ssh sin contraseña desde compute-0-0 a compute-0-1 y compute-0-2

../_images/docker_sshkeygen.png

Footnotes

docker-compose.yml#

Docker Compose es una herramienta que permite definir y gestionar aplicaciones de múltiples contenedores de Docker, usa un archivo YAML para definir los servicios, redes y volúmenes que necesita tu aplicación, y luego usar un solo comando para crear e iniciar todos estos servicios.

Típicamente contiene varias secciones importantes:

  • Version: Define la versión del formato de archivo de Docker Compose.

  • Services: Define los servicios (contenedores) que forman parte de tu aplicación.

  • Networks (opcional): Define las redes personalizadas que se utilizarán.

  • Volumes (opcional): Define los volúmenes personalizados que se utilizarán para almacenar datos.

En los ejemplos anteriores podríamos levantar las tres máquinas con el siguiente docker-compose.yml ejecutando docker-compose up -d, para este ejemplo tienes que tener red16 ya creada

version: '3.8'
services:

  compute-0-0:
    image: dgtrabada/ubuntu:24.04
    container_name: compute-0-0
    hostname: compute-0-0
    networks:
      red16:
        ipv4_address: 172.16.0.100
    tty: true
    stdin_open: true

  compute-0-1:
    image: dgtrabada/ubuntu:24.04
    container_name: compute-0-1
    hostname: compute-0-1
    networks:
      red16:
        ipv4_address: 172.16.0.101
    tty: true
    stdin_open: true

  compute-0-2:
    image: dgtrabada/ubuntu:24.04
    container_name: compute-0-2
    hostname: compute-0-2
    networks:
      red16:
        ipv4_address: 172.16.0.102
    tty: true
    stdin_open: true

networks:
  red16:
    external: true

Kubernetes#

También conocido como K8s es un sistema open-source para la automatización del despliegue, escalado y gestión de aplicaciones en contenedores.

Fue desarrollado originalmente por Google y ahora es mantenido por la Cloud Native Computing Foundation (CNCF).

Partes Principales#

  • Nodo (Node):

    • Nodos Maestro (Master Nodes): Administran el clúster y toman decisiones sobre la gestión del clúster.

    • Nodos de Trabajo (Worker Nodes): Ejecutan las aplicaciones en contenedores.

  • Pod: - La unidad de despliegue más pequeña en Kubernetes, que puede contener uno o varios contenedores.

  • Controlador (Controller): Mantienen el estado deseado del clúster. Tipos de controladores incluyen:

    • Deployment: Administra la creación y escalado de un conjunto de pods.

    • ReplicaSet: Asegura que un número específico de pods estén corriendo.

    • StatefulSet: Administra la persistencia y el orden de los pods.

    • DaemonSet: Asegura que todos (o algunos) nodos ejecuten una copia de un pod.

  • Servicio (Service): Define un conjunto lógico de pods y una política para acceder a ellos. Tipos de servicios incluyen:

    • ClusterIP: Expone el servicio en una IP interna del clúster.

    • NodePort: Expone el servicio en el mismo puerto en cada nodo del clúster.

    • LoadBalancer: Utiliza un balanceador de carga externo.

  • ConfigMap y Secret:

    • ConfigMap: Separa la configuración estática del código de la aplicación.

    • Secret: Almacena y gestiona información sensible.

  • Volumen (Volume): Permiten el almacenamiento persistente de datos en los contenedores.

  • Ingress: Gestiona el acceso externo a los servicios en un clúster, típicamente mediante HTTP.

  • Namespace: Divide un clúster de Kubernetes en secciones virtuales para separar ambientes como desarrollo, testing y producción.

Funcionamiento Básico#

  1. Planificación: El planificador asigna pods a los nodos de trabajo basándose en la disponibilidad de recursos.

  2. Orquestación y Gestión: Kubernetes garantiza que la aplicación esté en el estado deseado y reprograma pods en caso de fallos.

  3. Escalado: Kubernetes puede escalar automáticamente la cantidad de instancias de una aplicación.

  4. Mantenimiento y Actualización: Kubernetes permite actualizaciones sin tiempo de inactividad mediante controladores como Deployment que gestionan actualizaciones de manera gradual.

Caso práctico: Instalar kubernetes en Ubuntu 24.04#

El kubelet (el agente de Kubernetes que corre en cada nodo del clúster) requiere que la swap esté desactivada: Kubernetes lo asume para garantizar un rendimiento consistente y predecible de las aplicaciones. Si la swap está habilitada, el sistema puede empezar a mover partes de la memoria de trabajo de los contenedores al disco, degradando el rendimiento y la estabilidad.

#actualizamos
sudo apt-get update
sudo apt-get upgrade -y

#Desactivamos la swap
sudo swapoff -a
#y comentamos su linea en /etc/fstab para que no se active al reiniciar

#Configurar el enrutamiento IP
sudo modprobe br_netfilter
echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward

#Instalar dependencias necesarias
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

#Instalar docker
sudo apt-get install -y docker.io
sudo systemctl enable docker #habilitamos
sudo systemctl start docker #iniciamos

#Añadir la clave GPG del repositorio de Kubernetes
#(cambia v1.33 por la rama estable que quieras instalar, hay un repositorio por versión)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

#Añadir el repositorio de Kubernetes
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list

#Actualizar el repositorio e instalar kubeadm, kubelet y kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

#los marcamos para que apt no los actualice por su cuenta
#(las actualizaciones de un cluster se hacen de forma controlada con kubeadm)
sudo apt-mark hold kubelet kubeadm kubectl