Este es uno de los capítulos del tutorial Tutorial de Docker. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En el capítulo anterior estuvimos viendo como tratar con imágenes. Imágenes que descargábamos desde DockerHub. Se trataba de poder inspeccionar imágenes, conocer su historia, y poder borrarlas de nuestro equipo para que no ocupen un espacio innecesario. En este capítulo del tutorial, vamos a hacer lo propio pero con contenedores. El objetivo es gestionar contenedores con docker.
Sin embargo, a pesar de que trataré como gestionar contenedores con docker, no voy a tratar en profundidad la ejecución de contenedores. La ejecución de contenedores la encontrarás en un capítulo posterior del tutorial. Se trata de un aspecto que tiene suficiente entidad e importancia como para dedicarle un capítulo única y exclusivamente a la ejecución de contenedores. Esto no quita a que en este capítulo iniciemos algún contenedor para poder saber como gestionarlo y trabajar con el.
Gestionar contenedores con docker
Si en el capítulo anterior, para la gestión de imágenes tenías que tener presente la instrucción docker image --help
, en este, para la gestión de contenedores tendrás que tener presente docker container --help
.
Por otro lado, para seguir este segundo capítulo del tutorial, utilizaré la misma imagen con la que trabajamos en el capítulo anterior blitznote/baseimage
. Se trata de una imagen muy ligera, y al ser Ubuntu, me siento como en casa.
Iniciando el primer contenedor
Para iniciar tu primer contenedor tan solo tienes que ejecutar docker container run blitznote/baseimage
o mejor, por ser mas corto,
$ docker run atareao/hola
Al ejecutar esta instrucción, te llevarás un pequeño chasco, y es que no sucede, aparentemente, nada. Pasa como un segundo, y vuelves de nuevo a la línea de comandos. Bueno, realmente no es así. Lo cierto es que has arrancado un contenedor, y como no hay ningún proceso en él se ha detenido.
¿Cuantos contenedores tienes?
Para conocer el número de contenedores, tienes que utilizar docker ps
o también docker container ls
. Sin embargo, si ahora lo ejecutas, verás que aparentemente no tienes niguno. Bueno, realmente no verás nada. Para ver todos los contenedores, incluidos los contenedores parados, ejecuta docker ps -a
.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17cb81b454a5 atareao/hola "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago serene_thompson
Algunos detalles a tener en cuenta,
COMMAND
se refiere al comando que es ejecutado, en este caso figura/bin/bash
. ¿de donde sale?. Si ejecutasdocker history blitznote/baseimage
, verá que lo que buscas enCMD
. Esto también lo puedes encontrar utilizandodocker inspect blitznote/baseimage
. Estas dos herramientas las viste en el capítulo anterior de este tutorial.CREATED
como ya sospechas, indica el tiempo que ha transcurrido desde que se creó el contenedor.STATUS
, por otro lado, te indica en que estado se encuentra, y el tiempo que lleva en ese estado.NAMES
, indica el nombre del contenedor. Es mas sencillo identificar un contenedor por su nombre que por suCONTAINER ID
. En el caso de que tu no le pases el nombre, docker generará uno de forma aleatoria.
Poniendo nombre a tus contenedores
Como he comentadoPara iniciar un contenedor asignándole un nombre, la instrucción a ejecutar es la siguiente,
docker run -d --name ejemplo atareao/hola
Si intentas llamar a dos contenedores por el mismo nombre, como te puedes imaginar, se producirá un error, y no iniciará el segundo contenedor.
Pero también tienes la opción de renombrar uno de los conenedores. Así por ejemplo,
docker container rename 17cb81b454a5 perico
De esta manera, renombrará el contenedor con número de identificación 17cb81b454a5
a perico
. Indicarte que, como ya viste con las imágenes, puedes acortar el número de identificación, hasta su mínima expresión, es decir, un solo caracter. Siempre y cuando no haya otro contenedor que tenga un identificador que empiece c on el mismo carácter.
Iniciando, parando y pausando contenedores
Para poder poder parar contenedores y volverlo a iniciar posteriormente, necesitarás un contenedor que ejecute un proceso, un contenedor que no se detenga nada mas arrancarlo. Para eso utilizarás el comando sleep
en el contenedor.
El primero lo vas a lanzar con unos pocos segundos,
docker run atareao/hola sleep 5
Esto no es muy interesante. Hasta que no han transcurrido los 5 segundos, no puedes hacer nada. Para evitar esto, tienes que utilizar la opción -d
, que te permite ejecutar el contenedor sin que estés esperando a que finalice, detach mode. Ahora, en lugar ed 5 segundos, ejecútalo con 100 segundos que te de tiempo a realizar otras opciones,
docker run -d atareao/hola sleep 100
Al hacer esto, te ha devuelto el número de identificación del contenedor. Si ahora ejecutas docker ps
, lo encontrarás entre los contenedores que se están ejecutando.
Ahora ha llegado el momento de parar el contenedor. Para esto, ejecuta docker stop 1e0e92b8255e
. En tu caso, indica el identificador o parte del identificador de tu contenedor.
Una vez detenedido lo puedes iniciar de nuevo. Para esto ejecuta docker start 1e0e92b8255e
.
Matando contenedores
Por último puedes matar el contenedor. Para ello ejecuta docker kill 1e0e92b8255e
. La diferencia entre stop
y kill
, radica en que en el primer caso se envía proceso principal del contenedor la señal SIGTERM y posteriormente SIGKILL. En el segundo caso, en el caso de docker kill
, se envia directamente la señal SIGKILL. Esto lo notarás en el tiempo que tarda en detenerse un contenedor, si haces un docker stop
tardará unos segundos, mientras que si haces un docker kill
se detendrá prácticamente al instante.
Otra opción que tienes es la de reiniciar un contenedor. Es decir, detener e iniciar de nuevo el contenedor, pero todo desde un único comando docker restart 1e0e92b8255e
.
Pausando contenedores
Por último, te queda una opción que te puede resultar muy interesante, que es le de pausar un contenedor. Bueno, realmente, estás pausando todos los procesos dentro del contenedor. Para pausar el contenedor,
docker pause 1e0e92b8255e
Ahora al hacer un docker ps
verás que si que aparece tu contenedor, pero que está en modo pausa. Puedes ponerlo de nuevo en funcionamiento con un unpause
, como por ejemplo,
docker unpause 1e0e92b8255e
Mas operaciones para gestionar contenedores
De nuevo inicia un docker pero esta vez con mas tiempo para hacer mas operaciones con él. Por ejemplo con un sleep 100000
. Si por lo que fuera, lo lanzas sin la opción -d
, recuerda que siempre puedes parar el contenedor desde otro terminal. Por otro lado, esta vez para tu comodidad, le vas a poner nombre, en mi caso midocker
. Así va a ser mas sencillo trabajar con él.
docker run -d --name midocker atareao/hola sleep 100000
Copiando entre el host y el contenedor
Es posible que en alguna ocasión quieras copiar un archivo entre tu equipo y el contenedor, y al revés. Para esto tienes el comando cp
. Para verlo con un ejemplo crear un archivo y posteriormente lo copias al contenedor,
$ touch archivo.txt
$ docker cp archivo.txt midocker:.
Ya lo tienes… has copiado archivo.txt
a /
. ¿Como comprobarlo? Tienes que entrar al contenedor y ver que hay allí dentro. Para esto ejecuta,
$ docker exec -it midocker bash
No te preocupes, que tanto docker exec
como docker run
los verás con detalle en el próximo capítulo de este tutorial. Por ahora, quedate con que esta opción te permite abrir una consola de forma interactiva en el contenedor.
Una vez ejecutada la instrucción anterior, y dentro del contenedor, verás que estás en el directorio raíz. Lista los archivos ls
y verás que allí está el archivo que has copiado. Ahora, puedes hacer lo mismo, crea un archivo nuevo, que luego lo copiarás a tu equipo, touch archivo2.txt
. Ahora sal del contenedor con un exit
, y copia del contenedor a tu equipo,
$ docker cp midocker:archivo2.txt .
Simplemente ls
y comprueba que tienes ahí ese archivo que creaste en tu contenedor.
¿Que sucede en el contenedor?
Si quieres saber lo que sucede en tu equipo, es decir, los procesos que están corriendo, ejecutarías el comando top
. Esto mismo lo puedes hacer con un contenedor. Simplemente tienes que ejecutar,
$ docker top midocker
UID PID PPID C STIME TTY TIME CMD
root 1330 1308 0 06:34 ? 00:00:00 sleep 100000
Otra opción que también te puede resultar interesante para monitorizar un contenedor es docker stats
. Esto te permite ver en tiempo real y hasta que lo detengas lo que sucede en ese contenedor. Para detenerlo, tienes que ejecutar Ctrl+C
. En el caso de que solo quieras una visión puntual, utiliza la opción --no-stream
. Por ejemplo,
$ docker stats --no-stream midocker
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a89b24cc9cd2 midocker 0.00% 2.227MiB / 7.694GiB 0.03% 7.42kB / 0B 1.98MB / 0B 1
Borrando contenedores
Ejecuta ahora docker ps -a
y verás la cantidad de contenedores que tienes en tu equipo. Es el momento de hacer un poco de limpieza. Para esta operación, tienes dos opciones, o bien, los eliminas uno a uno, como por ejemplo,
$ docker rm midocker
Si por despiste o por la razón que sea, intentas detener un contendor que está en ejecución, te arrojará un error. Antes de borrar un contenedor este tiene que estar parado. Como viste antes, puedes pararlo o matarlo.
La otra opción es borrar todos los contenedores que estén parados. Para ello, tienes que ejecutar el comando,
$ docker container prune
Al ejecutar este comando, te avisa que vas a borrar todos los contenedores parados, y te pregunta si esto es lo que quieres hacer.
Conclusión
En este segundo capítulo del tutorial, has podido ver una parte importante de los comandos que puedes utilizar para gestionar contenedores. Indicarte que estos no son todos, pero, ahora mismo, para gestionar tus contenedores tienes suficientes herramientas.
En el próximo capítulo vas a ver con detalle los comandos docker run
y docker exec
.
La verdad que vengo aprendiendo muchísimo, gracias por la explicación detallada de cada paso…sigue así !
Me está sirviendo mucho este artículo. Está muy bien explicado y sencillo. ¡Muchas gracias!
Muchísimas gracias Jesús.
Habría que revisar esta página para que el tutorial se pueda seguir bien.
En apartado INICIANDO PRIMER CONTENEDOR mencionas que ejeccutarás docker container run blitznote/baseimage que no existe pero luego haces un $ docker run atareao/hola
bash no parece existir en el contenedor y por tanto el comando
$ docker exec -it midocker bash
FALLA
si que parece existir sh … que es lo que en realidad creo que aparece declarado en cmd
El comando cp de local al docker me ha funcionado pero no he conseguido copiar lo que he creado en la docker en mi local.