Gestión de contenedores Docker
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.