Curso de Docker

Curso de Docker

Guido Vilariño

Guido Vilariño

Qué es y cómo funciona Docker

6/32
Recursos

Aportes 41

Preguntas 7

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Componentes DENTRO del circulo de Docker:

  • Docker daemon: Es el centro de docker, el corazón que gracias a el, podemos comunicarnos con los servicios de docker.
  • REST API: Como cualquier otra API, es la que nos permite visualizar docker de forma “gráfica”.
  • Cliente de docker: Gracias a este componente, podemos comunicarnos con el corazón de docker (Docker Daemon) que por defecto es la línea de comandos.

Dentro de la arquitectura de Docker encontramos:

  1. Contenedores: Es la razón de ser de Docker, es donde podemos encapsular nuestras imagenes para llevarlas a otra computadora, o servidor, etc.
  2. Imagenes: Son las encapsulaciones de x contenedor. Podemos correr nuestra aplicación en Java por medio de una imagen, podemos utilizar Ubuntu para correr nuestro proyecto, etc.
  3. Volumenes de datos: Podemos acceder con seguridad al sistema de archivos de nuestra máquina.
  4. Redes: Son las que permiten la comunicación entre contenedores.

La arquitectura Docker es una arquitectura cliente-servidor, dónde el cliente habla con el servidor (que es un proceso daemon) mediante un API para poder gestionar el ciclo de vida de los contenedores y así poder construir, ejecutar y distribuir los contenedores.

El hecho de que el cliente se comunique con el servidor mediante el API hace que el cliente y servidor puedan estar en la misma máquina comunicándose mediante sockets de UNIX o bien en máquinas diferentes comunicándose mediante un end-point en la red.

Docker está escrito en GO, aunque también se aprovecha de muchas de las capacidades del kernel Linux, como namespaces, cgroups, y el sistema de ficheros UnionFS.

Dentro de los elementos de la Arquitectura Docker encontramos dos, por un lado el elemento principal de la arquitectura Docker que es el Docker Engine y por otro el Registro Docker.

Docker Engine
El Docker Engine es la aplicación cliente-servidor que implementa Docker. Esta aplicación tiene tres componentes:

  1. Servidor, es el proceso principal de Docker y que funciona como proceso demonio del sistema. Es el encargado de gestionar los objetos que hay en Docker como imágenes, contenedores, redes y volúmenes. Se representa mediante el comando dockerd.
  2. API Rest, es un API Rest que nos permite acceder a las capacidades del servidor y ejecutar comandos sobre él. Podemos utilizar un simple curl para acceder a las capacidades del API de Docker
  3. Cliente, es la línea de comandos representada por el comando docker. El cliente habla vía el API Rest para poder ejecutar los comandos. Es lo que utilizaremos para poder ir gestionando el ciclo de vida de nuestras imágenes y contenedores.

Registros Docker
Los registros Docker (Docker Registry) son los que almacenan imágenes Docker. El Docker Hub es un registro público que almacena múltiples imágenes, algunas de ellas certificadas por Docker.

Aquí está la paquetería de Python para docker, con ella puedes automatizar tareas a través de la programación con Python 💚

Python package for docker API

MIni resumen:
**Docker deamon ** es el que interactua con el OS, se comunica por medio de api rest
Container Es donde se aloja y corren los aplicativos
Images Artefacto que utiliza docker para empaquetar y distribuir los contenedores
Data Volumenes Es la forma que tiene docker para acceder al sistema de archivos del anfitrion de forma segura sin comprometerlo
network Permite la comunicación de contenedores entre si o en el mundo exterior

NOTES FOR WHAT IS AND WHAT FUNCTION DOCKER

Docker

plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores.

Docker Demon

El corazón de docker es el docker demon o server de docker, que básicamente es un sistema operativo que lo que hace es manejar todas las entidades con las que trabaja docker, la que nos permite utilizar los contenedores que vamos a usar escalarlos, eliminarlos, construirlos. etc.

Rest Api

