Как мне попасть в оболочку контейнера Docker?

Я начинаю работать с Докером. Я использую базовое изображение WordPress и компоновку докеров.

Я пытаюсь ssh в один из контейнеров, чтобы проверить файлы/каталоги, созданные во время начальной сборки. Я попытался запустить docker-compose run containername ls -la, но это ничего не делало. Даже если бы это было так, я бы предпочел иметь консоль, где я могу пересекать структуру каталогов, а не запускать одну команду. Каков правильный способ сделать это с помощью Docker?

Ответы

Ответ 1

docker attach позволит вам подключиться к контейнеру Docker, но это не то же самое, что и ssh. Если в вашем контейнере работает веб-сервер, например, docker attach, вероятно, подключит вас к этапу процесса веб-сервера. Это не обязательно даст вам оболочку.

Команда docker exec вероятно, вы ищете; это позволит вам запускать произвольные команды внутри существующего контейнера. Например:

docker exec -it <mycontainer> bash

Конечно, любая команда, которую вы запускаете, должна существовать в файловой системе контейнера.

В приведенной выше команде <mycontainer> указано имя или идентификатор целевого контейнера. Неважно, используете ли вы docker compose; просто запустите docker ps и используйте либо ID (шестнадцатеричная строка, отображаемая в первом столбце), либо имя (отображается в последнем столбце). Например, учитывая:

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

Я могу бежать:

$ 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

Я мог бы выполнить то же самое, выполнив:

$ docker exec -it d2d4a89aaee9 ip addr

Аналогично, я мог бы запустить оболочку в контейнере;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

Ответ 2

Чтобы попасть в запущенный контейнер, введите следующее:

docker exec -t -i container_name /bin/bash

Ответ 3

Допустим, по вашим собственным причинам вы действительно хотите использовать SSH. Требуется несколько шагов, но это может быть сделано. Вот команды, которые вы запускаете внутри контейнера для его настройки...

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)

Теперь вы даже можете запускать графические приложения (если они установлены в контейнере), используя перенаправление X11 на клиент SSH:

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

Вот некоторые связанные ресурсы:

Ответ 4

Обратите внимание: этот ответ поддерживает инструмент, который я написал.

Я создал контейнерный SSH-сервер, который можно "привязать" к любому работающему контейнеру. Таким образом, вы можете создавать композиции с каждым контейнером. Единственным требованием является наличие в контейнере Bash.

В следующем примере запускается SSH-сервер, подключенный к контейнеру с именем "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

Когда вы подключаетесь к этой службе SSH (с вашим выбранным SSH-клиентом), сеанс Bash будет запущен в контейнере с именем "my-container".

Для получения дополнительных указателей и документации см.: https://github.com/jeroenpeeters/docker-ssh

Ответ 5

Если вы ищете Docker Compose-специфичный ответ, как я, он обеспечивает простой способ без необходимости поиска сгенерированного идентификатора контейнера.

docker-compose exec принимает имя службы в соответствии с вашим файлом docker-compose.yml.

Итак, чтобы получить оболочку Bash для вашего "веб-сервиса", вы можете:

$ docker-compose exec web bash

Ответ 6

SSH в контейнер Docker, используя следующую команду:

sudo docker exec -i -t (container ID) bash

Ответ 7

Если вы используете Docker в Windows и хотите получить доступ к оболочке контейнера, используйте это:

winpty docker exec -it <container_id> sh

Скорее всего, у вас уже установлен Git Bash. Если вы этого не сделаете, обязательно установите его.

Ответ 8

В некоторых случаях ваш образ может быть основан на альпийском стиле. В этом случае он будет бросать:

Не удалось выполнить runtime exec OCI: exec failed: container_linux.go: 348: запуск процесса контейнера вызвал "exec: \" bash \: исполняемый файл не найден в $ PATH ": неизвестно

Потому что /bin/bash не существует. Вместо этого вы должны использовать:

docker exec -it 9f7d99aa6625 ash

или

docker exec -it 9f7d99aa6625 sh

Ответ 9

Если контейнер уже вышел (возможно, из-за какой-то ошибки), вы можете сделать

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

или же

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

или же

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

создать новый контейнер и вставить в него оболочку. Поскольку вы указали --rm, контейнер будет удален при выходе из оболочки.

Ответ 10

Чтобы подключиться к cmd в контейнере Windows, используйте

docker exec -it d8c25fde2769 cmd

Где d8c25fde2769 - идентификатор контейнера.

Ответ 11

РЕШЕНИЕ GOINSIDE

установите goinside командной строки goinside с помощью:

sudo npm install -g goinside

и зайдите внутрь контейнера докера с соответствующим размером терминала с:

goinside docker_container_name

старый ответ

Мы поместили этот фрагмент в ~/.profile:

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

