DOCKER.docx
Document Details
Uploaded by FeasibleHydrangea
UPC
Full Transcript
**DOCKER** Docker es una plataforma de código abierto que permite la creación, distribución y ejecución de aplicaciones de manera rápida y sencilla en entornos virtualizados. Proporciona una forma de empaquetar una aplicación y todas sus dependencias en un contenedor virtualizado, conocido como con...
**DOCKER** Docker es una plataforma de código abierto que permite la creación, distribución y ejecución de aplicaciones de manera rápida y sencilla en entornos virtualizados. Proporciona una forma de empaquetar una aplicación y todas sus dependencias en un contenedor virtualizado, conocido como contenedor Docker. Un contenedor Docker es una instancia ligera y aislada de una aplicación que contiene todo lo necesario para ejecutarla de manera independiente, incluyendo el código, las bibliotecas, las herramientas y los archivos de configuración necesarios. Los contenedores Docker son portables y consistentes, lo que significa que funcionarán de la misma manera en cualquier entorno donde Docker esté instalado, ya sea en una máquina local, en un centro de datos o en la nube. Algunas de las características y ventajas de Docker son: 1\. Aislamiento: Los contenedores Docker proporcionan un alto nivel de aislamiento, lo que significa que cada contenedor tiene su propio entorno de ejecución separado y no afecta a otros contenedores en el mismo sistema. 2\. Portabilidad: Los contenedores Docker son portables, lo que significa que se pueden ejecutar en cualquier sistema operativo o infraestructura que tenga Docker instalado, lo que facilita la migración y la implementación en diferentes entornos. 3\. Eficiencia: Los contenedores Docker son ligeros y comparten el kernel del sistema operativo del host, lo que los hace más eficientes en términos de uso de recursos en comparación con las máquinas virtuales tradicionales. 4\. Escalabilidad: Docker facilita la escalabilidad horizontal de las aplicaciones, lo que significa que se pueden crear múltiples contenedores idénticos para manejar cargas de trabajo pesadas y distribuir la carga de manera equitativa. 5\. Gestión y automatización: Docker proporciona herramientas y comandos para gestionar y automatizar el ciclo de vida de los contenedores, como la creación, distribución, actualización y eliminación de contenedores. En resumen, Docker es una plataforma de virtualización a nivel de contenedor que permite empaquetar y distribuir aplicaciones de manera eficiente y portátil. Su enfoque en la portabilidad, la eficiencia y la facilidad de uso ha ganado popularidad en la comunidad de desarrollo y en la implementación de aplicaciones en diversos entornos. **El kernel del sistema operativo (SO)** es la parte central y fundamental del software de un sistema operativo. Es el núcleo que interactúa directamente con el hardware de la computadora y brinda servicios básicos para que las aplicaciones y los procesos puedan funcionar correctamente. El kernel actúa como un intermediario entre el hardware y el software, proporcionando una capa de abstracción que permite a los programas de software interactuar con los componentes físicos de la computadora, como la memoria, el procesador, los dispositivos de entrada/salida, etc. Las principales funciones del kernel del SO incluyen: 1\. Gestión de memoria: El kernel administra la memoria del sistema, asignando y liberando recursos de memoria a los procesos y aplicaciones que se ejecutan en el sistema. 2\. Gestión de procesos: El kernel maneja la planificación y ejecución de los procesos, asignando recursos de CPU y controlando la ejecución concurrente y la comunicación entre los procesos. 3\. Gestión de dispositivos: El kernel administra los dispositivos de hardware y proporciona una interfaz para que los programas y aplicaciones puedan interactuar con ellos. Controla el acceso a los dispositivos y maneja las operaciones de entrada/salida. 4\. Gestión del sistema de archivos: El kernel maneja las operaciones de lectura y escritura en el sistema de archivos, permitiendo a los programas acceder y almacenar datos en el almacenamiento permanente. 5\. Seguridad: El kernel proporciona mecanismos de seguridad para proteger el sistema y los datos, controlando el acceso a los recursos y aplicando políticas de seguridad. Es importante destacar que el kernel puede variar según el tipo de sistema operativo. Por ejemplo, existen diferentes kernels para sistemas operativos como Linux, Windows, macOS, entre otros. Cada kernel está diseñado de acuerdo con los principios y requisitos específicos del sistema operativo en el que se utiliza. En resumen, el kernel del sistema operativo es el núcleo fundamental del software que interactúa directamente con el hardware de la computadora y proporciona servicios esenciales para que los programas y procesos puedan funcionar correctamente. Es responsable de la gestión de recursos, la ejecución de procesos, el manejo de dispositivos y la seguridad del sistema operativo. El **kernel del sistema operativo (SO) de host** se refiere al kernel que está instalado y se ejecuta en la máquina física o servidor en la que se encuentra el sistema operativo. En el contexto de la virtualización y los contenedores, el término \"host\" se utiliza para referirse al sistema operativo subyacente que aloja los entornos virtuales o contenedores. Cuando se utiliza virtualización o contenedores, el sistema operativo de host es el que proporciona los recursos físicos, como CPU, memoria, almacenamiento y dispositivos de entrada/salida, a los entornos virtualizados o contenedores que se ejecutan en él. El kernel del sistema operativo de host tiene la responsabilidad de gestionar estos recursos físicos y proporcionar una capa de abstracción que permita la ejecución y el funcionamiento adecuado de los entornos virtuales o contenedores. Por ejemplo, en el caso de la virtualización con hipervisor, el kernel del sistema operativo de host administra el acceso de los sistemas operativos invitados a los recursos físicos y gestiona la comunicación entre ellos y el hardware subyacente. En el caso de los contenedores, el kernel del sistema operativo de host se encarga de asignar recursos a los contenedores, gestionar su ejecución, facilitar la comunicación entre ellos y asegurar su aislamiento del sistema operativo de host y otros contenedores. Cabe destacar que el sistema operativo de host puede ser diferente al sistema operativo utilizado dentro de los entornos virtuales o contenedores. Por ejemplo, se puede tener un sistema operativo de host Linux que aloje contenedores con sistemas operativos invitados Linux y Windows. En resumen, el kernel del sistema operativo de host es el kernel instalado y en ejecución en la máquina física o servidor que proporciona los recursos físicos y gestiona la ejecución de los entornos virtuales o contenedores. Es responsable de la gestión de recursos y proporciona una capa de abstracción para los entornos virtuales o contenedores que se ejecutan en él. Un **archivo Dockerfile** es un archivo de texto que contiene instrucciones para construir una imagen de Docker. Docker utiliza Dockerfiles para automatizar el proceso de creación de imágenes y la configuración del entorno de ejecución de contenedores. El Dockerfile define los pasos necesarios para crear una imagen Docker a partir de una configuración base. Las instrucciones en el archivo especifican las capas de la imagen, las dependencias necesarias, los comandos a ejecutar y las configuraciones del entorno. Algunas de las instrucciones comunes que se pueden encontrar en un Dockerfile son: \- \`FROM\`: Especifica la imagen base a partir de la cual se construirá la nueva imagen. \- \`RUN\`: Ejecuta comandos en el shell del contenedor durante el proceso de construcción de la imagen. \- \`COPY\` o \`ADD\`: Copia archivos y directorios desde el contexto local a la imagen. \- \`ENV\`: Define variables de entorno dentro del contenedor. \- \`EXPOSE\`: Especifica los puertos en los que el contenedor escuchará en tiempo de ejecución. \- \`CMD\` o \`ENTRYPOINT\`: Define el comando predeterminado que se ejecutará cuando se inicie el contenedor. El Dockerfile permite configurar y personalizar la imagen Docker de acuerdo con los requisitos del proyecto o la aplicación. Una vez que se ha creado el Dockerfile, se puede utilizar el comando \`docker build\` para construir la imagen Docker basada en ese archivo. El uso de Dockerfiles facilita la reproducción y la automatización de la construcción de imágenes, ya que todos los pasos y configuraciones necesarios se encuentran documentados en un único archivo. Además, permite compartir y distribuir fácilmente la configuración de una aplicación junto con su imagen Docker correspondiente. En resumen, un archivo Dockerfile es un archivo de texto que contiene instrucciones para construir una imagen de Docker. Define los pasos y la configuración necesarios para crear una imagen a partir de una configuración base, lo que permite automatizar y estandarizar el proceso de construcción de imágenes. Una **imagen Docker** es una plantilla o plantilla ejecutable que contiene todo lo necesario para ejecutar una aplicación en un entorno Docker. Es la base para crear y ejecutar contenedores Docker. Una imagen Docker está compuesta por capas, donde cada capa representa una instrucción en el archivo Dockerfile utilizado para construir la imagen. Cada capa contiene cambios o adiciones en relación con la capa anterior, lo que permite que las imágenes sean livianas y optimizadas. Una imagen Docker incluye el sistema operativo base, las bibliotecas, las dependencias, el código de la aplicación y cualquier otro componente necesario para ejecutar la aplicación. Estas imágenes son independientes y portables, lo que significa que se pueden ejecutar en cualquier entorno que tenga Docker instalado, proporcionando un alto nivel de consistencia y reproducibilidad. Las imágenes Docker se pueden obtener de diferentes fuentes, como el Docker Hub, un registro público y centralizado de imágenes Docker, o se pueden crear a través de Dockerfiles personalizados. Una vez que se tiene una imagen Docker, se puede utilizar para crear y ejecutar contenedores Docker. Un contenedor Docker es una instancia en ejecución de una imagen Docker. Múltiples contenedores se pueden crear a partir de una misma imagen, lo que permite la ejecución de varias instancias de una aplicación en un entorno aislado y seguro. Las imágenes Docker son una forma eficiente de distribuir y compartir aplicaciones, ya que contienen todo lo necesario para que la aplicación se ejecute de manera consistente en diferentes entornos. Además, se pueden actualizar y versionar fácilmente, lo que facilita la gestión y el despliegue de aplicaciones. En resumen, una imagen Docker es una plantilla ejecutable que contiene todo lo necesario para ejecutar una aplicación en un entorno Docker. Es independiente, portátil y se puede utilizar para crear y ejecutar contenedores Docker. Las imágenes Docker permiten la distribución y el despliegue eficiente de aplicaciones en diferentes entornos. La **relación entre una imagen Docker y los contenedores** es similar a la relación entre un programa y sus instancias en ejecución. Una imagen Docker es una plantilla o plantilla ejecutable que contiene todo lo necesario para ejecutar una aplicación en un entorno Docker. Es una representación estática y no modificable de un entorno de ejecución que incluye el sistema operativo base, las bibliotecas, las dependencias, el código de la aplicación y cualquier otro componente necesario. Un contenedor Docker, por otro lado, es una instancia en tiempo de ejecución de una imagen Docker. Es una entidad liviana y aislada que se crea a partir de una imagen y que se ejecuta en un entorno de contenedor Docker. Cada contenedor se ejecuta como un proceso aislado y tiene su propio espacio de recursos, su propia vista del sistema de archivos y sus propias redes de comunicación. La relación entre la imagen Docker y los contenedores es la siguiente: 1\. Creación de contenedores: Una vez que se tiene una imagen Docker, se puede utilizar para crear uno o varios contenedores. Cada contenedor se crea como una instancia única basada en la imagen, conservando todas las configuraciones y dependencias definidas en la imagen. 2\. Ejecución de contenedores: Los contenedores se ejecutan en un entorno Docker y utilizan la imagen como su plantilla de base. Cada contenedor tiene su propio espacio de trabajo aislado, su propio sistema de archivos y su propia instancia del sistema operativo, que se deriva de la imagen. 3\. Modificación y persistencia: Los contenedores son entidades efímeras y se pueden modificar durante su tiempo de ejecución. Sin embargo, estos cambios no afectan a la imagen subyacente. Si se desea persistir los cambios realizados en un contenedor, se pueden utilizar volúmenes o mecanismos de almacenamiento persistente para guardar los datos fuera del contenedor. 4\. Escalabilidad y reutilización: A partir de una única imagen Docker, se pueden crear múltiples contenedores idénticos. Esto permite escalar horizontalmente una aplicación y distribuir la carga de trabajo entre varios contenedores. Además, se pueden utilizar múltiples contenedores basados en la misma imagen para ejecutar diferentes instancias de una aplicación o servicios relacionados. En resumen, una imagen Docker es una plantilla ejecutable que define un entorno de ejecución, mientras que los contenedores son instancias en tiempo de ejecución basadas en una imagen. Los contenedores se crean a partir de una imagen, se ejecutan en un entorno Docker y proporcionan un aislamiento y una portabilidad para la ejecución de aplicaciones. EXPLICACIÓN MÁS CLARA Imagina que una imagen Docker es como un modelo o un plano para construir una casa. Contiene todas las instrucciones y especificaciones necesarias para crear una casa, como el diseño, los materiales de construcción y los acabados. Ahora, un contenedor Docker es como una casa real construida a partir de ese modelo. Es una instancia única y real de la casa, donde puedes vivir y realizar actividades. Cada contenedor es independiente de los demás, tiene su propio espacio y recursos asignados, y se ejecuta de forma aislada en un entorno Docker. Puedes crear múltiples contenedores a partir de la misma imagen Docker, al igual que puedes construir varias casas idénticas a partir del mismo modelo. Cada contenedor es una entidad separada, con su propio estado interno y configuración, pero todos comparten la misma estructura y características definidas por la imagen. Al igual que puedes modificar o decorar una casa sin afectar a las demás casas construidas a partir del mismo modelo, puedes realizar cambios y personalizaciones dentro de un contenedor Docker sin afectar a los demás contenedores basados en la misma imagen. En resumen, una imagen Docker es como un modelo de construcción que contiene las instrucciones y especificaciones para crear una casa, mientras que un contenedor Docker es una instancia real y aislada de esa casa construida a partir del modelo. Los contenedores son independientes entre sí, pero comparten la misma estructura y características definidas por la imagen. **Los contenedores Docker comparten el kernel del sistema operativo del host** en el que se ejecutan. Esto significa que el kernel del sistema operativo de host es utilizado por todos los contenedores que se ejecutan en él. Los contenedores Docker no tienen su propio kernel separado. Dado que los contenedores comparten el mismo kernel del sistema operativo del host, pueden aprovechar las capacidades del kernel y compartir recursos de forma eficiente. Esto hace que los contenedores sean más livianos y rápidos en comparación con las máquinas virtuales, que requieren su propio kernel y recursos dedicados. Sin embargo, cabe destacar que los contenedores pueden ejecutar diferentes distribuciones o versiones del sistema operativo en su espacio de usuario (userspace). Esto significa que aunque el kernel subyacente sea el mismo, los contenedores pueden tener diferentes bibliotecas, aplicaciones y configuraciones en su espacio de usuario. En resumen, los contenedores Docker comparten el kernel del sistema operativo del host en el que se ejecutan. Aunque el kernel es compartido, los contenedores pueden tener diferentes distribuciones o versiones del sistema operativo en su espacio de usuario. Esto permite una mayor eficiencia y aislamiento entre los contenedores. Cuando se dice que **Docker proporciona espacios de nombres (namespaces)**, se refiere a una característica de aislamiento del sistema operativo que permite que los procesos en contenedores Docker tengan su propio entorno aislado y único. Un espacio de nombres es un mecanismo del kernel de Linux que separa los recursos del sistema operativo en dominios o ámbitos independientes. Cada espacio de nombres proporciona un conjunto aislado de recursos para un aspecto específico del sistema, como procesos, red, sistema de archivos, usuarios, entre otros. Docker utiliza varios espacios de nombres para aislar y separar los contenedores entre sí y del sistema operativo host. Algunos de los espacios de nombres utilizados por Docker son: 1\. Espacio de nombres de proceso (PID namespace): Cada contenedor tiene su propio espacio de nombres de procesos, lo que significa que los procesos en un contenedor solo son visibles y accesibles dentro de ese contenedor. 2\. Espacio de nombres de red (network namespace): Cada contenedor tiene su propio espacio de nombres de red, lo que le permite tener su propia interfaz de red y su propia pila de red. Esto permite que los contenedores tengan su propia dirección IP y su propia configuración de red. 3\. Espacio de nombres de sistema de archivos (mount namespace): Los contenedores tienen su propio espacio de nombres de sistema de archivos, lo que les permite tener su propio sistema de archivos raíz aislado. Esto significa que los contenedores tienen su propio sistema de archivos independiente y no pueden ver ni acceder a los archivos del sistema operativo host o de otros contenedores. 4\. Espacio de nombres de usuario (user namespace): Docker utiliza el espacio de nombres de usuario para asignar identidades y privilegios de usuario dentro de los contenedores. Esto permite que los contenedores tengan sus propios usuarios y grupos aislados, sin interferir con los usuarios del sistema operativo host. Estos espacios de nombres proporcionan un nivel de aislamiento y separación entre los contenedores y el sistema operativo host, lo que garantiza que los procesos y recursos en un contenedor no interfieran con otros contenedores o con el sistema operativo host. En resumen, Docker utiliza los espacios de nombres del kernel de Linux para proporcionar aislamiento y separación entre los contenedores. Cada contenedor tiene su propio espacio de nombres de procesos, red, sistema de archivos y usuarios, lo que garantiza que los contenedores funcionen de forma aislada y segura. **Más claro con el símil de las casas** Imagina que estás construyendo un vecindario de casas utilizando Docker. Cada casa representa un contenedor Docker, y el vecindario es el entorno de ejecución de Docker. Ahora, cada casa tiene su propio espacio aislado y único, pero comparten el mismo terreno y las mismas calles del vecindario. Cada casa tiene su propio jardín, habitaciones y decoración interna, lo que representa el espacio de trabajo aislado de cada contenedor. En este vecindario Docker, hay diferentes aspectos de aislamiento que se logran mediante los espacios de nombres: 1\. Espacio de nombres de proceso: Cada casa tiene su propio conjunto de personas que viven en ella y solo interactúan entre sí dentro de la casa. Las personas de una casa no pueden ver ni interactuar con las personas de otras casas. Esto se logra utilizando el espacio de nombres de proceso, que aísla los procesos de cada contenedor. 2\. Espacio de nombres de red: Cada casa tiene su propia dirección y sistema de tuberías, lo que permite un enrutamiento independiente del agua y otros servicios de red. Esto se logra mediante el espacio de nombres de red de Docker, que permite que cada contenedor tenga su propia interfaz de red y configuración de red separada. 3\. Espacio de nombres de sistema de archivos: Cada casa tiene su propio conjunto de muebles, electrodomésticos y decoraciones, que son distintos a los de otras casas. Los objetos y pertenencias de una casa no pueden ser vistos o accedidos por las personas de otras casas. Esto se logra utilizando el espacio de nombres de sistema de archivos, que aísla el sistema de archivos de cada contenedor. 4\. Espacio de nombres de usuario: Cada casa tiene su propia identidad y llaves para ingresar a la casa. Esto significa que los residentes de una casa tienen sus propios nombres y privilegios únicos dentro de esa casa. El espacio de nombres de usuario de Docker permite que cada contenedor tenga sus propios usuarios y grupos aislados. En resumen, los espacios de nombres de Docker en el símil de las casas permiten que cada contenedor tenga su propio conjunto aislado de personas, dirección, sistema de tuberías, objetos y pertenencias, y usuarios. Aunque las casas comparten el mismo terreno y las mismas calles, el aislamiento de los espacios de nombres garantiza que cada contenedor funcione de forma independiente y segura dentro del vecindario de Docker. **Para poder utilizar los espacios de nombres (namespaces) en Docker** y dar nombre a los procesos, redes, sistemas de archivos y usuarios dentro de los contenedores, **se requiere que el sistema operativo subyacente sea Linux.** Los espacios de nombres son una característica proporcionada por el kernel de Linux, y Docker se basa en esta funcionalidad para lograr el aislamiento y la separación entre los contenedores. Específicamente, Docker utiliza las capacidades de espacios de nombres del kernel de Linux, como los espacios de nombres de proceso, red, sistema de archivos y usuario que mencionamos anteriormente. Es importante tener en cuenta que Docker también está disponible en otros sistemas operativos, como macOS y Windows, a través de herramientas de virtualización y emulación, como Docker Desktop. Sin embargo, en esos casos, los contenedores se ejecutan en máquinas virtuales o entornos emulados que utilizan un kernel de Linux subyacente para proporcionar los espacios de nombres necesarios. En resumen, para poder aprovechar los espacios de nombres y dar nombre a los procesos, redes, sistemas de archivos y usuarios dentro de los contenedores Docker, se requiere que el sistema operativo subyacente sea Linux. Los sistemas operativos macOS y Windows utilizan herramientas adicionales para permitir la ejecución de contenedores Docker utilizando un kernel de Linux subyacente. **Los contenedores Docker que se ejecutan en un kernel de Linux NO pueden tener un sistema operativo Windows**. **Los contenedores Docker comparten el kernel del sistema operativo host**, lo que significa que todos los contenedores en un host determinado deben utilizar el mismo sistema operativo base. Si deseas ejecutar contenedores con un sistema operativo Windows, debes utilizar Docker en un entorno que admita contenedores de Windows, como Docker Desktop para Windows. En este caso, Docker utiliza una versión especializada llamada \"Docker Engine - Enterprise\" que permite ejecutar contenedores de Windows. Es importante destacar que los contenedores de Windows y los contenedores de Linux son tecnologías diferentes y no son compatibles entre sí. Los contenedores de Windows utilizan características específicas de Windows y tienen requisitos y funcionalidades diferentes a los contenedores de Linux. Por lo tanto, si deseas ejecutar contenedores con un sistema operativo Windows, necesitarás utilizar un entorno adecuado que admita contenedores de Windows, y Docker Desktop para Windows es una opción común para ello. Una **API (Application Programming Interface) de alto nivel es una interfaz de programación que proporciona abstracciones y funcionalidades simplificadas para realizar tareas o interactuar con sistemas complejos**. Se enfoca en facilitar el uso y la interacción con el sistema subyacente, ocultando gran parte de los detalles y complejidades internas. Una API de alto nivel se construye sobre una API de bajo nivel, que generalmente ofrece un conjunto más detallado y granular de funciones y operaciones. La API de alto nivel encapsula la funcionalidad compleja en métodos, funciones o componentes que son más fáciles de entender y utilizar. Las API de alto nivel suelen ser más simples y abstraen los detalles internos para facilitar su uso. Proporcionan un nivel de abstracción que oculta la complejidad técnica y permite a los desarrolladores interactuar con el sistema de una manera más intuitiva y eficiente. Estas API se centran en tareas específicas y proporcionan funcionalidades más expresivas y orientadas a las necesidades del usuario final. Un ejemplo común de API de alto nivel es una biblioteca de programación que simplifica la interacción con una base de datos. En lugar de escribir consultas SQL complejas y manejar detalles de conexión y gestión de datos, la API de alto nivel proporciona métodos y funciones que permiten a los desarrolladores realizar operaciones de consulta y manipulación de datos de forma más sencilla y legible. En resumen, una API de alto nivel es una interfaz de programación que ofrece abstracciones y funcionalidades simplificadas para interactuar con sistemas complejos. Estas API ocultan los detalles internos y se centran en tareas específicas, lo que facilita su uso y permite a los desarrolladores ser más productivos. DE LOS APUNTES DE ALEX Docker daemon: dimoni que exposa una Interface REST per escoltar i gestionar les peticions de l'API docker. Normalment s'executa al mateix host que el client. Docker client: Principal forma d'interacció amb Docker (GUI Kitematic) Docker registries: Lloc on s'emmagatzemen les imatges (public, privat o local). Plataformes d'orquestració: Kubernetes (automatitza el desplegament de forma escalada i fer servir els contenidors sobre un clúster de servidors. Sistema altament portable), Google Cloud (basado en Kubernetes), Mesos, Docker Swarm. Docker Compose és una eina per definir i executar aplicacions docker multi-contenidor. Fa servir un fitxer de configuració en format YAML Pipeline: forma de treballar amb integració contínua. Permet definir un cicle de vida complet. Consisteix en definir un flux seqüencial. Facilita l'entrega contínua. S'utilitza Jenkins, per exemple. Orquestador: gestió de cicle de vida de les aplicacions (aprovisionament de recursos, desplegament, noms de domini, publicació d'API's, traçabilitat d'instal·lables i fluxos d'aprovació d'aquestes accions). Sonar per proves, Nexus com a repositori de dependències, Maven/Ant per complicar i proves automàtiques, Junit/Selenium per testing. Docker run per executar una instància i exec per executar alguna comanda dins d'un docker ja iniciat.