El otro día ya hablé de qué son los contenedores, como podíamos saber los que tenemos creados y como crear nuevos, hoy quiero compartir como podemos entrar dentro de esos contenedores y ejecutar comandos dentro de ellos.

Cuando creamos un contenedor por defecto docker ejecuta la acción que tenga definida por defecto la imagen, por ejemplo si creamos un contenedor con un imagen de mysql, pues el comando que se ejecutará automáticamente será el servicio de mysql, pero a veces queremos ejecutar otros comandos sobre los contenedores, y como en este caso acceder al contenedor y ejecutar los comandos dentro, y para eso tenemos las siguientes opciones:

Crear un contenedor y acceder a él directamente

Esta tarea la realizaremos creando un nuevo contenedor y diciéndole el comando que queremos lanzar de la siguiente forma:

docker container run --rm --name so -it alpine /bin/sh

¿Qué hace exactamente eso? Por partes

Sin entrar en --rm y --name que ya hablé en el anterior post.

run

Creamos un nuevo contenedor

-it

Le decimos que se trata de una sesión interactiva y TTY, lo que quiere decir que queremos tanto el input como el output de la máquina, para así poder usarla como un terminal.

/bin/sh

Es el comando que queremos usar, en este caso el interprete. NOTA: Lo mas común sería /bin/bash que se encuentra en la mayoría de imágenes, pero justamente Alpine no viene con ella instalada. Podemos ejecutar lo que queramos, por ejemplo un comando ls pero eso no sería interactivo, no permaneceríamos dentro de la máquina.

Acceder a un contenedor en ejecución.

Otra opción que tenemos es que ya tengamos un contenedor en ejecución y queramos acceder a dicho contenedor.

Imaginemos que tenemos un contenedor con una imagen nginx dentro, a la cual hemos llamado proxy, que se está ejecutando en ese mismo momento y queremos acceder para tocar algo en su configuración, podríamos hacerlo de la siguiente manera:

docker container exec -it proxy /bin/bash

exec

Es el comando que usamos para ejecutar dentro de un contenedor que ya existe.

-it

Lo mismo que en el caso anterior, queremos abrir una terminal interactiva

proxy

Es el nombre que tiene el contenedor al que quiero acceder, ese nombre se lo habremos dado en su creación o tendrá uno aleatorio.

/bin/bash

El comando que queremos ejecutar, un interprete que nos de acceso a la máquina.

Arrancar un contenedor creado en modo interactivo, que actualmente esté parado y acceder a él

Imaginemos que hemos creado un contenedor de Alpine de la siguiente manera: docker container run -it --name alpine_so alpine /bin/sh , este es el primer caso que hemos visto anteriormente. Esto nos habrá devuelto una shell, una vez hemos salido con exit el contenedor seguirá existiendo, estará apagado, pero existirá. Pues bien, tenemos una opción de arrancarlo y continuar con la sesión interactiva de la siguiente manera:

docker container start -ai alpine_so

start

Arranca un contenedor que esté parado

-ai

Attach e Interactivo sería lo mismo que ejecutar -a -i . Le decimos que se conecte al contenedor de modo interactivo

alpine_so

Simplemente es el nombre que le he puesto al contenedor en su creación

¿Qué podemos hacer con esto?

Pues podemos hacer cualquier cosa que nos permita la imagen que corra en el contenedor, si por ejemplo es Ubuntu pues podremos ejecutar comandos de Ubuntu internamente e incluso instalar paquetes dentro.

NOTA: Muy importante tener en cuenta que si ejecutamos algo dentro de un contenedor solo estará dentro de ese contenedor, si lo matamos y ejecutamos otro contenedor, aun con la misma imagen, habremos perdido los cambios que hayamos realizado dentro. Por ejemplo: Tenemos un contenedor con una imagen de Ubuntu dentro, accedemos a él e instalamos algo con APT y acto seguido borramos el contenedor. Si vuelvo a crear un contenedor Ubuntu mis cambios no estarán dentro.