Ahora que conocemos los conceptos teóricos, es hora de empezar a trabajar con contenedores. En esta sección, veremos cómo descargar imágenes de Docker Hub y cómo gestionar el ciclo de vida de los contenedores.
El comando `docker run` es el más versátil. Si la imagen no existe localmente, la descarga (`pull`) y luego crea y ejecuta (`run`) un contenedor a partir de ella.
Nginx es un servidor web muy popular. Podemos levantarlo con un solo comando:
docker run --name mi-servidor-web -p 8080:80 -d nginx
Desglosemos los parámetros:
--name mi-servidor-web
: Le asigna un nombre legible al contenedor para identificarlo fácilmente.-p 8080:80
: Mapea un puerto. Publica el puerto 80 del contenedor (el puerto por defecto de Nginx) en el puerto 8080 de nuestra máquina (host). Así, podemos acceder al servidor desde nuestro navegador.-d
: Modo "detached" o desacoplado. Ejecuta el contenedor en segundo plano y nos devuelve el control de la terminal.nginx
: El nombre de la imagen que queremos usar.Ahora, si abres tu navegador y vas a http://localhost:8080
, verás la página de bienvenida de Nginx. ¡Has desplegado un servidor web en segundos!
Alpine es una distribución de Linux extremadamente ligera (ocupa unos 5 MB). Es muy usada como base para crear imágenes personalizadas.
docker run alpine echo "Hola desde un contenedor Alpine"
En este caso, el contenedor se inicia, ejecuta el comando `echo`, imprime el mensaje en la terminal y se detiene, ya que su tarea ha finalizado.
A veces necesitamos "entrar" en un contenedor para explorar su sistema de archivos, depurar un problema o ejecutar comandos. Para esto, usamos los flags -it
.
-i
(interactivo): Mantiene la entrada estándar (STDIN) abierta, permitiéndonos escribir comandos.-t
(TTY): Asigna un pseudo-terminal, lo que nos da una shell interactiva.Vamos a iniciar un contenedor con Ubuntu y obtener una terminal de `bash`:
docker run -it --name mi-ubuntu ubuntu bash
Después de ejecutar este comando, tu prompt cambiará. Estarás dentro del contenedor como usuario `root`. Ahora puedes ejecutar comandos de Linux como si estuvieras en una máquina Ubuntu real:
# Dentro del contenedor
ls -la
pwd
apt-get update && apt-get install -y curl
exit
Al escribir exit
, el proceso `bash` termina y el contenedor se detiene.
Una vez que tenemos contenedores (en ejecución o detenidos), necesitamos comandos para gestionarlos.
El comando `docker ps` (process status) muestra los contenedores que están actualmente en ejecución.
docker ps
Verás una tabla con el ID del contenedor, la imagen, el comando, cuándo fue creado, su estado, los puertos y su nombre (como `mi-servidor-web`).
Para ver todos los contenedores, incluyendo los detenidos (como `mi-ubuntu`), usa el flag -a
:
docker ps -a
Para detener el servidor Nginx que dejamos corriendo en segundo plano, usamos `docker stop` seguido del nombre o ID del contenedor.
docker stop mi-servidor-web
Si ahora visitas http://localhost:8080
, la página no cargará. El contenedor está detenido, pero no eliminado.
Los contenedores detenidos siguen ocupando espacio en disco. Para eliminarlos permanentemente, usamos `docker rm`.
# Primero eliminamos el de nginx
docker rm mi-servidor-web
# Ahora el de ubuntu
docker rm mi-ubuntu
Si intentas eliminar un contenedor en ejecución, Docker te dará un error. Debes detenerlo primero, o forzar la eliminación con el flag -f
: docker rm -f <nombre_contenedor>
.
Resumamos el flujo de trabajo básico con un contenedor:
docker run -d --name test-container alpine tail -f /dev/null
(el comando `tail` mantiene el contenedor vivo).docker ps
.docker stop test-container
.docker ps -a
.docker rm test-container
.docker ps -a
(ya no debería aparecer).