La forma en la que el docker demon expone una interfaz para comunicarse consigo es por una rest api(por http) o desde una maquina remota podemos exponer nuestro docker demon y que una maquina que este en otra se comunique y le de instrucciones al docker demon.

Docker Cli

La interfaz de linea de comandos de docker nosotros cuando utilizamos docker en nuestra terminal lo que estamos usando es el cliente de docker, nuestra cliente de docker le habla al docker demon con las instrucciones que nosotros estamos generando.

Pero el cliente podria ser otra cosa si por ejemplo creo una aplicación que quiero que se comunique con el docker demon, el cliente que va a manejar mi aplicación probablemente sea un cliente que este configurado para esa tecnologia

Ejem si hago una aplicación para python hay un paquete especial para que las dos tecnologías se comuniquen


El profe quedo re gracioso en esta miniatura

Pero hablando mas enserio no conocia que el docker daemon se comunicara mediante una REST API

Docker Architecture

  • docker daemon
  • Rest API
  • Client (docker cli)

Docker components

  • Container
  • image
  • data volumes (secure file explorer)
  • network

Despues de 6 videos…
Ahora si se viene lo chido!

Entiendo que las imágenes serían como plantillas desde las cuales se puede crear contenedores (instancias)

Hola
Les comparto una imagen de la arquitectura de Docker.


https://blogs.salleurl.edu/es/docker-en-los-cpds

Saludos

Arquitectura de Docker

  • Docker Daemon: Es aquel que va a interactuar con el SO para permitirnos utilizar los contenedores y todo lo que esto respecta
  • Rest API: Es la forma en que Docker se comunica consigo. Asi, podemos comunicarnos con nuestra propia máquina con Daemon por HTTP, o desde una máquina remota del mismo modo gracias a la API que expone
  • Docker CLI: El cliente o Command Line Interface se comunica con el Docker Daemon con las instrucciones que le mandamos a través del CLI

Hay 4 entidades importantes de Docker

  • Containers: Es el corazón de docker, lo más importante y lo que se va a utilizar todo el tiempo. Sin los contenedores Docker no tiene sentido
  • Image: Son los artefactos que utiliza Docker para empaquetar contenedores y para poder distribuirlo a través de distintas instalaciones de Docker
  • Data Volumes: Es la forma en que Docker nos permite acceder, con seguridad y de manera flexible, al sistema de archivos de la máquina anfitriona sin comprometer la seguridad del mismo.
  • Network: Permite a los distintos contenedores de Docker comunicarse entre sí o con el mundo exterior.

🐋 Qué es y cómo funciona Docker

Ideas/conceptos claves

Docker

Es una plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores.

**docker daemon**

Es un servicio del sistema operativo que maneja todas las entidades con las que trabaja Docker.

Apuntes

Arquitectura de Docker

  • El corazón de Docker es **docker daemon**
    • El que estará trabajando con el sistema operativo para que Docker funcione.
  • La forma en la que docker daemon expone una interfaz para comunicarse consigo es con una REST API.
  • Encima de la REST API, esta docker-cli que es el cliente
    • El cliente le habla al docker daemon con las instrucciones que nosotros escribimos en el cliente
  • El cliente podría ser otro aparte de nosotros, como ser un cliente que deseemos que hable con el docker daemon
    • Ej.: Un paquete de Python para que hable al docker daemon a través del cliente
  • Principalmente trabajaremos con 4 entidades
    1. Contenedores

      Es el corazón del Docker y lo que utilizaremos todo el tiempo.

    2. Imágenes

      Artefactos que utiliza Docker para empaquetar contenedores y para poderlos distribuirlos a través de distintas instalaciones de Docker

    3. Volúmenes de datos

      Es la manera en la que Docker nos permite acceder con seguridad y de manera flexible al sistema de archivos de la máquina anfitriona sin comprometer la seguridad del mismo.

    4. Network

      Permite a los contenedores comunicarse entre si o con el mundo exterior

