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

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

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

Я бы скорее не настройте и создайте контейнер с сервисом openssh, если это возможно.

9 ответов


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

docker exec -it [container-id] bash

вы должны использовать инструмент Жерома Петаццони под названием "nsenter" для ввода контейнера без использования SSH. Смотри:https://github.com/jpetazzo/nsenter

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

затем используйте команду docker-enter <container-id> для входа в контейнер.


обновление

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

update to the /etc/default/docker file

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

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

источник

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


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

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

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

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

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

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


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

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

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

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

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

$ docker attach {container id}

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

docker ps

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

КОМАНДА CONTAINER ID IMAGE СОЗДАЛА ИМЕНА ПОРТОВ СОСТОЯНИЯ

1170fe9e9460 локальный хост: 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


путь "nsinit":

установить nsinit

git clone git@github.com: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

Я запустил powershell на работающем демоне microsoft / iis используя

docker exec -it <nameOfContainer> powershell

docker exec -t -i container_name /bin/bash

приведет вас к консоли контейнеров.