Los contenedores Docker proporcionan entornos aislados para ejecutar aplicaciones, garantizando la coherencia y la portabilidad. Al trabajar con contenedores Docker, es crucial poder inspeccionar y conectarse a sus shells. Esto te permite ejecutar comandos, solucionar problemas y supervisar el comportamiento de los contenedores en tiempo real.

Este artículo explora cómo acceder a contenedores Docker locales y remotos para su mantenimiento y actualización.

Por Qué Necesitas Acceder a Tus Contenedores

Acceder a los contenedores es esencial para una gestión eficaz y la resolución de problemas en entornos en contenedores. Te permite analizar los registros y la información de tiempo de ejecución del contenedor e identificar y resolver errores fácilmente.

El acceso a los contenedores también te permite ejecutar comandos para actualizaciones rápidas de configuración, instalaciones de paquetes y otras tareas administrativas. Sin acceso, tendrías que reconstruir toda la imagen del contenedor con la configuración actualizada, lo que puede llevar mucho tiempo y ser ineficaz.

Los contenedores también deben poder comunicarse entre sí en un ecosistema de aplicaciones distribuidas. Así que necesitas acceso a los comandos de diagnóstico del contenedor y asegurarte de que la conectividad entre contenedores es saludable.

Aunque es posible acceder a los contenedores mediante el protocolo tradicional Secure Shell (SSH), Docker proporciona varios métodos integrados que te ayudan a ahorrar tiempo y aumentar la eficiencia. Entre ellos están:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

Cada método tiene sus casos de uso y ventajas específicas. Conocer el comando adecuado para tu caso de uso puede ayudarte a optimizar tu enfoque.

Cómo y Por Qué Utilizar docker exec

docker exec te permite acceder a la sesión shell de un contenedor en ejecución y ejecutar comandos sin necesidad de iniciar una nueva instancia. Ten en cuenta que este comando no es persistente, lo que significa que no se volverá a ejecutar si el contenedor se apaga o se reinicia.

Para acceder a un contenedor en ejecución, necesitas su nombre o ID (puedes obtenerlo ejecutando docker ps -a). A continuación, introdúcelo en el siguiente comando:

docker exec -it  /bin/bash

El comando docker exec ejecutado en el terminal para generar un shell bash dentro de un contenedor.
Acceder a un contenedor con docker exec

Cómo y Por Qué Utilizar docker run

El comando docker run te permite iniciar un nuevo contenedor y acceder inmediatamente a su shell. Por defecto, este contenedor no se adjunta a tu sesión de shell actual, pero puedes adjuntarlo utilizando la opción -it.

El siguiente comando te permite iniciar un nuevo contenedor, adjuntarlo a tu sesión de shell actual y generar un shell bash:

docker run -it  /bin/bash

El comando docker run se ejecuta en el terminal para iniciar un contenedor y generar un shell bash en él.
Acceder al contenedor con docker run.

Cómo y Por Qué Utilizar docker attach

El comando docker attach es útil para supervisar y depurar las operaciones de un contenedor. Te permite conectarte a un contenedor en ejecución y ver sus flujos estándar de entrada, salida y error en tiempo real.

Para utilizarlo, inicia tu contenedor utilizando docker run. Después, desconéctate de él pulsando Ctrl+P y Ctrl+Q. También puedes proporcionar la bandera -d para ese contenedor en su lugar.

Una vez que tengas tu contenedor ejecutándose en segundo plano, accede a él mediante el siguiente comando:

docker attach 

El docker attach ejecutado en el terminal para acceder a un contenedor.
Utilizar docker attach para acceder a un contenedor.

Cómo y Por Qué Utilizar Docker Compose

Docker Compose te permite crear y ejecutar aplicaciones Docker multicontenedor. Puedes utilizarlo para definir los servicios que componen tu aplicación en un archivo YAML, y luego utilizar ese archivo para iniciar y gestionar todos los contenedores juntos. Es adecuado para entornos de desarrollo y pruebas en los que necesitas poner en marcha rápidamente entornos complejos.

Para acceder a un contenedor específico que ya se esté ejecutando, ejecuta el siguiente comando docker compose, seguido del nombre del servicio y del comando que quieras ejecutar:

docker compose exec app /bin/bash

Este comando inicia un nuevo proceso dentro del contenedor que ejecuta el comando especificado. Puedes utilizarlo para ejecutar cualquier comando dentro del contenedor, incluidos los shells interactivos como bash.

Del mismo modo, si quieres iniciar un nuevo contenedor utilizando Docker Compose y obtener acceso inmediato a él, ejecuta el siguiente comando:

docker compose run app /bin/bash

Ten en cuenta que docker compose tiene dos sintaxis diferentes: docker-compose (versión 1) y code>docker compose (versión 2). La sintaxis de la versión 2 es más flexible y potente, por lo que se recomienda utilizarla siempre que sea posible.

Los comandos docker compose run y docker compose exec se ejecutan en el terminal para acceder a los contenedores.
Cómo utilizar Docker Compose para acceder a los contenedores

Cómo Añadir un Servidor SSH a tu Contenedor Docker

