Saltar la navegación

2.5 Ejecutar órdenes en los contenedores.

Con los contenedores en ejecución vamos a querer ejecutar ordenes en ellos. Querremos realizar operaciones como:

  • Instalar paquetes.
  • Modificar o ver el contenido de ciertos ficheros.
  • Habilitar ciertos módulos de servicios
  • etc...

Esto lo podemos hacer de dos maneras o bien obteniendo un terminal del contenedor y ejecutando las órdenes necesarias desde allí o bien directamente ejecutando una orden determinada "contra" el contenedor. Para ambos casos voy a necesitar la orden docker exec y es NECESARIO QUE EL CONTENEDOR ESTÉ EN EJECUCIÓN.

La sintaxis de esta orden es bastante sencilla y muy similar a la de docker run:

docker exec [opciones] nombre_contenedor orden [argumentos]

Algunas de las opciones más importantes son:

  • -it (-i y -t juntos) si vamos a querer tener interactividad con el contenedor ejecutando un shell (/bin/bash normamente). Una vez tenemos el terminal ya podremos trabajar desde dentro del propio sistema.
  • -u o --user si quiero ejecutar la orden como si fuera un usuario distinto del de root.
  • -w o --workdir si quiero ejecutar la orden desde un directorio concreto.

Lo vamos a ver mejor con algunos ejemplos:

# Obtener un terminal en un contenedor que ejecutar un servidor Apache (httpd) y que se llama web

> docker exec -it web /bin/bash

root@5d96ce1f7374:/usr/local/apache2#

# Mostrar el contenido de la carpeta /usr/local/apache2/htdocs del contenedor web. Como no hace falta interactividad no es necesario -it

> docker exec web ls /usr/local/apache2/htdocs

# Crear directamente un fichero "HOLA MUNDO" en el directorio raíz del servidor apache. Utilizo sh -c para ordenes compuestas o complejas

> docker exec -it web sh -c "echo 'HOLA MUNDO' > /usr/local/apache2/htdocs/index.html"

Adicionalmente existe otra orden que nos va a ser de mucha utilidad cuando trabajemos con contenedores. la orden docker cp que me permite mover ficheros desde mi sistema al contenedor y desde el contenedor a mi sistema. Su sintaxis es muy sencilla y la vamos a ilustrar con dos ejemplos, uno en cada sentido:

# Copiar mi fichero prueba.html al fichero /usr/local/apache2/htdocs/index.html de mi contenedor llamado web que es un servidor Apache (httpd)

> docker cp prueba.html web:/usr/local/apache2/htdocs/index.html

#Copiar el fichero index.html que se encuenta en /usr/local/apache2/htdocs/index.html de mi contenedor llamado web un fichero llamado test.html en mi directorio HOME

> docker cp web:/usr/local/apache2/htdocs/index.html $HOME/test.html

NOTA: LOS CONTENEDORES VIENEN CON SOLO LO IMPRESCINDIBLE INSTALADO. SI QUIERO INSTALAR ALGO DEBO NORMALMENTE HACER ANTES UN APT UPDATE (ya que la mayoría son basados en Debian).