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).