====== Fundamentos de Docker (Docker avanzado) ====== Contenido perteneciente al curso [[informatica:sistemas_operativos:cursos:docker_avanzado|Docker avanzado]]. ===== Docker Engine ===== Es una aplicación cliente-servidor compuesta por 3 elementos: * Docker Daemon (comando ''dockerd'') * Un API REST * El cliente (comando docker) de la interfaz de línea de comando El Cliente Docker y el Daemon pueden ejecutarse en la misma máquina, o el cliente se puede conectar a un Docker Daemon remoto ===== Docker Daemon ===== El Docker daemon (''dockerd'') escucha las solicitudes de la API de Docker y gestiona los objetos de Docker, como imágenes, contenedores, redes y volúmenes. Un daemon también puede comunicarse con otros daemons para administrar los servicios de Docker. ===== El Cliente Docker ===== El cliente Docker (docker) es la forma principal en que muchos usuarios de Docker interactúan con Docker Cuando se utilizan comandos como docker run, el cliente envía estos comandos a dockerd, que los lleva a cabo u El comando docker usa la API Docker. El cliente de Docker puede comunicarse con más de un daemon ===== Los registros de Docker ===== Un registro de Docker almacena imágenes de Docker Docker Hub y Docker Cloud son registros públicos que cualquiera puede usar Docker está configurado para buscar imágenes en Docker Hub de manera predeterminada. Incluso podemos ejecutar nuestro propio registro privado Los comandos docker pull o docker run, las imágenes necesarias se extraen del registro configurado ===== Objetos Docker ===== ==== Contenedores ==== Un contenedor es una instancia ejecutable de una imagen Se puede crear, iniciar, detener, mover o eliminar un contenedor utilizando la API Docker o el CLI Se puede conectar un contenedor a una o más redes, adjuntarle almacenamiento o incluso crear una nueva imagen en función de su estado actual Relativamente bien aislado de otros contenedores y su máquina host Se define por su imagen y por las opciones de configuración que se le proporciona cuando se crea o inicia Cuando se elimina un contenedor, desaparecen los cambios en su estado que no se almacenan en el almacenamiento persistente ==== Imágenes ==== Una imagen es una plantilla de 'solo lectura' con instrucciones para crear un contenedor Docker A menudo, una imagen se basa en otra imagen, con alguna personalización adicional. Por ejemplo, se puede compilar una imagen basada en la imagen Ubuntu, pero que instala el servidor web Apache y nuestra aplicación, así como los detalles de configuración necesarios para ejecutar nuestra aplicación ==== Servicios ==== Los servicios permiten escalar contenedores a través de múltiples demonios Docker, que trabajan juntos como un enjambre con múltiples gerentes y trabajadores Cada miembro de un enjambre es un demonio Docker, y todos los demonios se comunican mediante la API Docker Permite definir el estado deseado, como el número de réplicas del servicio que deben estar disponibles en un momento dado De manera predeterminada, el servicio tiene balanceo de carga en todos los nodos de trabajo Para el usuario, el servicio Docker parece ser una sola aplicación Docker Engine admite el modo enjambre en Docker 1.12 y superior A día de hoy se usa Kubernetes u Openshift. ==== Dockerfile ==== Se utilizan para crear imágenes de contenedor Un **Dockerfile** es un documento de texto que contiene toda la información de configuración y los comandos necesarios para ensamblar una imagen de contenedor (tarea que realiza el Docker Daemon) ==== Namespaces ==== Docker usa un conjunto de //namespaces// para garantizar el aislamiento de cada contenedor. Docker Engine usa espacios de nombres como los siguientes en Linux: * El espacio de nombres pid: aislamiento del proceso (PID: ID del proceso). * El espacio de nombres de red: Gestión de interfaces de red (NET: Redes). * El espacio de nombres de IPC: gestión del acceso a los recursos de IPC (IPC: comunicación entre procesos). * El espacio de nombres mnt: Gestión de puntos de montaje del sistema de archivos (MNT: Mount). * El espacio de nombres uts: Aislamiento del núcleo y los identificadores de versión. (UTS: Sistema de tiempo compartido Unix). ==== Control de grupos cgroups ==== Un **cgroup** limita una aplicación a un conjunto específico de recursos Estos grupos permiten que Docker Engine comparta los recursos de hardware disponibles con los contenedores y, opcionalmente, imponga límites y restricciones Por ejemplo, se puede limitar la cantidad de memoria disponible para un contenedor específico ==== Sistema de unión de ficheros ==== Los sistemas de unión de ficheros, o UnionFS, son sistemas de archivos que operan creando capas, haciéndolos muy livianos y rápidos Docker Engine utiliza UnionFS para proporcionar los bloques de construcción para contenedores Docker Engine puede usar múltiples variantes de UnionFS, incluidas AUFS, btrfs, vfs y DeviceMapper ==== Formato contenedor ==== Docker Engine combina los **namespaces**, **cgroups** y **UnionFS** en un contenedor llamado **formato contenedor**. El formato de contenedor predeterminado es ''libcontainer''. En el futuro, Docker puede admitir otros formatos de contenedor al integrarse con tecnologías como BSD Jails o Solaris Zones.