Как войти в 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>
войти в контейнер.
Обновить
Начиная с версии 0.9, для того, чтобы шаги, описанные ниже, теперь работали, нужно обновить /etc/default/docker
файл с '-e lxc'
до опции запуска демона docker перед перезапуском демона (я сделал это путем перезагрузки хоста).
Это все потому что...
... он [docker 0.9] содержит новую абстракцию "движка двигателя", позволяющую использовать другие API, кроме LXC, для запуска контейнеров. Он также предоставляет новый драйвер движка на основе новой библиотеки API (libcontainer), которая может обрабатывать группы управления без использования инструментов LXC. Основная проблема заключается в том, что если вы полагаетесь на lxc-attach для выполнения действий над вашим контейнером, таких как запуск оболочки внутри контейнера, что безумно полезно для среды разработки...
Обратите внимание, что это предотвратит " работу" дополнительной функции новой сети для хоста в Docker 0.11, и вы увидите только интерфейс обратной связи. сообщение об ошибке
Оказывается, что решение другого вопроса было также решением этого:
... вы можете использовать докер
ps -notrunc
чтобы получить полный идентификатор контейнера lxc, а затем использоватьlxc-attach -n <container_id>
запустите bash в этом контейнере от имени root.
Обновление: вам скоро нужно будет использовать ps --no-trunc
вместо ps -notrunc
который осуждается.
Найти полный идентификатор контейнера
Введите команду lxc attach.
Вверху показан мой процесс apache, запущенный этим докером.
Остановка докера
запуск докера -i имя_контейнера
Это работало для меня в терминале удаленного входа в Ubuntu
Первый шаг получить идентификатор контейнера:
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
Как насчет запуска tmux/GNU Screen внутри контейнера? Кажется, более простой способ получить доступ к как можно большему количеству vty с помощью простого:
$ docker attach {container id}
nsenter
делает это Однако мне также нужно было ввести контейнер простым способом, и nsenter не хватило для моих нужд. В некоторых случаях это было ошибкой (черный экран плюс флаг -wd не работает). Кроме того, я хотел войти как конкретный пользователь и в определенном каталоге.
Я закончил тем, что сделал свой собственный инструмент для ввода контейнеров. Вы можете найти его по адресу: https://github.com/Pithikos/docker-enter
Его использование так же просто, как
./docker-enter [-u <user>] [-d <directory>] <container ID>
docker exec -t -i container_name /bin/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
В Windows 10 у меня установлен докер. Я запускаю Jnekins в контейнере и обнаружил то же сообщение об ошибке. Вот пошаговое руководство по решению этой проблемы:
Шаг 1: Откройте gitbash и запустите docker run -p 8080:8080 -p 50000:50000 jenkins.
Шаг 2: Откройте новый терминал.
Шаг 3: Выполните "docker ps", чтобы получить список запущенных контейнеров. Скопируйте идентификатор контейнера.
Шаг 4. Теперь, если вы выполните команду "docker exec -it {container id} sh" или "docker exec -it {container id} bash", вы получите сообщение об ошибке, подобное тому, что "устройство ввода не является TTY. Если вы используя mintty, попробуйте поставить перед командой префикс 'winpty'"
Шаг 5: Выполните команду " $winpty docker exec -it {container id} sh"
вола!! Теперь вы внутри терминала.