Ответ 1
С docker 1.3 появилась новая команда docker exec
. Это позволяет ввести запущенный докер:
docker exec -it [container-id] bash
У меня есть контейнер, на котором запущена служба Apache на переднем плане. Я хотел бы иметь доступ к контейнеру из другой оболочки, чтобы "совать" внутри него и исследовать файлы. На данный момент, если я прикрепляюсь к контейнеру, я остаюсь смотреть на демон Apache и не могу выполнять никаких команд.
Можно ли подключить другой tty к запущенному контейнеру? Возможно, я могу воспользоваться тем фактом, что Docker на самом деле просто обертывает контейнеры LXC? Я пробовал sudo lxc-console -n [container-id] -t [1-4]
, но оказалось, что доступно только одно tty, и это тот, который запускает демон apache. Возможно, есть способ включить несколько консолей lxc во время сборки?
Я бы предпочел не настроить и создать контейнер с помощью службы openssh, если это возможно.
С docker 1.3 появилась новая команда docker exec
. Это позволяет ввести запущенный докер:
docker exec -it [container-id] bash
Вам нужно использовать инструмент Jérôme Petazzoni под названием 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'
до запуска запуска док-станции до перезапуска демона (я сделал это, перезагрузив хост),
Это все потому, что...
... it [docker 0.9] содержит новую абстракцию "драйвер двигателя", чтобы сделать возможным использование другого API, чем LXC для запуска контейнеров. Он также драйвер на основе новой библиотеки API (libcontainer), которая способна для управления группами управления без использования инструментов LXC. Основная проблема что, если вы полагаетесь на lxc-attach для выполнения действий на вашем контейнер, например, запуск оболочки внутри контейнера, который безумно полезный для среды разработки...
Обратите внимание, что это предотвратит создание новой хост-сети только дополнительной функции докера 0.11 от "работы", и вы увидите только loopback интерфейс. отчет об ошибке
Оказывается, что решение другого вопроса было также решением этого:
... вы можете использовать docker
ps -notrunc
, чтобы получить полный идентификатор контейнера lxc и затем используйтеlxc-attach -n <container_id>
запустите bash в этом контейнере как корень.
Обновление: Вам скоро нужно будет использовать ps --no-trunc
вместо 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
Это покажет вам что-то вроде
КОНТЕЙНЕР 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
Способ "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 в качестве демона используя
docker exec -it <nameOfContainer> powershell
docker exec -t -i container_name /bin/bash
Откроет консоль контейнеров.
остановка докера
запуск докера -i имя_ контейнера
Это работало для меня в терминале удаленного входа в Ubuntu