У меня есть контейнер, который запускает службу Apache на переднем плане. Я хотел бы иметь возможность получить доступ к контейнеру из другой оболочки, чтобы "покопаться" в нем и изучить файлы. В настоящий момент, если я присоединяюсь к контейнеру, я остаюсь, глядя на демона Apache, и не могу выполнять какие-либо команды.
Можно ли прикрепить другой tty к работающему контейнеру? Возможно, я могу воспользоваться тем фактом, что Docker на самом деле просто оборачивается вокруг контейнеров LXC? Я пытался, sudo lxc-console -n [container-id] -t [1-4]
но кажется, что доступен только один tty, и именно он запускает демон apache. Возможно, есть способ включить несколько консолей lxc во время сборки?
Я бы предпочел не конфигурировать и не собирать контейнер с сервисом openssh, если это возможно.
docker attach [conainer-id]
?Ответы:
В докере 1.3 появилась новая команда
docker exec
. Это позволяет вам ввести работающий докер:источник
exec
это не действует как обычный терминал. Например, вы не можете изменить пользователя один раз внутри контейнера.su someuser
для смены пользователя. Запуск Docker 1.4.1docker exec -it
что в конечном итоге предоставит полнофункциональный псевдотерминал, но на данный момент (Docker версия 1.9.1) есть некоторые недостатки: github.com/docker/docker/issues/8755Вы должны использовать инструмент Жерема Петаццони под названием «nsenter», чтобы войти в контейнер без использования SSH. Смотрите: https://github.com/jpetazzo/nsenter
Установить с помощью просто запущенного:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
Затем используйте команду
docker-enter <container-id>
для входа в контейнер.источник
docker exec
. Это позволяет вам войти в работающий докер:docker exec -it <container-id> bash
(см. Мой ответ ниже)docker-enter
еще существует? Это дает мнеcommand not found
.Обновить
Начиная с docker 0.9, для выполнения описанных ниже шагов необходимо обновить
/etc/default/docker
файл с'-e lxc'
параметром запуска демона docker перед перезапуском демона (я сделал это путем перезагрузки хоста).Это все потому что ...
источник
Обратите внимание, что это предотвратит « работу» дополнительной функции новой сети для хоста в Docker 0.11, и вы увидите только петлевой интерфейс. отчет об ошибке
Оказывается, что решение другого вопроса было также решением этого:
Обновление: вам скоро нужно будет использовать
ps --no-trunc
вместоps -notrunc
которого устарела.Найти полный идентификатор контейнера
Введите команду lxc attach.
Вверху показан мой процесс apache, запущенный этим докером.
источник
Первый шаг получить идентификатор контейнера:
docker ps
Это покажет вам что-то вроде
1170fe9e9460
является идентификатором контейнера в этом случае.Во-вторых , введите докер:
docker exec -it [container_id] bash
так в приведенном выше случае:
docker exec -it 1170fe9e9460 bash
источник
Как насчет запуска tmux / GNU Screen внутри контейнера? Кажется, более простой способ получить доступ к как можно большему количеству vty с помощью простого:
источник
docker attach
и я указал, что:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
nsenter
делает это Однако мне также нужно было ввести контейнер простым способом, и nsenter не хватило для моих нужд. В некоторых случаях это было ошибкой (черный экран плюс флаг -wd не работает). Кроме того, я хотел войти как конкретный пользователь и в определенном каталоге.Я закончил тем, что сделал свой собственный инструмент для ввода контейнеров. Вы можете найти его по адресу: https://github.com/Pithikos/docker-enter
Его использование так же просто, как
источник
Способ "nsinit" это:
установить nsinit
изнутри контейнера:
снаружи:
используй это
источник
Отведу вас к консоли контейнеров.
источник
источник
Я запустил PowerShell на работающем Microsoft / IIS запустить как демон, используя
источник
На 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 {идентификатор контейнера} sh "
вола !! Вы сейчас внутри терминала.
источник