it-roy-ru.com

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

Я начинаю работать с Докером. Я использую базовый образ WordPress и docker-compose.

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

730
Andrew

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

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

docker exec -it <mycontainer> bash

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

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

$ 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

Точно так же я мог бы запустить Shell в контейнере;

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

Чтобы добавить bash в работающий контейнер, введите:

docker exec -t -i container_name /bin/bash
227
Agustí Sánchez

Допустим, по вашим собственным причинам вы действительно хотите использовать 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

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

67
nobar

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

Я создал контейнерный 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

19
Jeroen Peeters

SSH в Docker-контейнер с помощью этой команды:

Sudo docker exec -i -t (container ID) bash
14
Tjs

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

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

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

$ docker-compose exec web bash
14
bcmcfc

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

winpty docker exec -it <container_id> sh

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

11
Cosmin Ababei

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

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

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

docker exec -it 9f7d99aa6625 ash

или же

docker exec -it 9f7d99aa6625 sh
7
Deoxyseia

Это просто !

Перечислите все ваши изображения 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

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

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

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 . Что очень раздражает, если вы сталкиваетесь с этим.

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

5
Soorena

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

docker exec -it d8c25fde2769 cmd

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

5
Aqeel Qureshi

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

docker exec -it containerid /bin/bash
4
Admin Hack

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

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)
4
rbrooker

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

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

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

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

3
igo

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

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

 Select Kitematic from menu

 Click on exec

3
Alireza Fattahi

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

$ 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, контейнер будет удален при выходе из командной консоли.

2
user674669

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

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

1
Light.G

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

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

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

1
Alwin

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

docker-compose run container_name /bin/bash

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

WORKDIR directory_path # E.g  /usr/src -> container's path
0
Sivakumar

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

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

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

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

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

Вы можете получить container-Id с помощью команды docker ps

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

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

0
Ashutosh Chamoli