ProgramaciónInfoDocker

Docker es una plataforma de software que permite crear, desplegar y ejecutar aplicaciones de manera aislada en contenedores. Los contenedores son entornos ligeros que agrupan todas las dependencias necesarias para ejecutar una aplicación, lo que asegura que funcione de la misma manera independientemente del sistema en el que se ejecute.

¿Qué es Docker?

Docker es un software de código abierto que utiliza la virtualización basada en contenedores para empaquetar aplicaciones junto con todas sus dependencias. Esto asegura que las aplicaciones se ejecuten de manera consistente sin importar el entorno subyacente (Windows, Linux o macOS) donde se desplieguen. A diferencia de las máquinas virtuales tradicionales, Docker no virtualiza un sistema operativo completo; en su lugar, utiliza el núcleo de Linux para ejecutar múltiples contenedores que comparten el mismo núcleo pero están aislados entre sí

¿Qué es un contenedor?

Un contenedor es una unidad estandarizada que encapsula una aplicación y todas sus dependencias (como bibliotecas, código, configuraciones, etc.) en un paquete que puede ejecutarse en cualquier entorno. Los contenedores son similares a las máquinas virtuales (VM), pero son mucho más ligeros porque no incluyen un sistema operativo completo, sino que comparten el kernel del sistema operativo del anfitrión.

Componentes Clave de Docker

  • Docker Engine: Es el motor que permite crear y gestionar contenedores. Funciona como un sistema cliente-servidor

  • Docker Daemon: Procesa las solicitudes y gestiona las imágenes y contenedores

  • Docker Client: Interfaz principal para interactuar con el Docker Daemon a través de comandos

  • Dockerfile: Archivo de texto que contiene instrucciones para construir una imagen Docker. Cada línea representa un paso, como instalar dependencias o copiar archivos.

  • Docker Hub: Es un repositorio en línea donde los usuarios pueden almacenar y compartir imágenes Docker. Existen imágenes oficiales (publicadas por Docker) y otras proporcionadas por la comunidad.

  • Docker Compose: Es una herramienta que permite definir y ejecutar aplicaciones de múltiples contenedores. Con un archivo YAML llamado docker-compose.yml, puedes especificar cómo se deben construir y coordinar los contenedores que forman parte de una aplicación compleja (como una aplicación web con un contenedor para el servidor y otro para la base de datos).

  • Contenedores (Containers): Un contenedor es una instancia en ejecución de una imagen. Se puede considerar como una "caja" que ejecuta la aplicación con todas sus dependencias encapsuladas. Los contenedores son portátiles, ligeros y tienen un tiempo de inicio muy rápido en comparación con las máquinas virtuales.

  • Imágenes (Images): Son plantillas de solo lectura que contienen el sistema operativo base y las aplicaciones que quieres ejecutar. Cada imagen se construye a partir de un archivo llamado Dockerfile, donde se especifican todos los pasos necesarios para crear el entorno. Las imágenes son reutilizables y pueden compartirse a través de Docker Hub, un repositorio centralizado donde puedes almacenar y descargar imágenes Docker.

¿Cómo funciona Docker?

Docker utiliza tecnologías de virtualización a nivel de sistema operativo, como namespaces y cgroups en Linux, para crear contenedores que se ejecutan aislados del resto del sistema, pero comparten el kernel. De esta forma, un contenedor tiene su propio espacio de procesos, red y sistema de archivos, aunque siga utilizando el núcleo del sistema operativo del host.

