Gestión de contenedores Docker
Laboratorio del ciclo de vida #
Crea, arranca, detén y elimina un contenedor de práctica. Compara lo que mostrarían
docker ps y docker ps -a en cada estado; la imagen permanece disponible.
Laboratorio interactivo
Docker: crea, arranca, detén y elimina
Una imagen permite crear contenedores. Crear no inicia el proceso; detener conserva el contenedor; eliminar permite crear otro con el mismo nombre.
No existe
Creado
En ejecución
Detenido
docker ps: ningún proceso activo. docker ps -a: demo no existe. La imagen sigue disponible.
Selecciona una acción para ver su comando.
Modelo de un contenedor sin política de reinicio, autoeliminación ni borrado forzado. No ejecuta comandos en tu equipo. Los botones habilitados muestran las transiciones válidas.
Experimenta: Crea demo y observa si aparece como proceso activo. Arranca, detén y vuelve a arrancar. ¿Cuándo puedes eliminarlo sin forzar?
1. De una imagen a un contenedor #
En el bloque anterior hemos trabajado con imágenes.
Una imagen es una plantilla.
Para poder utilizarla necesitamos crear y ejecutar un contenedor.
Podemos representarlo así:
1IMAGEN 2 ↓ 3docker run 4 ↓ 5CONTENEDOR
Por ejemplo:
1hello-world
es una imagen.
Cuando ejecutamos:
1docker run hello-world
Docker crea un contenedor a partir de esa imagen.
2. Ejecutar un contenedor: docker run #
El comando principal para crear y ejecutar contenedores es:
1docker run
La sintaxis básica es:
1docker run <imagen>
Por ejemplo:
1docker run hello-world
Docker:
- Busca la imagen
hello-worlden nuestro equipo. - Si no existe, intenta descargarla.
- Crea un nuevo contenedor.
- Ejecuta el comando definido en la imagen.
- Cuando termina ese comando, el contenedor se detiene.
3. Primer ejemplo: hello-world #
Ejecutamos:
1docker run hello-world
La imagen hello-world muestra un mensaje por pantalla y termina.
Después de ejecutarla podríamos pensar que el contenedor ha desaparecido.
Pero realmente sigue existiendo, aunque esté detenido.
Lo veremos utilizando:
1docker ps -a
4. docker run crea un contenedor nuevo #
Es importante entender que cada vez que hacemos:
1docker run hello-world
Docker crea un nuevo contenedor.
Si ejecutamos:
1docker run hello-world 2docker run hello-world 3docker run hello-world
habremos creado tres contenedores distintos.
Todos parten de la misma imagen:
1 hello-world 2 │ 3 ┌──────┼──────┐ 4 ↓ ↓ ↓ 5 contenedor contenedor contenedor 6 1 2 3
5. Ejecutar comandos dentro de una imagen Linux #
Podemos arrancar una imagen Linux indicando qué comando queremos ejecutar.
Por ejemplo, con Debian:
1docker run debian ls
Docker crea un contenedor Debian y ejecuta:
1ls
Cuando ls termina, el contenedor se detiene.
6. Obtener una shell dentro del contenedor #
Si queremos trabajar dentro de un contenedor Linux necesitamos una shell.
Por ejemplo:
1docker run -i -t debian /bin/bash
También se suele escribir de forma abreviada:
1docker run -it debian /bin/bash
Significado de -i #
La opción:
1-i
significa:
1interactive
Mantiene abierta la entrada estándar para poder interactuar con el contenedor.
Significado de -t #
La opción:
1-t
crea una terminal:
1TTY
Esto permite trabajar cómodamente desde la consola.
Resultado #
Después de ejecutar:
1docker run -it debian /bin/bash
podremos ver algo parecido a:
1root@75a2a7f45d4e:/#
Ahora estamos dentro del contenedor.
Podemos ejecutar:
1ls
1pwd
1mkdir datos
1cd datos
7. Salir del contenedor parando su ejecución #
Si estamos dentro de un contenedor interactivo podemos salir mediante:
1exit
o pulsando:
1Ctrl + D
En este caso salimos del contenedor y además se detiene.
Podemos comprobarlo con:
1docker ps
8. Salir sin detener el contenedor #
En ocasiones queremos abandonar la consola pero dejar el contenedor ejecutándose.
Para ello utilizamos:
1Ctrl + P 2Ctrl + Q
Debemos pulsar la combinación de teclas en ese orden.
A esta operación se le denomina:
1detach
Es decir, nos desconectamos del contenedor pero este sigue funcionando.
9. Diferencia importante #
Si utilizamos:
1exit
o:
1Ctrl + D
el contenedor se detiene.
Si utilizamos:
1Ctrl + P + Q
el contenedor continúa ejecutándose.
Podemos resumirlo así:
1exit / Ctrl+D 2 ↓ 3salir y parar 4 5 6Ctrl+P+Q 7 ↓ 8salir sin parar
10. Ver contenedores en ejecución: docker ps #
Para ver qué contenedores están funcionando utilizamos:
1docker ps
Por ejemplo:
1docker ps
Podemos obtener una salida similar a:
1CONTAINER ID IMAGE COMMAND STATUS NAMES 2abc123 debian "/bin/bash" Up 2 minutes clever_tesla
11. Ver todos los contenedores: docker ps -a #
Si queremos ver también los contenedores detenidos utilizamos:
1docker ps -a
La opción:
1-a
significa:
1all
Por tanto:
1docker ps
muestra solo los contenedores activos.
Mientras que:
1docker ps -a
muestra:
- Contenedores activos.
- Contenedores detenidos.
12. Ejemplo con hello-world #
Ejecutamos:
1docker run hello-world
Después:
1docker ps
Probablemente no veremos el contenedor porque hello-world ya ha terminado.
Pero si ejecutamos:
1docker ps -a
sí aparecerá.
13. CONTAINER ID e IMAGE ID #
No debemos confundir:
1IMAGE ID
con:
1CONTAINER ID
El IMAGE ID identifica una imagen.
El CONTAINER ID identifica un contenedor creado a partir de ella.
Por ejemplo:
1IMAGEN ubuntu 2IMAGE ID: abc111 3 │ 4 ├── CONTENEDOR 1 → ID xyz123 5 └── CONTENEDOR 2 → ID xyz456
14. Ejemplo práctico con Linux Mint #
Vamos a crear un contenedor basado en Linux Mint y acceder a su shell.
En tu material se utiliza la imagen:
1vcatechnology/linux-mint
Primero buscamos imágenes relacionadas:
1docker search mint
Descargamos:
1docker pull vcatechnology/linux-mint
Comprobamos:
1docker images
Y arrancamos el contenedor obteniendo una shell:
1docker run -it vcatechnology/linux-mint bash
15. Trabajar dentro de Linux Mint #
Una vez dentro podemos ejecutar:
1pwd
1ls
Creamos una carpeta:
1mkdir cebem
Y comprobamos:
1ls
Debería aparecer:
1cebem
16. Salir del contenedor Linux Mint #
Podemos cerrar el contenedor con:
1exit
o:
1Ctrl + D
Después ejecutamos:
1docker ps
El contenedor ya no aparecerá como activo.
Pero seguirá existiendo.
Podemos comprobarlo con:
1docker ps -a
17. Arrancar un contenedor detenido: docker start #
Una vez creado un contenedor no necesitamos utilizar otra vez docker run.
Si ya existe y está detenido podemos arrancarlo utilizando:
1docker start <contenedor>
Por ejemplo:
1docker start abc123
También podemos utilizar su nombre:
1docker start miDebian
18. Diferencia entre docker run y docker start #
Esta diferencia es fundamental.
docker run #
1docker run debian
Crea un nuevo contenedor y lo ejecuta.
docker start #
1docker start miDebian
Arranca un contenedor que ya existe.
Podemos recordarlo así:
1docker run 2 ↓ 3CREAR + ARRANCAR 4 5 6docker start 7 ↓ 8ARRANCAR uno existente
19. Detener un contenedor: docker stop #
Para detener un contenedor utilizamos:
1docker stop <contenedor>
Ejemplo:
1docker stop miDebian
También podemos utilizar su ID:
1docker stop abc123
docker stop intenta realizar una parada ordenada del contenedor.
20. Reiniciar un contenedor: docker restart #
Podemos detener y volver a arrancar un contenedor con un único comando:
1docker restart <contenedor>
Por ejemplo:
1docker restart miDebian
Es equivalente conceptualmente a:
1docker stop miDebian 2docker start miDebian
21. Forzar la parada: docker kill #
En ocasiones un contenedor puede no responder correctamente.
Podemos detenerlo de forma inmediata utilizando:
1docker kill <contenedor>
Ejemplo:
1docker kill miDebian
La diferencia básica es:
1docker stop 2 ↓ 3parada ordenada 4 5 6docker kill 7 ↓ 8parada inmediata
En general es preferible utilizar primero:
1docker stop
y reservar docker kill para situaciones en las que sea necesario detener el proceso de forma inmediata.
22. Conectarse de nuevo a un contenedor: docker attach #
Si tenemos un contenedor ejecutándose podemos conectarnos a su terminal mediante:
1docker attach <contenedor>
Ejemplo:
1docker attach miDebian
23. Ejemplo completo con attach #
Creamos un contenedor:
1docker run -it debian bash
Creamos una carpeta:
1mkdir nueva-carpeta
Salimos:
1exit
Comprobamos:
1docker ps -a
Volvemos a arrancarlo:
1docker start <CONTAINER_ID>
Y nos conectamos:
1docker attach <CONTAINER_ID>
La carpeta creada anteriormente seguirá existiendo dentro del contenedor.
24. Poner nombre a un contenedor #
Docker asigna automáticamente nombres a los contenedores.
Por ejemplo:
1happy_turing 2clever_tesla 3elegant_booth
Pero normalmente es mucho más cómodo asignar nuestros propios nombres.
Podemos hacerlo mediante:
1--name
25. Ejemplo de --name #
Creamos un contenedor Debian llamado:
1miDebian
utilizando:
1docker run -it --name miDebian debian bash
Después podremos utilizar ese nombre en otros comandos.
Por ejemplo:
1docker start miDebian
1docker stop miDebian
1docker attach miDebian
26. Ventaja de utilizar nombres #
Es mucho más sencillo recordar:
1docker stop miDebian
que:
1docker stop 25bd73ad98f7
Por ello es recomendable asignar nombres significativos a nuestros contenedores.
Por ejemplo:
1mysql 2nginx 3servidor-web 4bd-desarrollo 5mi-debian
27. Cambiar el nombre: docker rename #
Podemos cambiar el nombre de un contenedor mediante:
1docker rename <nombre_actual> <nuevo_nombre>
Por ejemplo:
1docker rename miDebian debian-clase
Después podemos comprobarlo:
1docker ps -a
28. Eliminar un contenedor: docker rm #
Para eliminar definitivamente un contenedor utilizamos:
1docker rm <contenedor>
Ejemplo:
1docker rm debian-clase
También podemos utilizar:
1docker rm <CONTAINER_ID>
29. Un contenedor debe estar detenido #
Normalmente, para eliminar un contenedor primero debemos detenerlo.
Por ejemplo:
1docker stop debian-clase
Después:
1docker rm debian-clase
Y comprobamos:
1docker ps -a
30. Eliminar un contenedor de forma forzada #
También existe:
1docker rm -f <contenedor>
Por ejemplo:
1docker rm -f debian-clase
Esto permite detener y eliminar el contenedor.
Debe utilizarse con cuidado.
31. Consultar información detallada: docker inspect #
El comando:
1docker inspect
muestra información detallada sobre un objeto Docker.
Por ejemplo, para inspeccionar un contenedor:
1docker inspect miDebian
Docker devuelve una gran cantidad de información en formato JSON.
Podemos encontrar datos como:
1ID del contenedor 2Imagen utilizada 3Nombre 4Estado 5Fecha de creación 6Configuración 7Red 8Dirección IP 9Volúmenes 10Puertos
32. Consultar la IP de un contenedor #
En tu material se utiliza:
1docker inspect <nombre_o_id>
Y también una consulta filtrada:
1docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <nombre_o_id>
Por ejemplo:
1docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' miDebian
Esto intenta mostrar únicamente la dirección IP asociada al contenedor.