Este es el primer post para comenzar el uso de contenedores y Docker. Habrá algunos conceptos y breves ejemplos donde ubicamos las prestaciones de utilizar esta tecnología, aunque sin ahondar en detalles técnicos.
¿Qué es?
Siendo sencillos en este post, hablamos de que un contenedor es un paquete de software que es creado a partir de una imagen de software.
Una imagen envuelve en un archivo datos binarios que pueden representar a nivel de software un S.O. (sistema operativo), un conjunto de archivos; cuando una imagen es creada, conserva el estado que los archivos tienen en ese momento.
Si alguna vez has utilizado algún programa de virtualización, como Virtualbox (por mencionar uno), seguro usaste una imagen de S.O. cuyo archivo tiene extensión ISO.

Y por poner un último ejemplo, si has utilizado emuladores de Playstation, llegas a utilizar un archivo ISO, que viene siendo una imagen de un disco de algún juego.
Entonces, una imagen ayuda mucho para concentrar los archivos, o datos binarios necesarios para su ejecución; poderlos distribuir, conservando el estado de cuando fueron creados.
Las imágenes de Docker tienen los archivos mínimos para que se pueda ejecutar una versión reducida de un S.O., sus API, algún runtime, SDK y demás. Existe un repositorio amplio de imágenes Docker Base, a partir de las cuales vamos a poder crear nuestra propia imagen que contenga nuestra aplicación, que será instanciada finalmente en un contenedor.
Las imágenes base las puedes encontrar en el sitio Docker Hub

También dentro de los comandos de Docker puedes hacerlo:

Ingredientes de imagen Docker para mi contenedor
Una receta sencilla:
Metadata (S.O.) + Data (App, Librerías)
👍
El sistema operativo es una versión reducida, y puede tener algunas librerías, runtime, aplicativos para sólo configurar y usar (como Nginx).
A ese Metadata le añades los datos de tu aplicación, librerías, etc.
Mucho jamón para dos huevitos
🥚_🥚
Por poner un ejemplo, cuando llega el momento de desplegar tu aplicación Web hecha en PHP y dejarla en un servidor, comienzas a instalar lo necesario para que pueda ser utilizada, configuras tu Apache

O bien, si tienes tu sitio Web en Net Core, ASP .NET y lo quieres poner en el mismo servidor, compilas tu código y generas tus archivos de publicación, para después llevarlo a una instancia en el IIS (Internet Information Services) que tanto te gusta.

Piensa en esto un momento… En dicho servidor además de tener los archivos de publicación de tus sitios Web y los componentes que lo hacen funcionar, tienes toooodos los archivos del S.O. más programas que seguro tus sitios Web no necesitan, como paint, la calculadora, un editor de textos (bueno, este quizá te sea útil) y demás aplicaciones y servicios que en la vida tus aplicaciones no necesitarán. ¡Esto representa demanda de almacenamiento, procesamiento en segundo plano!.
Pero espera… imagina que el S.O. se actualiza de forma misteriosa 😮 y resulta que uno de tus sitios Web dejó de funcionar por algún archivo que cambió… pero ちょっと待て!
Resulta que por alguna razón tienes que migrar uno o los dos sitios de servidor, y cuando llegas al nuevo servidor, resulta que algo no funciona, y ya repasaste todo lo que debiste haber instalado 😪
En fin después de esta breve historia (en realidad anécdota) continuo
Dirás Wow
Una imagen de contenedor va a contar con los archivos mínimos y necesarios para que tu aplicación pueda funcionar, esto hace que al agregar tus archivos de publicación o compilados, lleguen a un entorno cuya ejecución es muy ligera, fiable, aprovechando espacio y que además estará aislada de otra aplicación.
Además, hay imágenes base oficiales que siguen un estándar, tienen revisiones y correcciones si es necesario, por lo tanto podrás tener la confianza de dónde tu aplicación se ejecuta (no te emociones, aún tienes que trabajar en la capa 8 😈 あ!)
La posibilidad de tener una imagen y echarla andar en un contenedor abre más cosas, por ejemplo, puedes tener tu propio repositorio (registry) en donde tengas distintas versiones de una imagen (ya que puedes ponerles tags a tu imagen para versionar) y crear un contenedor con cualquiera de ellas, integrar este proceso en un ciclo DevOps; tener una sóla imagen y hacer un contenedor para un ambiente de Desarrollo, Calidad, Staging, Productivo. Crear varios contenedores a partir de una sola imagen se puede usar por ejemplo para escalamiento horizontal automático.
Y la administración de los contenedores puede apoyarse de orquestadores, como Kubernetes

¿Y luego?
Pues ya. Los siguientes post mostrarán aspectos de Docker en dosis adecuadas, rumbo a la dockerizacion de aplicaciones 🐋.
¡Los leo en los comentarios!

Ingeniero en Comunicaciones y Electrónica, dedicado al desarrollo de software y apoyo a la comunidad en temas de tecnología, especialmente en temas de IA. En lo personal disfruto practicar guitarra, viendo algún buen anime.
Pingback: Crear Imagen y Contenedor Docker Nivel Genin – CodecX