Las aplicaciones se empaquetan en imágenes Docker, que son plantillas inertes. Cuando se ejecuta una imagen, se crea un contenedor activo. Esto permite crear varios contenedores a partir de la misma imagen, facilitando la escalabilidad y el manejo eficiente de recursos.

  1. Dockerfile: Para crear un contenedor, los desarrolladores escriben un Dockerfile, que es un archivo de texto que contiene las instrucciones necesarias para construir la imagen de Docker, como el sistema operativo base, las dependencias, el código de la aplicación y los comandos de configuración.

  2. Imágenes de Docker: Las imágenes son "plantillas" que contienen el entorno completo necesario para ejecutar una aplicación. Las imágenes se construyen a partir de los Dockerfiles y pueden ser almacenadas y distribuidas mediante un repositorio de imágenes, como Docker Hub.

  3. Contenedores de Docker: Un contenedor es una instancia de una imagen que se está ejecutando. Al ejecutar una imagen, Docker crea un contenedor en el que la aplicación se ejecuta de manera aislada.

¿Por qué usar Docker?

  1. Portabilidad: Los contenedores de Docker son independientes del sistema operativo en el que se ejecutan, por lo que puedes llevar tu aplicación desde tu máquina de desarrollo a producción (en otro servidor) sin preocuparte por problemas de compatibilidad o configuración.

  2. Aislamiento: Cada contenedor está aislado, lo que significa que los problemas en un contenedor no afectarán a otros. Además, puedes ejecutar múltiples aplicaciones con diferentes dependencias en un mismo servidor sin conflictos.\

  3. Eficiencia: A diferencia de las máquinas virtuales, los contenedores no necesitan un sistema operativo completo, lo que hace que sean mucho más ligeros y rápidos de iniciar. Además, el uso compartido del kernel ahorra recursos del sistema.

  4. Facilidad de despliegue: Docker permite automatizar el proceso de construcción y despliegue de aplicaciones, lo que mejora los flujos de trabajo de integración continua y entrega continua (CI/CD).

  5. Escalabilidad: Docker facilita la escalabilidad horizontal (añadir más instancias de una aplicación) mediante herramientas como Docker Swarm o la integración con plataformas de orquestación de contenedores como Kubernetes.

Ventajas de Usar Docker

  • Portabilidad: Las aplicaciones en contenedores pueden trasladarse fácilmente entre diferentes entornos sin problemas de compatibilidad.

  • Consistencia en los entornos: Docker garantiza que el entorno de desarrollo sea idéntico al de producción.

  • Aislamiento: Cada aplicación corre en su propio contenedor, lo que reduce conflictos entre dependencias y mejora la seguridad.

  • Eficiencia: Al compartir el núcleo del sistema operativo, los contenedores son más ligeros y rápidos de iniciar en comparación con las máquinas virtuales.

  • Automatización: Facilita la implementación continua (CI/CD) al permitir a los desarrolladores probar y desplegar aplicaciones rápidamente.

Casos de Uso Comunes

Docker es ampliamente utilizado en DevOps para:

  • Desarrollar y probar aplicaciones localmente antes de desplegarlas en producción.

  • Automatizar flujos de trabajo y orquestar servicios mediante herramientas como Kubernetes.

  • CI/CD: Docker se utiliza para ejecutar procesos automatizados de integración continua y despliegue continuo, garantizando que las aplicaciones se prueben en entornos coherentes.

  • Facilitar la creación de microservicios, donde cada componente puede ser desplegado y escalado independientemente.

Ejemplo de flujo de trabajo con Docker:

  1. Desarrollar: Escribes el código de tu aplicación y un Dockerfile que define el entorno y las dependencias.

  2. Construir: Utilizas Docker para construir una imagen de tu aplicación.

docker build -t mi-app .
  1. Ejecutar: Creas y ejecutas un contenedor a partir de la imagen.
docker run -d -p 8080:80 mi-app
  1. Desplegar: Subes tu imagen a un repositorio como Docker Hub y luego puedes ejecutarla en cualquier servidor que tenga Docker instalado.

Comparación con las máquinas virtuales:

  • Máquinas virtuales: Simulan todo un sistema operativo completo, incluyendo el kernel, lo que requiere más recursos. Cada máquina virtual es independiente y pesada.

  • Contenedores: Comparten el mismo núcleo del sistema operativo, pero mantienen aislamiento a nivel de proceso, lo que los hace más ligeros y rápidos.

