Как получить доступ к виртуальной машине, созданной докером HyperKit?
Docker для Mac использует виртуальную машину Linux, созданную HyperKit, для хранения и запуска контейнеров на Mac.
С помощью Docker Toolbox я могу просто открыть VirtualBox и получить доступ к виртуальной машине с докером. Но как получить доступ к виртуальной машине, созданной HyperKit, с помощью Docker для Mac?
6 ответов
Через некоторое время я нашел следующий способ получить оболочку виртуальной машины, созданной HyperKit:
Запустить из терминала:
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Вы увидите пустой экран, затем введите Enter, вы получите приглашение для входа в систему. Войти как , вы получите оболочку:root
и нажмите Enter, вы получите оболочку (без пароля)
Это немного нахально, но пока работает
(Сентябрь 2016 г.) (Сентябрь 2017 г.)
Mac OS High Sierra Docker версия 18.06.0-ce-mac70 (26399)
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
вместо
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Согласно этому комментарию к проблеме GitHub от сопровождающего Docker, рекомендуемый способ доступа к виртуальной машине - через привилегированный контейнер докеров.
Попробуйте войти в виртуальную машину: (я рекомендую это вместо использования экрана в TTY)
$ docker run -it --privileged --pid=host justincormack/nsenter1
Универсальный ответ на этот вопрос есть в Kubernetes in Action, 2nd Edition:
вы можете запустить специальный контейнер, настроенный на использование пространств имен виртуальной машины для запуска удаленной оболочки, что практически идентично использованию SSH для доступа к удаленному серверу. Чтобы запустить контейнер, выполните следующую команду:
docker run --net=host --ipc=host --uts=host --pid=host --privileged \
--security-opt=seccomp=unconfined -it --rm -v /:/host alpine chroot /host
Эта длинная команда требует пояснения:
- Контейнер создается из
alpine
изображение.- The
--net
,--ipc
,--uts
и--pid
флаги заставляют контейнер использовать пространства имен хоста вместо изолированной программной среды, а--privileged
и--security-opt
флаги предоставляют контейнеру неограниченный доступ ко всем системным вызовам.- The
-it
флаг запускает интерактивный режим контейнера, а--rm
flags гарантирует, что контейнер будет удален при его завершении.- The
-v
флаг монтирует корневой каталог хоста в/host
каталог в контейнере.chroot /host
Затем команда делает этот каталог корневым каталогом контейнера.
Я использую рабочий стол docker 4.7.1 на Mac. Как уже упоминалось, некоторые из предложенных выше хороших решений не работают на более новом рабочем столе Docker (ссылка tty отсутствует).
Я предпочитаю решение Smammy , которое не предполагает использование образа от непроверенного издателя (изображение: justincormack/nsenter1, хотя образ исходит от сопровождающего докера, а репозиторий имеет много звездочек), особенно когда ему нужно запустить докер с ' --привилегированный», который предоставляет докеру полный доступ к хост-компьютеру.
Это сработало для меня (используя образ busybox , который содержит утилиту nsenter):
docker run -it --rm --privileged --pid=host busybox nsenter -t1 -m -u -i -n
вы можете найти объяснение команды на
https://www.bretfisher.com/docker-for-mac-commands-for-getting-into-local-docker-vm/ (и аналогичное предложение, используя образ debian вместо busybox)
другое предложенное там решение (но менее удобное, так как в нем нет автодополнения) — использовать netcat
nc -U ~/Library/Containers/com.docker.docker/Data/debug-shell.sock
Фактически, ответ от augurar - единственный работающий с 2021 года, как говорит smammy , другие варианты устарели.
Так:
$ docker run -it --privileged --pid=host justincormack/nsenter1
был правильным ответом и работал у меня в MacOS Big Sur по состоянию на июль 2021 года.