Как войти в Docker-контейнер, уже запущенный с новым TTY

У меня есть контейнер, на котором запущена служба Apache на переднем плане. Я хотел бы иметь доступ к контейнеру из другой оболочки, чтобы "совать" внутри него и исследовать файлы. На данный момент, если я прикрепляюсь к контейнеру, я остаюсь смотреть на демон Apache и не могу выполнять никаких команд.

Можно ли подключить другой tty к запущенному контейнеру? Возможно, я могу воспользоваться тем фактом, что Docker на самом деле просто обертывает контейнеры LXC? Я пробовал sudo lxc-console -n [container-id] -t [1-4], но оказалось, что доступно только одно tty, и это тот, который запускает демон apache. Возможно, есть способ включить несколько консолей lxc во время сборки?

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

Ответы

Ответ 1

С docker 1.3 появилась новая команда docker exec. Это позволяет ввести запущенный докер:

docker exec -it [container-id] bash

Ответ 2

Вам нужно использовать инструмент Jérôme Petazzoni под названием nsenter для входа в контейнер без использования SSH. См.: https://github.com/jpetazzo/nsenter

Установить с простым запуском: docker run -v /usr/local/bin:/target jpetazzo/nsenter

Затем используйте команду docker-enter <container-id>, чтобы войти в контейнер.

Ответ 3

Обновление

Как и в случае докера 0.9, для выполнения следующих шагов теперь нужно обновить файл /etc/default/docker с помощью '-e lxc' до запуска запуска док-станции до перезапуска демона (я сделал это, перезагрузив хост),

update to the /etc/default/docker file

Это все потому, что...

... it [docker 0.9] содержит новую абстракцию "драйвер двигателя", чтобы сделать возможным использование другого API, чем LXC для запуска контейнеров. Он также драйвер на основе новой библиотеки API (libcontainer), которая способна для управления группами управления без использования инструментов LXC. Основная проблема что, если вы полагаетесь на lxc-attach для выполнения действий на вашем контейнер, например, запуск оболочки внутри контейнера, который безумно полезный для среды разработки...

источник

Обратите внимание, что это предотвратит создание новой хост-сети только дополнительной функции докера 0.11 от "работы", и вы увидите только loopback интерфейс. отчет об ошибке


Оказывается, что решение другого вопроса было также решением этого:

... вы можете использовать docker ps -notrunc, чтобы получить полный идентификатор контейнера lxc и затем используйте lxc-attach -n <container_id> запустите bash в этом контейнере как корень.

Обновление: Вам скоро нужно будет использовать ps --no-trunc вместо ps -notrunc, который устарел.

enter image description here Найти полный идентификатор контейнера

enter image description here Введите команду lxc attach.

enter image description here Вверх показывает мой процесс apache, запускающий докер.

Ответ 4

nsenter делает это. Однако мне также нужно было ввести контейнер в простой способ, и nsenter недостаточно для моих нужд. В некоторых случаях это было ошибкой (черный экран плюс флаг -wd не работал). Кроме того, я хотел зарегистрироваться в качестве конкретного пользователя и в определенном каталоге.

В итоге я создал свой собственный инструмент для ввода контейнеров. Вы можете найти его по адресу: https://github.com/Pithikos/docker-enter

Его использование так же просто, как

./docker-enter [-u <user>] [-d <directory>] <container ID>

Ответ 5

Как насчет запуска экрана tmux/GNU в контейнере? Кажется, что более плавный способ доступа к большому количеству vty, который вам нужен, простым:

$ docker attach {container id}

Ответ 6

Первый шаг получить идентификатор контейнера:

docker ps

Это покажет вам что-то вроде

КОНТЕЙНЕР ID ИМИДЖ КОМАНДА СОЗДАНА СТАТУС ИМЕНА ПОРТОВ

1170fe9e9460 localhost: 5000/python: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" 26 секунд назад вверх 25 секунд 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0

1170fe9e9460 - это идентификатор контейнера в этом случае.

Во-вторых, введите докер:

docker exec -it [container_id] bash

так в приведенном выше случае: docker exec -it 1170fe9e9460 bash

Ответ 7

Способ "nsinit":

установить nsinit

git clone [email protected]:dotcloud/docker.git
cd docker
make shell

внутри контейнера:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

извне:

docker cp id_docker_container:/go/bin/nsinit /root/

используйте его

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

Ответ 8

Я запустил powershell на запущенном запуске microsoft/iis в качестве демона используя

docker exec -it <nameOfContainer> powershell

Ответ 9

docker exec -t -i container_name /bin/bash

Откроет консоль контейнеров.

Ответ 10

остановка докера

запуск докера -i имя_ контейнера

Это работало для меня в терминале удаленного входа в Ubuntu