Hágase una idea del contenedor Docker.
En el espacio tecnológico actual, «funciona en mi sistema» es una frase muy común utilizada por los desarrolladores. Pero hay muchos casos en los que la aplicación que se ejecuta en un sistema de desarrollador no funciona en la máquina de un probador o en una máquina de producción, lo que conduce al caos.
Docker se introdujo para resolver tales problemas. 💯
¿Por qué Docker?
Permítanme contarles mi experiencia personal de por qué Docker es tan esencial.
Estaba trabajando en un proyecto full-stack con mi equipo, donde tenía que crear una aplicación que utilizaba Angular en el frontend, Node.js en el backend y MySQL como base de datos. Nos encontramos con varios problemas mientras trabajábamos en esta aplicación utilizando múltiples tecnologías.
- El primer problema fue la compatibilidad del sistema operativo. Como estaba utilizando múltiples tecnologías, tuve que asegurarme de que todas las tecnologías son compatibles con el sistema operativo que estoy utilizando. Hubo casos en los que la versión de angular no funcionaba con la versión del SO que estaba utilizando, así que tuve que cambiar la versión del SO varias veces.
- Como la arquitectura de la aplicación que estaba construyendo cambiaba con el tiempo, me encontré con situaciones en las que había que actualizar las versiones y dependencias del software y las bibliotecas. Me enfrenté a muchos problemas de compatibilidad antes de llegar a una versión estable de todas las tecnologías que utilizaba para mi aplicación. Actualizar incluso una sola herramienta utilizada en mi aplicación era una empresa arriesgada.
- Más tarde, tuve más desarrolladores trabajando en mi aplicación. Como la pila tecnológica era pesada, tenían que ejecutar múltiples comandos durante horas para configurar su entorno, que era compatible con la aplicación. Tuve que comprobar y evaluar el entorno de cada desarrollador para asegurarme de que no había desajustes con la versión de la tecnología que estaba utilizando.
- Por último, si alguno de los desarrolladores no se sentía cómodo con el sistema operativo que yo utilizaba para crear mi aplicación, le resultaba difícil trabajar en ella.
Todo esto dificultaba el desarrollo, la construcción y el envío de la aplicación a tiempo. Aquí es donde Docker entró en escena. Resuelve todos los problemas que acabo de mencionar.
¿Qué es Docker?
Docker es una plataforma de contenedorización que empaqueta la aplicación y sus dependencias dentro de un contenedor para que la aplicación funcione sin problemas en cualquier entorno, ya sea Desarrollo, Puesta en Escena o Producción.
Es una herramienta diseñada para facilitar la creación, despliegue y ejecución de aplicaciones mediante el uso de contenedores. Los contenedores Docker son alternativas ligeras a las máquinas virtuales, y utiliza el sistema operativo del host. En los contenedores no es necesario preasignar memoria RAM, como en las máquinas virtuales.
Se trata de una plataforma de código abierto para que desarrolladores, administradores de sistemas y empresas creen, envíen y ejecuten aplicaciones distribuidas sobre la marcha.
Para saber más sobre el funcionamiento interno de Docker, consulte la arquitectura Docker.
Imágenes Docker, Contenedores, Dockerfile
Imagen Docker
La imagen Docker es una plantilla necesaria para ejecutar una aplicación. Consta de código de aplicación, bibliotecas, herramientas, dependencias, etc.
Las imágenes Docker son archivos inmutables de sólo lectura, que a veces también se denominan instantáneas. No se inicia ni se ejecuta una imagen Docker; se crea un contenedor a través de ella. Cuando se crea un contenedor a partir de una imagen Docker, se crea una capa de contenedor sobre la capa de la imagen.
Tiene que haber una imagen Docker base que se utilice para crear otras múltiples imágenes Docker con algunas modificaciones de la imagen base.
Docker Hub es un repositorio de imágenes Docker para casi todas las pilas tecnológicas. Puede extraer una imagen Docker de DockerHub y empezar a crear contenedores.
Contenedores Docker
Los contenedores Docker son paquetes de software ejecutables que incluyen todas las dependencias necesarias para ejecutar una aplicación. Con los contenedores Docker, las aplicaciones pueden funcionar eficazmente en diferentes entornos informáticos.
A continuación se detallan las características de los contenedores Docker:
- Ligero
- Mínima sobrecarga (CPU/IO/Red)
- Despliegues más rápidos
- Fácilmente escalables
- Disminuye el consumo de almacenamiento
- Portátil, ejecútelo en cualquier lugar
- Sistema operativo base mínimo
- Aislamiento de aplicaciones
Dockerfile
Dockerfile es un script de shell que define todas las tareas que deben ejecutarse. A partir de un archivo docker, se crea una imagen docker; a partir de la imagen docker, se crea un contenedor docker.
Instalación de Docker
Docker puede instalarse fácilmente en varias plataformas Linux, Windows o macOS. Consulte este post sobre Cómo instalar Docker en Ubuntu, CentOS, Debian y Windows.
Además, Docker Desktop está disponible para máquinas Windows y Mac. Es una aplicación ejecutable muy fácil de instalar que ayuda a crear y contenerizar aplicaciones en entornos Windows y Mac.
Ediciones y precios de Docker
Existen dos ediciones de Docker:
- Community Edition (CE)
- Edición Enterprise (EE)
La edición comunitaria de Docker es de código abierto y de uso gratuito. Docker CE tiene como objetivo «hágalo usted mismo» enfoque en el que los ingenieros DevOps pueden contenerizar sus aplicaciones por su cuenta.
Docker enterprise edition viene con tres versiones: básica, estándar y avanzada. La edición básica viene con una plataforma Docker, soporte y certificación, mientras que las ediciones estándar y avanzada vienen con funciones de gestión de contenedores y escaneo de seguridad Docker añadidas a las características de la edición básica.
La mayoría de los técnicos utilizan Docker de forma gratuita. Pero si necesita funciones avanzadas, puede utilizar la versión de pago de Docker. El precio depende de características como la gestión de repositorios, las funciones CI/CD, la gestión de usuarios, las herramientas para desarrolladores y las opciones de soporte.
A continuación encontrará los detalles del plan de Docker:
Ahora que ya conoce los fundamentos de Docker permítame mostrarle un ejemplo muy sencillo de Docker.
Contenedor Docker Hola Mundo
Voy a sacar una imagen docker hola-mundo de DockerHub y construir la imagen para crear un contenedor docker que ejecutará la aplicación. Esta imagen contiene una aplicación sencilla para imprimir un mensaje hola desde Docker.
En primer lugar, tengo que tirar de la imagen docker hello-world en mi máquina Ubuntu.
Nota: esto supone que Docker ya está instalado. Si aún no lo está, consulte la guía de instalación.
geekflare@geekflare:~$ docker pull hola-mundo
Usando la etiqueta por defecto: latest
latest: Extrayendo de library/hello-world
0e03bdcc26d7: Pull completo
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Estado: Descargada imagen más nueva para hello-world:latest
Compruebe si se ha descargado la imagen docker.
geekflare@geekflare:~$ docker images
REPOSITORIO ETIQUETA IMAGEN ID CREADO TAMAÑO
hello-world latest bf756fb1ae65 7 months ago 13.3kB
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 8 months ago 90.8MB
geekflare_mongodb latest 095d17727ca0 hace 12 meses 325MB
Ejecute el siguiente comando para crear un contenedor y ejecutar la aplicación.
geekflare@geekflare:~$ docker run hello-world
¡Hola desde Docker!
Este mensaje muestra que su instalación parece estar funcionando correctamente.
Para generar este mensaje, Docker realizó los siguientes pasos:
1. El cliente Docker se puso en contacto con el demonio Docker.
2. El demonio Docker extrajo la imagen "hello-world" del Docker Hub.
(amd64)
3. El demonio Docker creó un nuevo contenedor a partir de esa imagen que ejecuta el
ejecutable que produce la salida que está leyendo en este momento.
4. El demonio Docker transmitió esa salida al cliente Docker, que la envió
a su terminal.
Para intentar algo más ambicioso, puede ejecutar un contenedor Ubuntu con:
$ docker run -it ubuntu bash
Comparta imágenes, automatice flujos de trabajo y mucho más con un ID de Docker gratuito:
https://hub.docker.com/
Para más ejemplos e ideas, visite
https://docs.docker.com/get-started/
Ahora, liste todos los contenedores Docker. Puede ver que el contenedor hello-world se ha ejecutado hace 1 minuto.
geekflare@geekflare:~$ docker container ls -a
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
1a1056caffc4 hello-world "/hello" hace 1 minuto Exited (0) hace 1 minuto zealous_bose
b0095c1e5536 geekflare_mongodb "/bin/sh -c usr/bin/..." 12 months ago Exited (0) 12 months ago mongo_container
Comience a explorar Docker; pruebe estos comandos Docker fundamentales.
Ejecutar Nginx dentro de un contenedor Docker
Aquí le mostraré cómo desplegar Nginx dentro de un contenedor.
El comando siguiente busca una imagen de Nginx localmente. Como no hay ninguna imagen local disponible, extrae la imagen docker de Nginx del docker hub. A continuación, crea un contenedor con el nombre nginx_geekflare
utilizando la imagen docker Nginx y ejecuta Nginx en el puerto 80.
geekflare@geekflare:~$ docker run --name nginx_geekflare -p 80:80 -d nginx
No se puede encontrar la imagen 'nginx:latest' localmente
latest: Extrayendo de library/nginx
bf5952930446: Pull completo
ba755a256dfe: Pull completo
c57dd87d0b93: Pull completo
d7fbf29df889: Pull completo
1f1070938ccd: Pull completo
Digest: sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2
Estado: Descargada imagen más nueva para nginx:latest
fdad18387b27b48b8f2e14f8641791cc4d5edf667cc664198b67579cd76a5162
Cuando enumere las imágenes Docker disponibles en su sistema, podrá ver que la imagen Docker de Nginx ha sido extraída.
geekflare@geekflare:~$ docker images
REPOSITORIO ETIQUETA IMAGEN ID CREADO TAMAÑO
nginx latest 08393e824c32 hace 4 días 132MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 hace 8 meses 90.8MB
geekflare_mongodb latest 095d17727ca0 hace 12 meses 325MB
Ejecute el siguiente comando para listar todos los contenedores en ejecución. Puede ver que el contenedor nginx_geekflare
se está ejecutando en 0.0.0.0:80
geekflare@geekflare:~$ docker ps -a
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
fdad18387b27 nginx "/docker-entrypoint...." hace 58 segundos Arriba 32 segundos 0.0.0.0:80->80/tcp nginx_geekflare
1a1056caffc4 hello-world "/hello" Hace aproximadamente una hora Salió (0) Hace aproximadamente una hora zealous_bose
b0095c1e5536 geekflare_mongodb "/bin/sh -c usr/bin/..." Hace 12 meses Salió (0) Hace 12 meses mongo_container
Vaya a su navegador y abra 0.0.0.0:80, puede ver que nginx está funcionando dentro de un contenedor.
Casos comunes de uso de Docker
Simplificación de la configuración: Docker puede ejecutarse en cualquier plataforma con la ayuda de su configuración sin la sobrecarga real de una máquina virtual.
Le permite poner el archivo de configuración en el código y pasar variables de entorno para adaptarse a diferentes entornos. De modo que una imagen Docker puede utilizarse en un entorno diferente.
Gestión del código: El código viaja a través de un entorno diferente en su viaje desde el desarrollo hasta la producción.
Cada entorno tiene una ligera variación con respecto al otro. Docker elimina esta diferencia proporcionando un entorno consistente, haciendo que el desarrollo y la codificación sean mucho más cómodos.
Las imágenes Docker al ser inmutables, vienen con la ventaja de tener cero cambios en el entorno de la aplicación desde dev a producción.
Productividad de desarrollo mejorada: Los dos objetivos esenciales en el ecosistema de desarrollo, es tener el entorno de desarrollo replicar lo más cerca posible al entorno de producción y el siguiente objetivo para obtener código de calidad entregado tan pronto como sea posible.
Docker permite que el código se ejecute en un contenedor que refleja el entorno de producción y, a diferencia de las máquinas virtuales, docker tiene una sobrecarga menor en cuanto a capacidad de memoria, lo que ayuda a que se ejecuten varios servicios.
El otro objetivo se consigue al utilizar el volumen compartido de Docker para que el código de la aplicación esté disponible para el contenedor desde el host. Esto permite al desarrollador editar el código fuente desde su plataforma y editor, lo que se reflejará en el entorno de ejecución dentro del Docker.
Aislamiento de aplicaciones: Hay casos en los que el aislamiento de aplicaciones puede ser necesario, por ejemplo, los servidores API que requieren diferentes Apache y un conjunto diferente de dependencias.
Ejecutar servidores API bajo contenedores diferentes es una salida mucho mejor.
Capacidades de depuración: Docker proporciona numerosas herramientas que funcionan bien con los contenedores, con la capacidad de insertar puntos de control dentro de los contenedores y también en contenedores diferentes, lo que es bastante esencial mientras se prueban las aplicaciones.
Despliegue rápido: Los contenedores Docker pueden crearse rápidamente, lo que se consigue ya que los contenedores no arrancan un sistema operativo, sino que se limitan a ejecutar la aplicación.
Una vez creados, le dan la tranquilidad de que una vez que el código ha funcionado, funcionará en todos los entornos.
Conclusión
Docker, con sus enormes ventajas, se está convirtiendo en un valioso complemento de la infraestructura informática. Espero que lo anterior le dé una idea al respecto.