Añadir un servidor SSH a tu contenedor Docker te ayuda a gestionar y solucionar los problemas de tus aplicaciones en contenedores. Un servidor SSH te permite acceder remotamente y gestionar contenedores, ejecutar comandos e inspeccionar registros desde cualquier lugar.

Puedes añadir un servidor SSH incluyéndolo en tu Dockerfile antes de construir el contenedor, y luego conectándolo con un cliente SSH. También puedes añadir acceso SSH temporal generando un intérprete de comandos dentro de un contenedor en ejecución e instalando en él un servidor SSH.

Incluye un Servidor SSH al Construir tu Contenedor Docker

Cuando construyas un contenedor Docker, incluir un servidor SSH dentro del contenedor puede ser útil si deseas acceder a él mediante SSH de forma persistente. Permite el acceso remoto y la depuración del contenedor durante el desarrollo o la resolución de problemas. Incluir un servidor SSH dentro también te permite transferir archivos de forma segura hacia y desde el contenedor.

Para incorporar un servidor SSH en tiempo de construcción, haz algunos cambios en el Dockerfile del contenedor. Aquí tienes un ejemplo de Dockerfile que incluye un servidor SSH:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

Un comando SSH ejecutado en el terminal para acceder a un contenedor.
Contenedor Docker construido con un servidor SSH

Este código construye un contenedor con la última imagen de Debian e instala el servidor SSH. También crea un nuevo directorio para el servidor SSH y establece la contraseña de root y habilita el inicio de sesión de root a través de la configuración SSH.

Por último, expone el puerto 22, el puerto por defecto de SSH.

Para utilizar este Dockerfile, construye el contenedor utilizando el comando docker build, y luego ejecútalo utilizando docker run. Aquí tienes un ejemplo:

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

Este comando construye un contenedor utilizando el Dockerfile y lo etiqueta con el nombre ssh-container. Utiliza -d para ejecutar el contenedor en modo separado. A continuación, asigna el puerto 22 dentro del contenedor al puerto 2222 en la máquina host con -p.

Una vez que el contenedor se esté ejecutando, puedes acceder a él mediante SSH utilizando el comando ssh:

ssh root@localhost-p 2222

Cuando te pida la contraseña, escribe la contraseña que estableciste en el archivo YAML. En este caso, es «root123» Ahora estás conectado al servidor SSH que se ejecuta dentro del contenedor. Esto significa que puedes realizar una depuración remota o transferir archivos hacia y desde el contenedor.

Añadir Temporalmente un Servidor SSH a un Contenedor Docker en Ejecución

También puedes añadir un servidor SSH a un contenedor en ejecución utilizando el comando docker exec:

docker exec <container_name_or_id> /bin/bash

Una vez que hayas obtenido acceso al contenedor, instala el servidor OpenSSH e inicia el demonio SSH:

apt update && apt install openssh-server && /usr/sbin/openssh -D

Esto abre una nueva instancia del servidor SSH dentro del contenedor. Ahora estás preparado para conectarte a él utilizando un cliente SSH en tu máquina local.

Ten en cuenta que sólo puedes conectarte al contenedor mediante SSH si tú o tu equipo expusisteis el puerto SSH durante la fase de ejecución o construcción.

Conéctate al Servidor SSH de Tu Contenedor

Empieza por identificar la dirección IP o el nombre de host del contenedor desde tu plataforma o servicio de gestión de contenedores.

Para conectarte a la dirección IP, utiliza el comando ssh:

ssh [username]@[container-ip-address]

Cuando se te solicite, introduce la contraseña del nombre de usuario especificado. En lugar de una contraseña, algunos servidores SSH pueden utilizar seguridad basada en claves.

Ahora deberías tener una sesión de terminal remota conectada al contenedor.

Resumen

A medida que Docker se hace cada vez más popular, es importante poder inspeccionar los contenedores que se ejecutan en tu entorno. Esta funcionalidad te permite diagnosticar y resolver problemas durante el desarrollo.

Docker también proporciona un versátil conjunto de comandos integrados para diversas tareas de desarrollo. Puedes utilizar estos comandos para agilizar tu flujo de trabajo sin necesidad de recurrir a los métodos tradicionales de SSH.

Echa un vistazo a Kinsta para alojar tus aplicaciones, sitios web WordPress o bases de datos. Con Kinsta, dispones de un alojamiento rápido y seguro, con tus proyectos desplegados en una infraestructura construida sobre la Red de Nivel Premium y las Máquinas C2 de Google Cloud Platform. Elige entre los 37 centros de datos y una CDN habilitada para HTTP/3 con 260+ PoPs. Mantente seguro con la tecnología de contenedores aislados, dos potentes cortafuegos y la protección DDoS avanzada de Cloudflare. Y puedes integrar aplicaciones o automatizar flujos de trabajo con la API de Kinsta.

Marcia Ramos Kinsta

I'm the Editorial Team Lead at Kinsta. I'm a open source enthusiast and I love coding. With more than 7 years of technical writing and editing for the tech industry, I love collaborating with people to create clear and concise pieces of content and improve workflows.