CaracterísticaDocker (Contenedores)Máquinas Virtuales (VMs)
TamañoLigero (comparten el kernel)Pesado (cada VM tiene su propio SO)
Tiempo de arranqueRápido (en segundos)Más lento (en minutos)
Consumo de recursosEficiente (usa menos RAM y CPU)Menos eficiente
AislamientoA nivel de proceso, no a nivel de hardwareA nivel de hardware

Curso de Docker

  • Docker es un proyecto de código abierto que permite automatizar el despliegue de aplicaciones dentro de contenedores o containers.
  • Docker fue iniciado por Salomon Hykes dentro de una empresa llamada dotCloud, junto con otros colaboradores.
  • Docker fue liberado como codigo abierto en marzo de 2013.
  • Aunque no es el unico entorno de contenedores existente, es actualmente el mas utilizado.
  • Se han ido creando colaboraciones con grandes empresas del sector, que de hecho participan de forma activa en el proyecto.

¿Qué es un contenedor?

  • Un contenedor empaqueta de forma ligera todo lo necesario para que uno o mas procesos funcionen: código, herramientas del sistema, bibliotecas del sistema, dependencias, etc.
  • Esto garantiza que siempre se podrá ejecutar, independientemente del entorno en el que queramos desplegarlo.
docker001

Empaquetando App

  • Por tanto, Docker está orientado a solucionar un problema similar pero en el mundo tecnológico.
  • Poner en un contenedor un determinado entorno y que este pueda ser usado en cualquier plataforma si tener que cambiar nada.
docker002

Máquinas virtuales y Contenedores

Las máquinas virtuales (VMs) y los contenedores son dos tecnologías de virtualización que permiten ejecutar aplicaciones en entornos aislados, pero difieren significativamente en su arquitectura y uso.

docker003
Máquinas Virtuales (VMs)

Definición: Las máquinas virtuales emulan un sistema completo, incluyendo hardware, CPU, memoria y almacenamiento. Cada VM opera con su propio sistema operativo, lo que permite ejecutar múltiples sistemas operativos en un solo hardware físico.

Funcionamiento: Utilizan un hipervisor para gestionar los recursos del hardware físico. Este hipervisor actúa como una capa de abstracción que permite a las VMs acceder a los recursos del sistema.

Ventajas:

  • Aislamiento fuerte: Cada VM es completamente independiente, lo que proporciona un alto nivel de seguridad y cumplimiento, ideal para aplicaciones críticas.
  • Flexibilidad: Permiten la ejecución de diferentes sistemas operativos y aplicaciones en el mismo servidor físico, lo que es útil para pruebas y desarrollo.

Desventajas:

  • Consumo de recursos: Requieren más recursos debido a la necesidad de emular un sistema operativo completo, lo que puede resultar en un inicio más lento y mayor uso de memoria.
  • Gestión compleja: La configuración y el mantenimiento pueden ser más complicados debido a la necesidad de gestionar múltiples sistemas operativos.
Contenedores

Definición: Los contenedores son entornos ligeros que empaquetan una aplicación junto con todas sus dependencias necesarias para ejecutarse. A diferencia de las VMs, no emulan hardware, sino que comparten el núcleo del sistema operativo del host.

Funcionamiento: Los contenedores utilizan el kernel del sistema operativo subyacente mientras aíslan las aplicaciones específicas y sus bibliotecas. Esto les permite ser extremadamente rápidos y portables.

Ventajas:

  • Modernizar de forma sencilla aplicaciones tradicionales
  • CI (Continuous Integration ) y CD (Continuous delivery) en DEVOPS
  • Fácil integración de entornos en la nube
  • Solución ideal para microservicios, etc…
  • Ligereza y rapidez: Los contenedores son mucho más ligeros que las VMs, lo que permite un inicio casi instantáneo y un menor consumo de recursos. Esto los hace ideales para entornos de desarrollo ágil y despliegue continuo.
  • Portabilidad: Pueden ejecutarse en cualquier entorno compatible con el kernel, facilitando la migración entre diferentes plataformas sin problemas de compatibilidad.

