Un Docker container (o contenedor Docker) es una unidad estándar de software que empaqueta el código de una aplicación y todas sus dependencias para que pueda ejecutarse de manera rápida y confiable en cualquier entorno. Vamos a desglosarlo en partes simples para entender cómo funcionan y por qué son tan importantes.
¿Qué es un contenedor?
Imagina que tienes una aplicación que necesita ejecutarse en diferentes computadoras. Normalmente, deberías asegurarte de que cada computadora tenga las versiones correctas de las dependencias, el sistema operativo compatible, y configuraciones específicas. Esto puede ser un dolor de cabeza.
Un contenedor es como una caja sellada que incluye todo lo necesario para ejecutar una aplicación: el código, las bibliotecas, las herramientas del sistema, y la configuración. Puedes mover esta caja a cualquier lugar, y siempre funcionará igual, sin importar dónde la pongas.
Características principales
- Ligereza:
- Los contenedores comparten el núcleo del sistema operativo (kernel) del host, lo que los hace mucho más livianos que las máquinas virtuales.
- No necesitas un sistema operativo completo en cada contenedor.
- Portabilidad:
- «Empaquetado una vez, ejecutado en cualquier lugar» es el lema.
- Un contenedor que funciona en tu computadora funcionará igual en un servidor remoto o en la nube.
- Aislamiento:
- Cada contenedor tiene su propio espacio de trabajo aislado, lo que evita conflictos entre aplicaciones.
- Eficiencia:
- Varios contenedores pueden ejecutarse simultáneamente en una sola máquina sin consumir demasiados recursos.
Cómo funcionan los contenedores
1. Imágenes de Docker
Un contenedor comienza a partir de una imagen de Docker. Una imagen es como una plantilla que describe qué hay dentro del contenedor.
Imagina que tienes una receta para hacer un pastel (imagen). Cuando horneas el pastel (inicias el contenedor), usas esa receta, pero el pastel puede ser modificado sin cambiar la receta original.
Ejemplo de imagen:
docker pull nginx
Esto descarga la imagen de nginx, un servidor web.
2. Ciclo de vida de un contenedor
Un contenedor pasa por diferentes etapas:
- Creación: El contenedor es configurado a partir de una imagen.
- Inicio: El contenedor comienza a ejecutarse.
- Parada: El contenedor deja de ejecutarse, pero sus datos pueden mantenerse.
- Eliminación: El contenedor es eliminado completamente.
Comando para iniciar un contenedor:
docker run -d --name mi_contenedor nginx
3. Aislamiento
Docker usa tecnologías del kernel de Linux como namespaces y cgroups para asegurar que cada contenedor tenga:
- Su propio sistema de archivos.
- Su propio espacio de red (dirección IP, puertos).
- Límites de uso de CPU y memoria.
Es como tener un apartamento en un edificio donde cada inquilino tiene su propio espacio privado (aislamiento).
Cómo trabajar con contenedores
Crear y ejecutar un contenedor
docker run -d --name mi_contenedor nginx
- -d: Ejecuta el contenedor en segundo plano.
- –name: Asigna un nombre al contenedor.
- nginx: Especifica la imagen que usará.
Listar contenedores
Muestra todos los contenedores en ejecución.
docker ps
Muestra todos los contenedores, incluso los detenidos.
docker ps -a
Detener un contenedor
docker stop mi_contenedor
Eliminar un contenedor
docker rm mi_contenedor
Acceder al interior de un contenedor
Esto te abre una terminal dentro del contenedor.
docker exec -it mi_contenedor bash
Ventajas de los contenedores
- Simplificación del desarrollo:
- Los desarrolladores pueden trabajar con el mismo entorno en cualquier computadora.
- Eficiencia en recursos:
- Los contenedores usan menos CPU y memoria que las máquinas virtuales.
- Escalabilidad:
- Es fácil iniciar o detener múltiples instancias de una aplicación.
- Reproducibilidad:
- Puedes reconstruir rápidamente el mismo entorno en cualquier lugar.
Comparación: Contenedores vs Máquinas Virtuales
Característica | Contenedores | Máquinas Virtuales |
---|---|---|
Aislamiento | A nivel de sistema operativo | A nivel de hardware |
Tamaño | Livianos (MB) | Pesados (GB) |
Inicio | Rápido (segundos) | Más lento (minutos) |
Recursos compartidos | Kernel compartido del host | Sistema operativo completo |
Flexibilidad | Muy portátil | Menos portátil |
Ejemplo práctico
Supongamos que necesitas ejecutar una aplicación web.
Descarga una imagen oficial de nginx:
docker pull nginx
Inicia un contenedor y expón el puerto 80:
docker run -d -p 8080:80 --name servidor_web nginx
-p 8080:80 mapea el puerto 80 del contenedor al puerto 8080 del host.
curl http://localhost:8080
Abre tu navegador y ve a http://localhost:8080. Deberías ver la página predeterminada de Nginx.
Resumen
Un contenedor Docker es:
- Ligero y portátil.
- Una forma de empaquetar aplicaciones con todas sus dependencias.
- Ideal para ejecutar aplicaciones de forma aislada y eficiente.