Docker es una herramienta fundamental en el que hacer del programador y desarrollador de software, nos permite instalar nuestros desarrollos en cualquier servidor ahorrandonos un tiempo coniderable y facilitandonos nuestro quehacer, una de sus usos en la actualidad es cuando se tiene un servicio de mucha recurrencia, como el de consultar y se quiere independizarlo , se genera un aplicativo nuevo a partir del aplicativo padre el cual se le puede denominar un micorserviicio. Gracias por leer., Si alguien desea ampliar sobre el tema, estare atento


“Docker”, el software de TI, es una tecnología de creación de contenedores que permite la creación y el uso de contenedores de Linux.

manos a la obra!

Docker tiene una Arquitectura Cliente servidor

  • El Servidor de docker interactua con el sistema operativo
  • El servidor expone una interfaz para cominucarte
  • Existe un cliente que consume esa API del server

Es importante que entioendan esto porque muchas herramientas se comunican directamente con el server de docker como prometheus

Qué es y cómo funciona Docker

¿Qué es docker?
Es una plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores.
Docker está escrito en el lenguaje de programación Go y aprovecha varias características del kernel de Linux para ofrecer su funcionalidad. Docker usa una tecnología llamada namespacespara proporcionar el espacio de trabajo aislado llamado contenedor . Cuando ejecuta un contenedor, Docker crea un conjunto de de espacios nombres para ese contenedor.
Estos espacios de nombres proporcionan una capa de aislamiento. Cada aspecto de un contenedor se ejecuta en un espacio de nombres separado y su acceso está limitado a ese espacio de nombre
Referencia:
https://platzi.com/clases/2066-docker/32846-que-es-y-como-funciona-docker/
https://docs.docker.com/get-started/overview/

Componentes de docker
Referencia: https://docs.docker.com/get-started/overview/

  1. El cliente de Docker
    El cliente de Docker ( docker) es la forma principal en que muchos usuarios de Docker interactúan con Docker. Cuando usa comandos como docker run, el cliente envía estos comandos a dockerd, a través de su API, para qué los lleva a cabo. Existen clientes de python, js para docker.

  2. Api de docker
    Los comandos de Docker usan la API de Docker para comunicarse con el (dockerd) docker y ejecutar. importante decir que El cliente de Docker puede comunicarse con más de un demonio.
    El deamon Docker
    El deamon de Docker ( dockerd) escucha las solicitudes de la API de Docker y administra objetos de Docker como imágenes, contenedores, redes y volúmenes. Un deamon puede comunicarse con otros deamon para administrar los servicios de Docker.

  3. Registros de Docker
    Un registro de Docker almacena imágenes de Docker. Docker Hub es un registro público que cualquiera puede usar y Docker está configurado para buscar imágenes en Docker Hub de forma predeterminada. Incluso puede ejecutar su propio registro privado.
    Cuando se usa el docker pull o docker run comandos, las imágenes requeridas se extraen de su registro configurado. Cuando usa el docker push comando, su imagen se envía a su registro configurado.

  4. Objetos Docker

Cuando usa Docker, está creando y usando imágenes, contenedores, redes, volúmenes, complementos y otros objetos. Esta sección es una breve descripción de algunos de esos objetos.

  • 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, puede crear una imagen basada en el ubuntu image, pero instala el servidor web Apache y su aplicación, así como los detalles de configuración necesarios para ejecutar su aplicación.
    Puede crear sus propias imágenes o puede usar solo las creadas por otros y publicadas en un registro. Para construir su propia imagen, cree un Dockerfile con una sintaxis simple para definir los pasos necesarios para crear la imagen y ejecutarla. Cada instrucción en un Dockerfile crea una capa en la imagen. Cuando cambia el Dockerfile y reconstruye la imagen, solo se reconstruyen las capas que han cambiado. Esto es parte de lo que hace que las imágenes sean tan ligeras, pequeñas y rápidas en comparación con otras tecnologías de virtualización.
  • Contenedores
    Un contenedor es una instancia ejecutable de una imagen. Puede crear, iniciar, detener, mover o eliminar un contenedor mediante la API o la CLI de Docker. Puede conectar un contenedor a una o más redes, adjuntarle almacenamiento o incluso crear una nueva imagen basada en su estado actual.
    De forma predeterminada, un contenedor está relativamente bien aislado de otros contenedores y de su máquina host. Puede controlar qué tan aislados están la red, el almacenamiento u otros subsistemas subyacentes de un contenedor de otros contenedores o de la máquina host.
    Un contenedor se define por su imagen, así como por las opciones de configuración que le proporcione al crearlo o iniciarlo. Cuando se quita un contenedor, cualquier cambio en su estado que no esté almacenado en el almacenamiento persistente desaparece.

