Por lo general, desea que las aplicaciones de Docker estén completamente contenidas, pero a veces, para fines de desarrollo o automatización, es útil poder trabajar con contenedores de Docker como si fueran máquinas virtuales de Linux. Docker proporciona herramientas para ejecutar comandos e incluso shells completos dentro de contenedores.
Ejecución de comandos en contenedores
Para ejecutar un comando en un contenedor, necesitará su ID de contenedor, a menos que haya configurado un nombre específico para ese contenedor. Esta es una cadena hexadecimal larga que puede encontrar en la lista de procesos de Docker:
docker ps
Luego, puede usar el exec -it
comando para ejecutar dentro del contenedor. Por ejemplo, ver la salida de un archivo de registro:
docker exec -it containerID tail /var/log/nginx/access.log
También puede ejecutar scripts dentro de contenedores:
docker exec -it containerID script.sh
El -it
las banderas son para “modo interactivo” y TTY respectivamente, y se usan casi todo el tiempo. Hay algunas otras banderas que puedes usar:
--workdir
o-w
cambia el directorio actual antes del comando.--detach
, o-d
, ejecuta el comando en segundo plano.--env
, o-e
, establece las variables de entorno antes de ejecutarse.--env-file
hace lo mismo, pero es más seguro para manejar secretos.--privileged
ejecuta el comando con permisos extendidos.--user
se ejecuta como un usuario diferente
Por supuesto, esto solo funciona en un contenedor en ejecución. Si desea pausar un contenedor para realizar el mantenimiento, deberá implementar actualizaciones a través de una nueva versión de imagen o realizar cambios en los datos montados en volumen desde el sistema operativo host.
SSH en un contenedor
No está limitado a comandos simples, en realidad puede abrir un shell ejecutando /bin/bash
como el comando. Es posible que tenga limitaciones en cuanto a las herramientas disponibles (la mayoría de los contenedores cuentan con una instalación de Linux bastante básica), pero hace que ejecutar muchos comandos sea mucho más fácil.
docker exec -it containerID /bin/bash
Esto es simplemente un shell accesible desde el host, que funciona bien en la mayoría de los casos. Pero, si lo desea, puede configurar sus contenedores para que estén completamente disponibles a través de SSH como un VPS. Puede obtener más información sobre cómo configurarlo en nuestra guía para ejecutar un servicio SSH en un contenedor Docker.
RELACIONADO: Cómo usar SSH en un contenedor Docker
Copia de archivos hacia y desde contenedores
Ejecutar comandos con exec -it
funciona, pero todavía hay una capa entre el host y el contenedor que impide la creación de secuencias de comandos. Por un lado, si bien es fácil enviar comandos a un contenedor, es más difícil obtener resultados del sistema de archivos.
Si bien puede canalizar el STDOUT de exec -it
a otros servicios en el sistema operativo host, también puede copiar archivos hacia y desde el sistema de archivos del contenedor. Por ejemplo, extraer un archivo de registro y pegarlo en el host:
docker cp container:/var/log/nginx/example.log example.log
O sacando directorios completos:
docker cp nginx:/etc/nginx/ nginxconfig/
Sin embargo, si hace esto regularmente, puede considerar usar un enlace o un montaje de volumen para que los datos sean directamente accesibles desde el host.
RELACIONADO: Cómo usar Docker Cp para copiar archivos entre el host y los contenedores