Introducción
La conexión a un contenedor Docker en ejecución es útil cuando desea ver lo que sucede dentro del contenedor. Si el contenedor Docker no funciona como se esperaba, puede conectarse al contenedor u obtener un shell de contenedor y ejecutar comandos como ps o top, instalar nuevos paquetes, etc.
En este tutorial, explicaremos cómo conectarse al proceso principal del contenedor en ejecución y cómo obtener un shell en un contenedor en ejecución.
Conectarse a un contenedor
Si bien puede ejecutar varios procesos en un contenedor, la mayoría de los contenedores Docker solo ejecutan un único proceso. El comando que se ejecuta cuando se inicia un contenedor se especifica mediante la instrucción ENTRYPOINT y /o RUN.
El comando docker attach le permite adjuntar la terminal al contenedor en ejecución. Esto es útil cuando desea ver lo que está escrito en la salida estándar en tiempo real o para controlar el proceso de forma interactiva.
Para comprender mejor cómo funciona el comando adjuntar, ejecutemos un nuevo contenedor Nginx separado usando la imagen oficial de Nginx.
docker container run --name my_nginx -d -p 8080:80 nginx
La opción -p 8080: 80 indica a Docker que asigne el puerto 8080 del contenedor al puerto 80 en la computadora host.
Enumere los contenedores para asegurarse de que el contenedor "my_nginx " se esté ejecutando:
docker container ls
Debería recibir un mensaje de salida similar al siguiente:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37dh4dh47mlk nginx "nginx -g 'daemon of…" 5 minutes ago Up 6 seconds 0.0.0.0:8080->80/tcp my_nginx
Adjuntar al contenedor usando el ID o el nombre del contenedor:
docker container attach my_nginx
El comando de imagen nginx predeterminado que se ejecuta cuando se ejecuta el contenedor está configurado en CMD ["nginx", "-g", "daemon off;"]. Cuando emite el comando adjuntar, el terminal se conecta al proceso nginx.
Abra la dirección 127.0.0.1:8080 en su navegador y vea el resultado del proceso nginx en tiempo real.
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
Para obtener acceso a los registros del contenedor, le recomendamos que utilice el comando docker logs.
Para salir del contenedor sin detenerlo, use la combinación de teclas CTRL-p CTRL-q. Al presionar CTRL-c se detiene el contenedor.
Llevar una concha en un contenedor
El comando docker exec le permite ejecutar comandos dentro de un contenedor en ejecución.
Para ver cómo funciona y cómo usar el comando exec, inicie un nuevo contenedor. Usaremos la imagen oficial de MySQL:
docker container run --name my_mysql -d mysql
Esto creará un contenedor llamado " my_mysql ".
Para ejecutar un comando dentro del contenedor, ejecute el siguiente comando:
docker container exec -it my_mysql ls /var
La opción -i significa interactivo y -t le dice a Docker que asigne un pseudodispositivo TTY. El comando ls listará todos los archivos y directorios dentro del directorio /var del contenedor:
backups cache lib local lock log mail opt run spool tmp
Para introducir un shell en el contenedor, es decir, para entrar en el contenedor, inicie una nueva sesión de shell ejecutando el binario de shell. Puede usar sh, bash o cualquier otro shell incluido en la imagen.
El siguiente comando creará una nueva sesión de Bash dentro del contenedor:
docker container exec -it my_mysql /bin/bash
El símbolo del sistema cambiará, lo que indica que ahora está trabajando en el shell del contenedor.
Desde aquí, puede ejecutar comandos como lo haría en cualquier otro servidor Linux. Por ejemplo, para obtener una lista de las variables de entorno actuales, escriba env:
env
La salida se verá así:
HOSTNAME=r847dj4hb9fr
MYSQL_ROOT_PASSWORD=secret
PWD=/HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.17-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
Conclusión
Los comandos docker exec y docker attach le permiten conectarse a un contenedor en ejecución. Para obtener un shell interactivo en un contenedor, use el comando exec para iniciar una nueva sesión de shell. El comando adjuntar conecta la terminal a un contenedor en ejecución.