REST (REpresentational State Transfer) es un estilo de arquitectura de software que utiliza un subconjunto de HTTP

API (Application Programming Interface) es un software intermedio que sirve para comunicar aplicaciones entre ellas

Docker: Plataforma que permite construir, ejecutar y compartir aplicaciones mediante contendores

Contendores: Corazón de docker
Imágenes: Artefactos que usa Docker para empaquetar contenedores
Volúmenes de datos: Acceder al sistema de archivos de la maquina anfitriona
Network: Comunicación entre docker y mundo exterior

como en la arquitectura de capas (creo que aplica), cada capa se comunica con la otra y de esta manera es que logramos el manejo de los recursos deseados

Docker daemon: Maneja todas las entidades con las que trabaja Docker, es el elemento que interactúa con el OS

  • REST API: Es el medio por el cual Docker expone una interfaz para comunicarse consigo, protocolo HTTP, puede ser desde una máquina fuera de mi red
  • Docker CLI: Enviar comandos o instrucciones a mi Docker daemon a través del CLI, existen múltiples clientes para interactuar a través de varios lenguajes
  • Contenedores: Dónde van a correr nuestras aplicaciones
  • Imágenes: Los artefactos que usa Docker para empaquetar contenedores
  • Data volumes: Forma en la que Docker nos permite acceder con seguridad al sistema de archivos de la máquina anfitriona sin comprometer la seguridad de la misma
  • Red: Permite a los contenedores comunicarse entre si o con el mundo exterior

docker demon = nucleo
api rest = comunica docker demon con docker cli
docker cli = es la interface de la linea de comandos
contenedores = tiene lo necesario para ejecutar una app
image = empaqueta contenedores
data volumenes = permite acceder con seguridad
network = permite la comunicacion

docker daemon = docker server

Docker es una plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores.

Docker Daemon: corazón de docker (el que va a interactuar con el sistema operativo)

Rest API: Forma de comunicarse con docker

Docker CLI: Interfaz de línea de comandos

Hay múltiples clientes para comunicarse con Docker a través de diferentes lenguajes de programación.

  • Contenedores: Dónde van a correr los aplicativos
  • Imágenes: Artefactos que usa Docker para empaquetar contenedores
  • Volúmenes de datos: forma flexible de acceder a él sin comprometer la seguridad
  • Network: Lo que le permite a Docker comunicarse con el mundo exterior

Un contenedor es un proceso, a partir de las imágenes ejecutamos "contenedores ", que en sí es un PROCESO. Podemos crear varios proceso a partir de una imagen ejemplo Ubuntu, MYSQL con las imágenes descargadas podemos crear un proceso.

Un contenedor es un proceso, a partir de las imágenes ejecutamos contenedores, que en sé es un PROCESO. Podemos crear varios proceso a partir de una imagen ejemplo Ubuntu, MYSQL con las imágenes descargadas podemos crear un proceso.

Existen 4 entidades: contenedores, imágenes, red, volúmenes de datos.

Contenedores: El corazón de Docker, donde van a correr nuestros aplicativos.
Imágenes: Artefactos que utiliza Docker para empaquetar contenedores.
Esto puede verse como en POO como clases e instancias, donde las clases son el canon, el modelo de un objeto, es este caso su equivalente, serían las imágenes y las instancias que se hacen de la clase, son los contenedores, que corren en sí, lo que está estipulado en las imágenes.
Volúmenes de datos: Por medio del cual, Docker nos permite acceder al sistema de archivos de la máquina anfitriona, sin comprometer su seguridad.
Redes: Le permite a los contenedores comunicarse entre sí o con “el mundo exterior”

