📦 Contenedores

Un contenedor es una unidad estándar de software que empaqueta el código y todas sus dependencias, permitiendo que una aplicación se ejecute de manera rápida y consistente en cualquier entorno. Gracias a su aislamiento, cada contenedor funciona independientemente del host y otros contenedores.

🔹 Características principales:

Aislamiento → Cada contenedor opera de manera independiente, con su propio sistema de archivos, versión del sistema operativo y recursos de procesamiento.
Eficiencia → A diferencia de las máquinas virtuales, los contenedores comparten el mismo kernel del sistema operativo del host, lo que los hace más ligeros y rápidos.
Portabilidad → Se pueden ejecutar en cualquier sistema con Docker sin preocuparse por problemas de compatibilidad.

Diferencia con Máquinas Virtuales:

Característica Contenedores Docker 🚀 Máquinas Virtuales 🖥️
Aislamiento Parcial (comparten el kernel del host) Completo (cada VM tiene su propio sistema operativo)
Peso Ligero (solo contiene la aplicación y dependencias) Pesado (requiere SO completo)
Velocidad de arranque Segundos Minutos
Consumo de recursos Bajo Alto

🏗️ ¿Cómo se crea un contenedor?

Para crear un contenedor, se necesita una imagen. La imagen es el punto de partida y contiene:

🔹 El sistema operativo base
🔹 Las librerías necesarias
🔹 Los archivos de la aplicación

Si deseas saber más sobre las imágenes, puedes leer más en 🖼️ Imágenes.

🔹 Ejemplo práctico:

Supongamos que tenemos una aplicación web que necesita:

✅ Un servidor web (Apache o Nginx).
✅ Un entorno de ejecución de PHP.

En lugar de instalar PHP y el servidor web directamente en el host, podemos utilizar dos contenedores de Docker:

1️⃣ Contenedor con PHP
2️⃣ Contenedor con el servidor web

Estos contenedores se comunican entre sí, pero permanecen aislados del sistema host, lo que evita problemas de compatibilidad y facilita la gestión de dependencias.

🛠️ Comandos para gestionar contenedores:

📌 Crear un contenedor

Docker create <la imagen>

Si descargamos una imagen desde DockerHub, Docker descargará tanto la imagen como el contenedor asociado.
Pasted image 20250401200209.png
📌 Añadir un nombre

docker create --name <nombre_del_contenedor> <imagen>

📌 Listar contenedores incluso las que están paradas

docker ps -a

Pasted image 20250401200609.png
📌 Crear y ejecutar un contenedor (con Docker pull si no se ha descargado)

docker run <nombre del contenedor>

Pasted image 20250401202548.png
📌 Iniciar y acceder a la terminal del contenedor

docker exec -it docker_name> /bin/bash

Pasted image 20250401203503.png

📂 Modificar archivos dentro del contenedor:

1️⃣ Descargar un archivo del contenedor a tu máquina local

docker cp <nombre_del_contenedor>:<ruta_del_contenedor> <ruta_local>

Ejemplo:
Si quieres traer el archivo /var/log/syslog al directorio /root en el host, el comando sería:

docker cp <nombre_del_contenedor>:/var/log/syslog /root

2️⃣ Subir el archivo editado de vuelta al contenedor

docker cp <ruta_local> <nombre_del_contenedor>:<ruta_del_contenedor>

Ejemplo:
Si editaste el archivo syslog en tu host y lo deseas subir al contenedor, usarías:

docker cp /root/syslog <nombre_del_contenedor>:/var/log

docker cp /root/syslog <nombre_del_contenedor>:/var/log

Gestionar el estado del contenedor:

📌 Detener un contenedor

docker stop <ID_DEL_CONTENEDOR>

docker stop <ID_DEL_CONTENEDOR>

📌 Iniciar un contenedor detenido

docker start <ID_DEL_CONTENEDOR>

📌 Eliminar un contenedor

docker rm <ID_DEL_CONTENEDOR>

⚠️ Consideraciones importantes:

Si reinicias un servicio dentro de un contenedor, es posible que el contenedor se detenga. Por eso, es importante verificar que el contenedor sigue en ejecución usando docker ps y, si no lo está, arrancarlo de nuevo con docker start.

🧰 Resumen de los comandos docker run

El comando docker run se utiliza para crear y ejecutar contenedores desde imágenes. Su estructura básica es:
docker run [OPCIONES] NOMBRE_IMAGEN [COMANDO] [ARGUMENTOS...]

🔧 Opción 💡 ¿Qué hace? 🧱 Instrucción relacionada (Dockerfile) 🧪 Ejemplo de uso
-d Ejecuta el contenedor en segundo plano (modo detached). Ideal para servicios o servidores. N/A docker run -d mi_web
-it Ejecuta el contenedor de forma interactiva con terminal. Perfecto para usar la consola interna del contenedor. N/A docker run -it ubuntu bash
-v Monta volúmenes (carpetas o archivos) del host dentro del contenedor. Útil para persistencia o compartir datos. VOLUME docker run -v $(pwd):/data mi_app
-p Mapea puertos del host al contenedor. Necesario para acceder a apps web desde fuera del contenedor. EXPOSE docker run -p 8080:80 nginx
--rm Elimina automáticamente el contenedor una vez que termina su ejecución. Útil para tareas temporales. N/A docker run --rm alpine echo "Hola mundo"
--name Asigna un nombre personalizado al contenedor (en vez de un nombre aleatorio generado por Docker). N/A docker run --name servidor_web nginx