Как получить доступ к виртуальной машине, созданной докером 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 года.

Другие вопросы по тегам