Desventajas:

  • Aislamiento limitado: Aunque ofrecen cierto aislamiento, comparten el mismo kernel del sistema operativo, lo que puede ser un riesgo en términos de seguridad para aplicaciones sensibles.
  • Dependencia del entorno del host: Los contenedores dependen del kernel del sistema operativo host, lo que puede limitar su uso en ciertos escenarios donde se requieren configuraciones específicas del sistema operativo.

La elección entre máquinas virtuales y contenedores depende principalmente de las necesidades específicas del proyecto:

  • Usar VMs cuando se requiera un alto nivel de aislamiento o se necesiten ejecutar múltiples sistemas operativos.
  • Optar por contenedores para aplicaciones modernas que requieren rapidez, portabilidad y eficiencia en el uso de recursos.

Ambas tecnologías pueden complementarse; por ejemplo, se pueden ejecutar contenedores dentro de máquinas virtuales para combinar sus beneficios en entornos específicos.

Diferencias clave

AspectoMáquinas VirtualesContenedores
VirtualizaciónHipervisorMotor de contenedores
Sistema operativoIncluye un SO completoComparte el kernel del anfitrión
Uso de recursosMás intensivoMás ligero
Tiempo de inicioLentoRápido
EscalabilidadAdecuado para aplicaciones monolíticasIdeal para microservicios
PortabilidadAlta pero depende de la VMMuy alta y consistente entre entornos
AislamientoFuerte, debido al SO independienteLigero, compartiendo el SO del anfitrión

Monolítico vs. Microservicios

El término monolítico se refiere a un sistema o aplicación que está diseñado y construido como una unidad única e indivisible. En el contexto de desarrollo de software, una aplicación monolítica es aquella en la que todos los componentes y funciones (como la interfaz de usuario, la lógica de negocio y el acceso a datos) están interconectados y funcionan como un único programa.

A diferencia de las aplicaciones monolíticas, la arquitectura de microservicios divide la aplicación en múltiples servicios pequeños, independientes y especializados. Cada microservicio funciona de manera autónoma y puede desarrollarse, implementarse y escalarse de forma independiente, lo cual mejora la flexibilidad y la capacidad de respuesta de la aplicación en entornos modernos y escalables.

Monolítico se refiere a una estructura unificada y acoplada, mientras que los microservicios ofrecen una arquitectura más modular y flexible.

Arquitectura de Docker

Docker es una plataforma que permite la creación, despliegue y ejecución de aplicaciones en contenedores. Su arquitectura se basa en una estructura cliente-servidor, lo que significa que existe una interacción entre el cliente (usuario) y el servidor (máquina que ejecuta Docker).

docker004

Los principales componentes son: Docker Daemon (dockerd):

  • Qué es: Es el corazón de Docker. Es un proceso que se ejecuta en segundo plano en el sistema operativo y gestiona los contenedores. Este demonio maneja las solicitudes del cliente Docker y las ejecuta, construyendo, ejecutando, y gestionando contenedores.
  • Función principal: Aceptar las solicitudes del cliente, gestionar contenedores, imágenes y redes. También se encarga de ejecutar contenedores de acuerdo con las configuraciones definidas.

Docker Client (docker):

  • Qué es: Es la interfaz que el usuario utiliza para interactuar con Docker. Puedes usar la línea de comandos (docker) o herramientas gráficas para enviar comandos al demonio.
  • Función principal: Enviar comandos al demonio para que se ejecute una acción específica, como crear contenedores o imágenes.

