¿Cómo entro en un contenedor Docker?


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

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

Author: Peter Mortensen, 2015-05-11

20 answers

docker attach le permitirá conectarse a su contenedor Docker, pero esto no es realmente lo mismo que ssh. Si su contenedor está ejecutando un servidor web, por ejemplo, docker attach probablemente lo conectará al stdout del proceso del servidor web. No necesariamente te dará un caparazón.

El comando docker exec es probablemente lo que está buscando; esto le permitirá ejecutar comandos arbitrarios dentro de un contenedor existente. Por ejemplo:

docker exec -it <mycontainer> bash

Por supuesto, cualquiera que sea tu orden la ejecución debe existir en el sistema de archivos contenedor.

En el comando anterior <mycontainer> está el nombre o ID del contenedor de destino. No importa si está usando docker compose o no; simplemente ejecute docker ps y use el ID (una cadena hexadecimal que se muestra en la primera columna) o el nombre (que se muestra en la columna final). Por ejemplo, dado:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

Puedo ejecutar:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Podría lograr lo mismo corriendo: {[15]]}

$ docker exec -it d2d4a89aaee9 ip addr

Del mismo modo, podría iniciar un shell en el contenedor;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
 971
Author: larsks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 16:44:52

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

docker exec -t -i container_name /bin/bash
 193
Author: Agustí Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-11 01:34:24

Digamos que, por razones que son tuyas, realmente quieres usar SSH. Toma unos pocos pasos, pero se puede hacer. Aquí están 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) usando el reenvío X11 al cliente SSH:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

Aquí hay algunos recursos relacionados:

 60
Author: nobar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 13:16:07

Aviso: esta respuesta promueve una herramienta que he escrito.

He creado un servidor SSH en contenedores que puedes 'pegar' a cualquier contenedor en ejecución. De esta manera puede 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 conecta a este servicio SSH (con su cliente SSH de su elección) una sesión Bash será iniciado en el contenedor con el nombre 'my-container'.

Para más punteros y documentación ver: https://github.com/jeroenpeeters/docker-ssh

 16
Author: Jeroen Peeters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 19:19:09

SSH en un contenedor Docker usando este comando:

sudo docker exec -i -t (container ID) bash
 13
Author: Tjs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 19:19:28

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

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

Así que para obtener un shell Bash para su servicio 'web', puede hacer:

$ docker-compose exec web bash
 11
Author: bcmcfc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:34:33

Si está usando 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 tengas Git Bash instalado. Si no lo hace, asegúrese de instalarlo.

 9
Author: Cosmin Ababei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 09:04:32

Para conectarse a cmd en un contenedor de Windows, utilice

docker exec -it d8c25fde2769 cmd

Donde d8c25fde2769 es el id del contenedor.

 5
Author: Aqeel Qureshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 13:38:50

docker exec definitivamente será una solución. Una manera fácil de trabajar con la pregunta que ha hecho es mediante el montaje del directorio dentro de Docker en el directorio del sistema local.

Para que pueda ver los cambios en la ruta local al instante.

docker run -v /Users/<path>:/<container path> 
 4
Author: Pratik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 19:17:53

Uso:

docker attach <container name/id here>

La otra manera, aunque hay un peligro, es usar attach, pero si Ctrl + C para salir de la sesión, también detendrá el contenedor. Si solo quieres ver lo que está sucediendo, usa docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)
 4
Author: rbrooker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 13:34:48

En algunos casos, su imagen puede estar basada en Alpinos. En este caso lanzará:

OCI runtime exec failed: exec failed: container_linux.go: 348: inicio proceso contenedor causado "exec: \" bash\": archivo ejecutable no encontrado en PATH PATH": unknown

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

docker exec -it 9f7d99aa6625 ash

O

docker exec -it 9f7d99aa6625 sh
 4
Author: Deoxyseia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:51:29

Para inspeccionar archivos, ejecute docker run -it <image> /bin/bash para obtener un terminal interactivo. La lista de imágenes se puede obtener por docker images. Al contrario 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).

 3
Author: igo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 13:44:09

Es simple!

Enumere todas sus imágenes de Docker:

sudo docker images

En mi sistema mostraba la siguiente salida:

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

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

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

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

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
 3
Author: Patel Sunil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:54:01

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

También puede ver el registro del contenedor y mucha información del contenedor (en la pestaña configuración) en esta interfaz gráfica.

Seleccionar Kitematic desde el menú

Haga clic en exec

 2
Author: Alireza Fattahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:52:43

SOLUCIÓN DE GOINSIDE

Instalar goinside herramienta de línea de comandos con:

sudo npm install -g goinside

E ir dentro de un contenedor docker con un tamaño de terminal adecuado con:

goinside docker_container_name

Antigua respuesta

Hemos puesto este fragmento en ~/.profile:

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

Esto no solo hace que todos puedan entrar en un contenedor en ejecución con:

goinside containername

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

También si sigues el enlace también tendrás completado el comando para los nombres de los contenedores de docker.

 2
Author: Soorena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-13 09:58:06

Use este comando:

docker exec -it containerid /bin/bash`
 1
Author: Admin Hack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:54:18

Otra opción es usar nsenter.

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
 0
Author: xuhdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 19:09:58

Si está utilizando Docker Compose, esto lo llevará dentro de un contenedor Docker.

docker-compose run container_name /bin/bash

Dentro del contenedor le llevará a WORKDIR definido en el Dockerfile. Puede cambiar su directorio de trabajo por

WORKDIR directory_path # E.g  /usr/src -> container's path
 0
Author: Sivakumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 18:47:32

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

ip
route
netstat
ps
...

Revisé todas estas respuestas, no son válidas 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 poner este post con la solución de resumen para las personas que tienen el mismo requisito que yo.

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

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Este comando obtendrá una 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 red en contenedor.

PS. xxxx es siempre el mismo valor obtenido a través del primer comando. Y por supuesto, cualquier otro comando es válido, es decir, ip netns exec xxxx netstat -antp|grep 8080.

 0
Author: Light.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 05:08:29

Para docker-compose up (Docker4Drupal)

docker-compose exec php bash

Utilizo Docker para Drupal en un portátil Linux. Después de ejecutar el contenedor utilizo ' docker-compose exec php bash' para conectarme con el contenedor para poder ejecutar comandos drush. Funciona bien para mí.

 -3
Author: illutek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 13:41:43