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



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



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



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

696   9  

9 ответов:

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

docker exec -it [container-id] bash

вы должны использовать инструмент Жером Petazzoni называется '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 от "работы", и вы увидите только интерфейс обратной связи. сообщить об ошибке


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

...вы можете использовать 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 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

способ "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

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

docker exec -it <nameOfContainer> powershell
docker exec -t -i container_name /bin/bash

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

Comments

    Ничего не найдено.