¿Qué es y como funciona?

  • Arquitectura

    • Docker daemon: el corazón, o server de docker, maneja todas las entidades que utiliza docker, el que interactua con el sistema operativo. Utiliza una REST API para interactuar.
    • Docker Client: el que habla con el docker daemon que habla mediante la API
    • Docker container: donde van a correr los aplicativos.
    • Docker Volumes: nos permite acceder a la maquina sin comprometer la seguridad del mismo.
    • Docker network: la parte de redes para comunicarse.

muy importante saber la arquitectura para entender mucho mejor

Ahora si viene lo chido

>> ¿Que es docker?

Docker es una tecnologia que se ha convertido en el estandar para desarrollar distribuir y ejecutar aplicaciones a nivel productivo, en la maquina, en la nube, etc.

>> Lo importante es entender ¿Porque docker?¿Porque nos hace falta?

En mi trabajo lo que hacemos es un producto para que cientos de personas o millones de personas puedan colaborar visualmente en lo que seria un pizarron pero en la web para poder compartir ideas y colaborar. Para lograr eso, para escalar a ciento de millones de usuarios, hay muchos desafios. Pero fundamentalmente tiene que ver con la compatibilidad de lo que es el software cuando se escribe en las maquinas y lo que tiene que pasar en los servidores, en la nube, en los dispositivos de nuestros usuarios. Son problemas que no son triviales de resolver y son problemas que nimporta en que lenguaje trabajes porque son problemas que siempre vas a tener.
Lo importante de Docker es que nos ayuda resolver los grandes problemas del desarrollo del software muy facilmente y que ademas nos ayuda a trabajar mas rapido, mejor, con mas confianza, asi que es muy importante que en tu carrera como desarrollador conoscas esta herramienta y aprendas a manejarla porque es muy dificil que no te cruces con ella.

- Problemas del desarrollo de software profesional: Los tres grandes problemas

Problemas hay infinitos pero existiran tres problemas que se presentaran siempre en toda tecnologia, aplicaciones, etc.

Construir software: Escribir codigo es solo una (pequeña) parte. Porque es simplemente escribir codigo, ver que funciona, que pasan los test, etc. Pero la realidad es que no solemos trabajar solos cuando trabajamos en un producto serio, solemos trabajar en equipo. Entonces construir software no es solamente un problema de como escribo mi codigo y como tengo un entorno de desarrollo que funcione sino que tiene otros problemas y cuando trabajamos en equipo esta el problema de compartir el codigo de que no equivocarnos en las versiones, todo ese tipo de cosas que siempre estan presentes. Puntualmente solo se hablaran de algunos problemas al construir software son:

    - Entorno de desarrollo: Version correcta de la sintaxis del codigo o version del lenguaje. (Paquete)
    
    - Dependecias: Todo el software que construimos esta escrito por otras personas, porque no escribimos todo de 0, utilizamos frameworks, bibliotecas, librerias, etc. Asegurarnos que mis compañeros tengan los mismos para que en un futuro no tener problemas de incompatibilidad. (Frameworks, bibliotecas)
    
    - Entorno de ejecucion: Version correctas.  (runtime, versión Node)
    
    - Equivalencia con entorno desarrollo y productivo: Versiones correctas con las de mi compañero para no tener problemas.(Compartir codigo y pasar a producción)
    
    - Servicios externos: Base de datos y la compatibilidad con el sistema operativo, version, muy pesada, etc. (integración con otros servicios ejem: base de datos)

