tag - imagenes docker




¿Cómo me meto en la carcasa de un contenedor Docker? (16)

Estoy empezando a trabajar con Docker. Estoy usando la imagen base de WordPress y docker-compose.

Estoy tratando de ingresar a uno de los contenedores para inspeccionar los archivos / directorios que se crearon durante la compilación inicial. Intenté ejecutar docker-compose run containername ls -la , pero eso no hizo nada. Incluso si lo hiciera, prefiero tener una consola donde pueda atravesar la estructura del directorio, en lugar de ejecutar un solo comando. ¿Cuál es la forma correcta de hacer esto con Docker?


Solución interior

instale la herramienta de línea de comando goinside con:

sudo docker images

e ingrese a un contenedor acoplable con un tamaño de terminal adecuado con:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

vieja respuesta

Hemos puesto este fragmento en ~/.profile :

sudo docker run -i -t ubuntu:latest /bin/bash

Esto no solo hace que todos puedan ingresar a un contenedor con:

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

También resuelve un problema de larga duración sobre los tamaños fijos de terminales de contenedores Docker . Lo cual es muy molesto si lo enfrentas.

Además, si sigue el enlace, también tendrá que completar el comando para los nombres de los contenedores de la ventana acoplable.


Digamos que, por razones que son propias, realmente desea utilizar SSH. Toma unos pocos pasos, pero se puede hacer. Estos son los comandos que ejecutaría dentro del contenedor para configurarlo ...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

Ahora incluso puede ejecutar aplicaciones gráficas (si están instaladas en el contenedor) utilizando el reenvío X11 al cliente SSH:

ssh -X [email protected]
xeyes ## run an X11 demo app in the client

Aquí hay algunos recursos relacionados:


En algunos casos, su imagen puede estar basada en Alpine. En este caso arrojará:

OCI runtime exec falló: exec falló: container_linux.go: 348: el proceso de inicio del contenedor causó "exec: \" bash \ ": archivo ejecutable no encontrado en $ PATH": desconocido

Porque /bin/bash no existe. En lugar de esto, debes usar:

docker exec -it 9f7d99aa6625 ash

o

docker exec -it 9f7d99aa6625 sh

En mi caso, por alguna razón, necesito verificar toda la información involucrada en la red en cada contenedor. Por lo tanto, los siguientes comandos deben ser válidos en un contenedor ...

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}

Revisé todas estas respuestas, ninguna fue útil para mí. He buscado información en otros sitios web. No agregaré un súper enlace aquí, ya que no está escrito en inglés. Así que acabo de publicar esta publicación con una solución de resumen para las personas que tienen los mismos requisitos que yo.

Digamos que tiene un contenedor en ejecución llamado prueba de luz. Sigue los pasos a continuación.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}} . Este comando recibirá respuesta como /var/run/docker/netns/xxxx .
  • Luego ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx . El directorio puede no existir, haga mkdir /var/run/netns primero.
  • Ahora puede ejecutar ip netns exec xxxx ip addr show para explorar el mundo de la red en el contenedor.

PD. xxxx es siempre el mismo valor recibido del primer comando. Y, por supuesto, cualquier otro comando es válido, es decir, ip netns exec xxxx netstat -antp|grep 8080 .


Otra opción es usar nsenter .

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

Para conectarse a cmd en un contenedor de Windows, use

docker exec -it d8c25fde2769 cmd

Donde d8c25fde2769 es la identificación del contenedor.


Para golpear en un contenedor en ejecución, escriba esto:

docker exec -t -i container_name /bin/bash

Para inspeccionar archivos, ejecute docker run -it <image> /bin/bash para obtener un terminal interactivo. La lista de imágenes se puede obtener mediante docker images . A diferencia de docker exec esta solución funciona también en caso de que una imagen no se inicie (o se cierre inmediatamente después de ejecutarse).


Si el contenedor ya ha salido (tal vez debido a algún error), puede hacer

$ docker run --rm -it --entrypoint /bin/ash image_name

o

$ docker run --rm -it --entrypoint /bin/sh image_name

o

$ docker run --rm -it --entrypoint /bin/bash image_name

para crear un nuevo contenedor y ponerle un caparazón. Como especificó --rm, el contenedor se eliminaría cuando salga del shell.


Si está buscando una respuesta específica de Docker Compose como yo, proporciona una manera fácil de ingresar sin tener que buscar la ID del contenedor generado.

docker-compose exec toma el nombre del servicio según su archivo docker-compose.yml .

Entonces, para obtener un shell Bash para su servicio 'web', puede hacer lo siguiente:

$ docker-compose exec web bash

Si está utilizando Docker en Windows y desea obtener acceso de shell a un contenedor, use esto:

winpty docker exec -it <container_id> sh

Lo más probable es que ya tenga instalado Git Bash . Si no lo hace, asegúrese de instalarlo.


Si tiene Docker instalado con Kitematic , puede usar la GUI. Abra Kitematic desde el icono de Docker y en la ventana de Kitematic seleccione su contenedor, y luego haga clic en el icono de exec .

También puede ver el registro del contenedor y mucha información del contenedor (en la pestaña de configuración) en esta GUI.


Utilizar:

docker exec -it containerid /bin/bash

La otra forma, aunque existe un peligro, es usar attach , pero si presiona Ctrl + C para salir de la sesión, también detendrá el contenedor. Si solo quiere ver lo que está sucediendo, use los docker logs -f .

docker run -v /Users/<path>:/<container path> 

puede interactuar con la terminal en el contenedor acoplable pasando la opción -ti

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t significa terminal -i significa interactivo


Aviso : esta respuesta promueve una herramienta que he escrito.

He creado un servidor SSH en contenedores que puede 'pegar' a cualquier contenedor en ejecución. De esta manera puedes crear composiciones con cada contenedor. El único requisito es que el contenedor tenga Bash.

El siguiente ejemplo iniciaría un servidor SSH conectado a un contenedor con el nombre 'my-container'.

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

Cuando se conecte a este servicio SSH (con su cliente SSH de elección), se iniciará una sesión Bash en el contenedor con el nombre 'my-container'.

Para obtener más sugerencias y documentación, consulte: https://github.com/jeroenpeeters/docker-ssh


Es simple !

Enumere todas sus imágenes de Docker:

sudo npm install -g goinside

En mi sistema mostró el siguiente resultado:

goinside docker_container_name

Tengo dos imágenes Docker en mi PC. Digamos que quiero ejecutar el primero.

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

Esto le dará el control terminal del contenedor. Ahora puede hacer todo tipo de operaciones de shell dentro del contenedor. Al igual que hacer ls generará todas las carpetas en la raíz del sistema de archivos.

goinside containername






docker-container