Как войти в контейнер 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 перед перезапуском демона (я сделал это, перезагрузив хост).
это все потому, что...
...он [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
, который является устаревшим.
Найдите полный идентификатор контейнера
Введите команду lxc attach.
Вверху показан мой процесс 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