Distribuir: Tu codigo tiene que transformarse en un artefacto, o varios, que puedan ser transportados a donde tengan que ser ejecutados. Siempre un codigo que construyamos va a generar algo que se llama artefactos, esto significa que si se esta haciendo un binario, sera un binario compilado, si estamos trabjando en java sea un .jar, si estamos creando una aplicacion de android va hacer un APK,etc. Pero como hacemos para que eso llegue a donde tiene que llegar, ¿donde lo ponemos?, ¿Que repositorio vamos a usar?,etc. Los problemas al distribuir software son:

    - Divergencia de repositorios: Hay divergencia en los repositorios, es decir, mi aplicacion puede tener varios tipos de artefactos y esos artefactos no pueden existir en esos repositorios porque los repositorios estan diseñados para algunas cosas y no otras.
    
    - Divergencia de artefactos: Hay divirgencia solo para algunos tipos de artefactos y no otros. Ejemplo a lo de antes, si mi aplicacion android la quiero publicar la tengo que poner en el PlayStore pero aparte si mi aplicacion tiene un servidor, eso estara en otro lugar. Por ejemplo, si es un servidor java estara en un Artifactory, etc. Y para poder publicar eso o traer eso a mi maquina de alguna otra version publicada voy a tener que tener esa configuracion. 
    
    - Versionado: Por ultimo el tema de la version, como nos ponemos de acuerdo que version del software que estamos tratando de distribuir es la correcta, ¿como la nomenclamos?, ¿usamos senver?, ¿Utilizamos otro tipo de nomenclatura?, como podemos estar seguros que el codigo o la aplicacion del artefacto que estoy queriendo publicar u obtener es el correcto.
    
    { 
        Extraido de un comentario:
        
        - Output de build heterogéneo (múltiples compilaciones)
        - Acceso a servidores productivos (No tenemos acceso al servidor)
        - Ejecución nativa vs virtualizada
        - Entornos Serverless 
    }
        
Ejecutar sofware: La maquina donde se escribe el software siempre es distinta a la maquina donde se ejecuta de manera productiva. Es decir, una vez que mi software llega donde tiene que llegar eso tiene que correr y para eso va tener varios problemas porque la maquina donde se va a ejecutar no va hacer la misma donde se construyo, por ejemplo: estamos escribiendo una aplicacionn movil y se va a correr en un dispositivo movil y no en la laptop o en la computadora de escritorio.

    - Compatibilidad con el entorno producto: Como nos aseguramos de que a la hora de correr nuestra aplicacion lo que necesitamos que este disponible ahi, este disponible. (sistema operativo poco amigable con la solución)
    
    - Dependecias: Si nuestra aplicacion es algo que necesita dependecias nativas de sistema operativo, por ejemplo una biblioteca de C porque estamos escribiendo codigo C con "?". ¿Podemos asegurarnos que eso va estar ahi?¿como?, bueno es un problema. (paquetes, runtime)
    
    - Disponibilidad de servicios externos: La base de datos que yo asumo que va estar porque me dijeron que no tengo acceso a esa configuracion productiva, es la misma o es compatible con la que vengo usando en desarrollo. (Acceso a los servicios externos)
    
    - Recursos hardware: Los recursos de hardware son limitados, quizas yo estoy trabajando en una maquina que tiene 16GB de ram con un procesador potente pero el servidor donde vamos a correr tiene 1GB de ram, un procesador mas debil. Podemos asegurarnos que nuestra maquina va correr ahi, ¿como podemos hacerlo? es dificil en mi maquina simular esas condiciones. (Capacidad de ejecución - Menos memoria, procesador más debil)
    
Entonces los problemas son infinitos y las respuestas a todas estas preguntas, algunas van a decir si, otra no pero la mayoria va ser depende porque son problemas complejos.
Para esto existe Docker porque te permite construir, distribuir y ejecutar cualquier aplicacion en cualquier lado.

>> Preparando entorno de trabajo

Docker corre en linux nativamente
Verificar version: docker --version
Docker informacion avanzando: docker ingo

>> [Bonus] Play with Docker

Trabajar docker en la web
    - https://labs.play-with-docker.com/

>> ¿Que es y como funciona Docker?

Docker es una plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores. Ahora ¿Que es esa plataforma?¿como esta hecha?¿Y que cosas usa?¿Y que nos permite manejar?

