Tabla de Contenidos
Fundamentos de Docker (Docker avanzado)
Contenido perteneciente al curso 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.
