A la hora de lanzar un contenedor en Docker podemos encontrarnos varios escenarios:
- Que ya dispongamos de la imagen en el host (equipo) desde el que hacemos la llamada de ejecución (lanzamiento) del contenedor y que hemos descargado previamente de Docker Hub u otro repositorio con la sentencia docker pull XXXX/XXXX. recordad que con docker images ls podemos comprobar las imágenes de las que disponemos en nuestro equipo anfitrión.
- Que no dispongamos de la imagen que queremos utilizar con lo que «docker» comprobará que no disponemos de dicha imagen y a continuación la buscara en el repositorio Docker Hub. Obviamente deberíamos de haber pasado una imagen existente en dicho repositorio.
- Que dispongamos de la imagen en nuestro equipo anfitrión ya que la hemos construido nosotros mismos (Dockerfile). A este respecto debemos de puntualizar que habitualmente nos basamos en imágenes base para , a continuación, construir la nuestra ad-hoc.
Vamos ha ver un ejemplo de ejecutar (o lanzar) un contenedor en los tres casos explicados.
Antes de realizar esto debemos explicar algunos parámetros en la sentencia de lanzamiento de nuestro contenedor. La lista de parámetros que podemos añadir al comando docker run es muy extensa, es por ello que aquí explicaremos los mas usuales o útiles para lanzar un contenedor.
La sintaxis de ejecución de un contenedor es: docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG…]
- -d — > detached (se ejecuta el contenedor en background). Esta opción suele ser la mas cómoda y habitual para seguir trabajando en la consola de nuestro host. En caso de no incluirse se ejecuta en «foreground» y la salida de nuestra consola quedará unida a la ejecución del contenedor.
- –name — > Es una de las formas en la que vamos a identificar a un contenedor (la otra es su UUID long identifier y su UUID short identifier). Si no especificamos un nombre docker le asignar.a uno aleatoriamente. Yo recomiendo siempre ponerle un nombre característico.
- -it — > Mantiene abierta la entrada de datos al contenedor y una manera de acceder a el (consola tty). También recomiendo su uso. habitualmente el parámetro «t» va asociado al tipo de consola que quiero acceder en el contenedor (lo mas empleado es acceder a /bin/bash).
- –rm — > Sirve para eliminar dicho contenedor una vez lo detengamos. Los contenedores persisten una vez creados para que puedan volver a ser lanzados. Teniendo la imagen, a veces, no tiene sentido que estos contenedores persistan una vez detenidos (tener en cuenta que un contenedor nuevo no puede ser lanzado con el mismo nombre de uno que ya exista aunque se encuentre este ultimo detenido). También lo considero una buena opción.
- –cap-add=XXXX — > Por defecto los contenedores se ejecutan en modo sin privilegios de servicios de la maquina host. Para poder ejecutar dentro de un docker esos servicios (que serian independientes de lo que se ejecutan fuera del contenedor) se podrían añadir o eliminar «capabilities». Por ejemplo, no podríamos usar Netfilter (IPTables) dentro de un contenedor sino añadimos –cap-add=NET_ADMIN.
- -p — > sirve para «mapear» y exponer puertos del host anfitrión con respecto al contenedor. Por ejemplo, -p 8080:80 significa que con la IP del host anfitrión en el puerto 8080 habremos unido ese socket (IP + Puerto) al socket del contenedor (es decir a su puerto 80).
Las anteriores son las mas comunes como hemos dicho, pero existen otras importantes como son las relacionadas con redes, mapeo de volúmenes, limitar los consumos de CPU o RAM, etc. MAs adelante se irán explicando muchas de ellas.
Como habíamos comentado vamos a lanzar el contenedor (luego detenerlos y borrarlos) en los dos primeros escenarios comentados (dejamos para otro capitulo el «Dockerfile»).
Lanzar un contenedor del que ya disponemos en nuestro host anfitrión
- Comprobamos las imágenes que tenemos con docker images
- Lo llamamos por su nombre canónico (REPOSITORY) aquí hay que añadir la etiqueta (TAG), podríamos haberlo llamado por su IMAGE ID.

Como vemos en la imagen el comando le indica que transforme el puerto interno del contenedor 80 al externo del host 8080 y le damos capacidades de NET_ADMIN. Ademas, le hemos asignado un nombre, que arranche en modo detached y que se elimine cuando se detenga.
En las siguiente imagen vemos como podemos acceder al servicio web en el puerto 8080.

Descargar una imagen en nuestro host anfitrión y luego lanzar un contenedor de esa imagen
- Primeramente obtenemos la imagen con la sentencia docker pull ghost. Esta imagen NO existe en nuestro host por lo que docker se dirige a Docker Hub y busca esa imagen, como no hemos especificado su etiqueta busca la ultima (latest).
- A continuación, comprobamos que tenemos ya esa imagen descargada en nuestro host local.
- Por ultimo lanzamos nuestro contenedor, ene este caso le especificamos como acceder a el (opción -e) aunque realmente esta opción seria para establecer una URL o IP especifica ya que NO seria necesaria en nuestro ejemplo ya que hemos mapeado el puerto correctamente (-p 3001:2368).



Detener y eliminar un contenedor
Para detener y eliminar un contenedor docker depende de como lo hayamos arrancado. Si lo hemos arrancado con la opción –rm, una vez lo detengamos se eliminará automáticamente, sino deberíamos de eliminarlo través de su nombre canónico o mejor de su CONTAINER ID.
En la siguiente imagen vemos tanto los contenedores que están en ejecución como los ya detenidos (la opción -a me permite ver todos).

Primero detendremos el segundo contenedor que se eliminara automáticamente (recordad la opción –rm) y luego eliminaremos el primero y luego lo eliminaremos específicamente con su CONTAINER ID. LA siguiente imagen muestra todos estos pasos.

Asi pues:
- Detener un contenedor — > docker container stop CONTAINER_ID
- Eliminar un contenedor — > docker rm CONTAINER_ID
- Ver contenedores en ejecución — > docker ps
- Ver TODOS los contenedores — > docker ps -a
Deja una respuesta