- Arquitectura de Docker: (imagen Docker6.png)

    El corazon de Docker es Docker daemon o tambien conocido como server de Docker que basicamente es un servicio del sistema operativo que lo que hace es manejar todas las entidades que trabaja Docker, basicamente la que permite utilizar los contenedores que se van a utilizar, escalarlo, configurarlo, destruirlo, todo lo que queremos hacer. El que va a interactucar con el sistema operativo para que eso pase es el Docker daemon.
    Ahora la forma que Docker deameon expone una interfaz para comunicarse es por una REST API como la de cualquier servicio web ,allas construido o conoscas, es un protocolo HTTP.
    Entonces, nos podemos comunicar con nuestra propia maquina por el Docker daemon por HTTP o por una maquina remota, podemos exponer nuestro Docker daemon y que una maquina que este en otra red se comunique con nuestra maquina y le de instrucciones al Docker daemon, OJO con eso porque daemon tiene acceso a una gran parte del sistema y no deberiamos hacerlo pero es posible, y algunos casos tiene sentido pero son temas mas avanzados.
    Encima de esa REST API lo que tenemos es el Docker client CLI o la interfaz de linea de comando de Docker y cuando se ejecuta un Docker info por ejemplo este le habla al Docker daemon con las instrucciones que escribimos en el cliente, otra cosa si se hace una aplicacion que quiero que hable con el Docker daemon, el cliente que va utilizar mi aplicacion sea un cliente 
    que este configurado para esa tecnologia por ejemplo si hago una aplicacion en python, hay un paquete de Docker para python con el que yo con codigo de Python le hablo al Docker daemon atraves de ese cliente y lo mismo para GO, node, todo tipo de lenguaje tiene sus paquetes para poder realizar este tipo de acciones.
    Ahora con las cosas que trabajamos con Docker son muchas pero principalmente son cuatro entidades:
    
        - Container: Los contenedores es el corazon de Docker, es lo mas importante y que se utilizara todo el tiempo. Sin lo contenedores Docker no tiene sentido. Los contenedores son donde van a correr nuestras aplicaciones.
        
        - Image: Las imagenes son los artefactos que utiliza Docker para empaquetas contenedores y que nosotros vamos a utilizar para empaquetar nuestro codigo y para poder distribuirlo atraves de distintas instalaciones de Docker.
        
        - Data volumes: Los volumenes de datos es la forma que Docker nos permite acceder con seguridad y de manera flexible al sistema de archivos de la maquina anfitriona, es decir, de nuestra maquina o de los servidores sin comprometer la seguridad del mismo
        
        - Network: Esta es la parte de redes de Docker que es la que permite a los distintos contenedores de Docker comunicarse entre si o con el mundo exterior 

Docker client (CLI) se comunica con el docker daemon
Docker daemon usa containerd para iniciar, detener o pausar contenedores
runc es el container runtime

repaso con Docker

Excelente el resumen.

El cliente son los comandos por como docker manda instrucciones, las pasa por una API y esta llega al docker daemon, que es el corazón de docker corriendo en un servidor.
El contenedor es en donde nuestra aplicación va empaquetada, la network permite la comunicación entre contenedores.
¿Lo dije bien?

Docker es una plataforma que permite construir, ejecutar y compartir aplicaciones mediante contenedores.

  • Docker daemon o Docker server: Es básicamente un servicio del sistema operativo que maneja todas las entidades con las que trabaja Docker. Este servicio tiene acceso a una gran parte del sistema; debemos ser muy cuidadosos con ello.
  • Rest API: Es la forma en la que el Docker daemon expone una interfaz para comunicarse con entidades externas.
  • Docker CLI: Es la interfaz de línea de comandos a través de la cual un usuario le da instrucciones al Docker daemon.

Entidades básicas

  • Contenedores: Es el lugar donde nuestras aplicaciones serán ejecutadas.
  • Imágenes: Son los artefactos que usa Docker para empaquetar contenedores. Un usuario las usa para empaquetar el código de una aplicación y para poder distribuirlo a través de distintas instalaciones de Docker.
  • Volúmenes de datos: Es la forma en la que Docker nos permite acceder con seguridad y de manera flexible al sistema de archivos de la máquina anfitriona sin comprometer la seguridad del mismo.
  • Redes: Le permite a los distintos contenedores de Docker comunicarse entre sí o con el mundo exterior.