Это не только позволяет каждому войти в рабочий контейнер:

goinside containername

Он также решает долговременную проблему с фиксированными размерами терминальных контейнеров Docker. Что очень раздражает, если вы сталкиваетесь с этим.

Также, если вы перейдете по ссылке, у вас также будет завершено выполнение команд для имен контейнеров вашего докера.

Ответ 12

Это просто !

Перечислите все ваши изображения Docker:

sudo docker images

В моей системе он показал следующий результат:

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

У меня есть два изображения Docker на моем ПК. Скажем, я хочу запустить первый.

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

Это даст вам управление терминалом контейнера. Теперь вы можете выполнять все типы операций оболочки внутри контейнера. Как и ls выведет все папки в корневой каталог файловой системы.

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

Ответ 13

Используйте эту команду:

docker exec -it containerid /bin/bash

Ответ 14

docker exec определенно будет решением. Легкий способ работы с запрошенным вопросом - это установить каталог внутри Docker в локальный системный каталог.

Чтобы вы могли мгновенно просмотреть изменения в локальном пути.

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

Ответ 15

Использование:

docker attach <container name/id here>

Другим способом, хотя и существует опасность для него, является использование attach, но если вы Ctrl + C выйдете из сеанса, вы также остановите контейнер. Если вы просто хотите посмотреть, что происходит, используйте 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)

Ответ 16

Чтобы проверить файлы, запустите docker run -it <image>/bin/bash чтобы получить интерактивный терминал. Список изображений можно получить с помощью docker images. В отличие от docker exec это решение работает также в случае, если изображение не запускается (или сразу после запуска завершается).

Ответ 17

Если у вас установлен Docker с Kitematic, вы можете использовать графический интерфейс. Откройте Kitematic из значка Docker и в окне Kitematic выберите свой контейнер, а затем нажмите значок exec.

В этом графическом интерфейсе вы также можете увидеть журнал контейнера и множество информации о контейнере (на вкладке настроек).

Select Kitematic from menu

Click on exec

Ответ 18

$ docker exec -it <Container-Id> /bin/bash

Или, в зависимости от оболочки, это может быть

$ docker exec -it <Container-Id> /bin/sh

Вы можете получить контейнер -i d с помощью команды docker ps

-i= интерактивный

-t= выделить псевдо -t TY

Ответ 19

В моем случае по какой-то причине я должен проверить всю информацию, касающуюся сети, в каждом контейнере. Таким образом, следующие команды должны быть действительными в контейнере...

ip
route
netstat
ps
...

Я проверил все эти ответы, ни один из них не помог мне. Я искал информацию на других сайтах. Я не добавлю здесь супер ссылку, так как она не написана на английском языке. Поэтому я просто выложил этот пост с кратким описанием для людей, которые предъявляют те же требования, что и я.

Скажем, у вас есть один работающий контейнер с именем light-test. Следуйте инструкциям ниже.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Эта команда получит ответ как /var/run/docker/netns/xxxx.
  • Затем ln -s/var/run/docker/netns/xxxx/var/run/netns/xxxx. Каталог может не существовать, сначала выполните mkdir/var/run/netns.
  • Теперь вы можете выполнить ip netns exec xxxx ip addr show чтобы исследовать сетевой мир в контейнере.

PS. xxxx - это всегда одно и то же значение, полученное от первой команды. И, конечно, любые другие команды являются действительными, т.е. ip netns exec xxxx netstat -antp|grep 8080.

Ответ 20

вы можете взаимодействовать с терминалом в Docker-контейнере, передав опцию -ti

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

-t обозначает терминал -i обозначает интерактивный

Ответ 21

Другой вариант - использовать nsenter.

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

Ответ 22

Если вы используете Docker Compose, это приведет вас в контейнер Docker.

docker-compose run container_name /bin/bash

Внутри контейнера он перенесет вас в WORKDIR, определенный в файле Docker. Вы можете изменить рабочий каталог на

WORKDIR directory_path # E.g  /usr/src -> container path

Ответ 23

Я создал функцию терминала для более легкого доступа к контейнерному терминалу. Может быть, это будет полезно и вам, ребята:

В результате вместо ввода:

docker exec -it [container_id] /bin/bash

ты напишешь:

dbash [container_id]

Поместите следующее в ваш ~/.bash_profile (или что-нибудь еще, что вам подходит), затем откройте новое окно терминала и наслаждайтесь сочетанием клавиш:

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

Ответ 24

Для докер-компоновки (Docker4Drupal)

docker-compose exec php bash

Я использую Docker для Drupal на ноутбуке Linux. После запуска контейнера я использую " docker-compose exec php bash " для соединения с контейнером, чтобы я мог запускать коммандос drush. Он отлично работает для меня.