Docker Images:

  • Qué son: Son plantillas o instantáneas de un sistema de archivos que contienen todo lo necesario para ejecutar una aplicación. Una imagen es inmutable, es decir, no cambia una vez creada.
  • Función principal: Contiene los archivos y las configuraciones de la aplicación que se va a ejecutar, así como las dependencias necesarias para su funcionamiento.
  • Cómo se crean: Se crean mediante un archivo llamado Dockerfile, que es un script que contiene una serie de instrucciones que indican cómo construir una imagen (por ejemplo, qué sistema operativo base usar, qué aplicaciones instalar, etc.).
  • Estrategia de capas: Las imágenes de Docker están formadas por varias capas. Cada vez que se ejecuta un comando en un Dockerfile (por ejemplo, copiar archivos o instalar una dependencia), Docker crea una nueva capa sobre la anterior, lo que optimiza el almacenamiento y la reutilización de capas.

Docker Containers:

  • Qué son: Son instancias en ejecución de una imagen de Docker. Es decir, cuando inicias una imagen, se convierte en un contenedor en ejecución.
  • Función principal: Proporcionan un entorno aislado y ligero para ejecutar aplicaciones. Los contenedores comparten el mismo núcleo del sistema operativo, pero funcionan de forma independiente y no interfieren entre sí.
  • Diferencia entre contenedor e imagen: Una imagen es estática, mientras que un contenedor es dinámico y puede cambiar durante su ejecución (aunque puedes crear imágenes a partir de contenedores modificados).

Docker Registry:

  • Qué es: Es un repositorio donde se almacenan las imágenes de Docker. Docker Hub es el registro público por defecto, pero también se pueden configurar registros privados.
  • Función principal: Permite la distribución y almacenamiento de imágenes, facilitando su descarga y uso por otros usuarios.

Docker Volumes:

  • Qué son: Son mecanismos para persistir datos fuera de los contenedores. Los contenedores pueden ser efímeros y eliminarse, pero los volúmenes permiten que los datos persistan entre reinicios de contenedores.
  • Función principal: Mantener la persistencia de datos y compartir datos entre contenedores.

Docker Networks:

  • Qué son: Son redes virtuales que permiten que los contenedores se comuniquen entre sí y con el mundo exterior.
  • Función principal: Configurar la comunicación entre contenedores, entre contenedores y el host, y entre contenedores y el exterior.

Flujo de trabajo básico de Docker

  1. Crear una imagen:
    • Escribes un Dockerfile que describe cómo construir la imagen.
    • Usas el comando docker build para crear la imagen a partir de ese Dockerfile.
  2. Ejecutar un contenedor:
    • Usas el comando docker run para crear un contenedor a partir de una imagen.
    • Docker crea un contenedor a partir de la imagen y lo ejecuta en un entorno aislado.
  3. Gestionar contenedores:
    • Puedes detener, iniciar, eliminar y administrar contenedores usando comandos como docker ps, docker stop, docker start, y docker rm.
  4. Usar un registro:
    • Las imágenes pueden ser subidas o descargadas desde un registro como Docker Hub con docker push y docker pull.

Para usar Docker de forma efectiva, es crucial entender cómo interactúan estos componentes:

  • Las imágenes son plantillas que contienen todo lo necesario para ejecutar una aplicación.
  • Los contenedores son instancias de imágenes que se ejecutan y contienen un entorno aislado para tu aplicación.
  • Los daemons gestionan la creación y ejecución de contenedores, así como la interacción con el cliente.

Docker proporciona una forma eficiente y escalable de empaquetar aplicaciones y sus dependencias, permitiendo su ejecución consistente en diferentes entornos, lo cual facilita el desarrollo y la implementación de aplicaciones.

Estándares de contenedores

OCI

  • OCI (Open Container Initiative) apareció en este 2015.
  • Su misión es promover la estandarización de contenedores.
  • Los contenedores pueden ejecutarse en cualquier hardware y sistema, y componentes relacionados.
  • No hay necesidad de vincularse a ningún contenedor de tiempo de ejecución.
  • Implementa 2 estándares:
    • Runtime Specification (runtime-spec): como ejecutar contenedores
    • Image Specification (image-spec): como deben ser las imágenes
Built with LogoFlowershow