The Darkest Library

[RU] Перенос Docker Desktop с Windows-хоста внутрь VMWare

Мотивация

Устали от Docker Desktop? Будет вам Windows 10/11 или Windows Server 2022, с установленной VMWare Workstation, внутри неё — Hyper-V, внутри неё — Docker Desktop или Docker Engine, а внутри него… ну, вероятно, смерть Кощеева.

Зачем это нужно автору статьи? По работе мне нужно делать скринкасты и презентации. Клиенты пользуются докером на Windows. Значит, и мне нужно показывать всё на нём! С другой стороны, Docker Desktop требует обязательного Hyper-V всей системы, что её затормаживает и делает невозможной нормальную работу с другими виртуализаторами типа VMWare Workstation. С десктопным Linux у Hyper-V всё плохо, графический интерфейс такой, что лучше бы его не было, и т.п.

В этом посте вас ждёт точное описание действий по избавлению от Docker Desktop на своей машине и переносу его под nested virtualization.

Удаление Docker Desktop (Windows 10/11)

Он всё равно существует только на дестопе, поэтому удалить проще в графическом режиме, из админки Apps and Features.

Удаляем Hyper-V

В эскалированном Power Shell выполните:

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
DISM /Online /Disable-Feature:Microsoft-Hyper-V
bcdedit /set hypervisorlaunchtype off

Свершилось! Зло повержено!

Установите VMWare Workstation Pro

Купить за 200 баксов и скачать можно на официальном сайте.

Создайте новую VM

Создайте новую виртуалку для Windows, не устанавливайте операционную систему.

Зайдите в настройки, и на вкладке Processors включите вот эти галки:

  • Virtualize Intel VT-x/EPT or AMD-V/RVI
  • Virtualize CPU performance counters

Сохраните настройки и закройте все окна VMWare (это важно).

Откройте VMX файл вашей виртуальной машины (вспомните, куда вы её сохранили на жестком диске). Добавьте вот эти строчки:

hypervisor.cpuid.v0 = "FALSE"
mce.enable = "TRUE"
vhv.enable = "TRUE"

Теперь запустите виртуальную машину и установите Windows.

Установите Windows Terminal

Использовать cmd.exe — очень больно. Windows Terminal куда лучше.

На обычной Windows 10/11, можно просто сходить во встроенный магазин: 
https://www.microsoft.com/en-gb/p/windows-terminal/9n0dx20hk701

На Windows Server всё немножко сложней, потому что магазин не работает.

Вначале нужно забрать ссылку на Терминал (прокрутите страничку до раздела Assets в самом свежем релизе): 
https://github.com/microsoft/terminal/releases?WT.mc_id=modinfra-26926-thmaure

URL выглядит как-то так: 
https://github.com/microsoft/terminal/releases/download/v1.12.3472.0/Microsoft.WindowsTerminalPreview_1.12.3472.0_8wekyb3d8bbwe.msixbundle

Можно либо скачать этот файл из браузера, либо загрузить из консоли:

Invoke-WebRequest -Uri https://github.com/microsoft/terminal/releases/download/v1.12.3472.0/Microsoft.WindowsTerminalPreview_1.12.3472.0_8wekyb3d8bbwe.msixbundle -outfile terminal.msixbundle

Важно, что загрузка из консоли будет длиться дольше, чем из браузера.

Теперь можно установить пакет, набрав в консоли следующее:

Add-AppxPackage terminal.msixbundle

Windows Terminal теперь можно найти в меню Пуск.

Устанавливаем nested Hyper-V

В эскалированном Power Shell запускаем:

Install-WindowsFeature -Name Hyper-V -Restart -IncludeAllSubFeature -IncludeManagementTools

Перезагружаем виртуалку.

Проверяем, что виртуализация включилась:

Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V

Ожидаемый выхлоп:

FeatureName      : Microsoft-Hyper-V
DisplayName      : Hyper-V
Description      : Hyper-V
RestartRequired  : Possible
State            : Enabled

Еще можно попробовать так:

Get-ComputerInfo -property "HyperV*"

Ожидаемый выхлоп:

HyperVisorPresent                                 : True
HyperVRequirementDataExecutionPreventionAvailable :
HyperVRequirementSecondLevelAddressTranslation    :
HyperVRequirementVirtualizationFirmwareEnabled    :
HyperVRequirementVMMonitorModeExtensions          :

Еще можно проверить вкладку CPU в вашем диспетчере задач, Task Manager. Там должно быть написано: “Virtualization: Enabled” в правом нижнем углу, в свойствах процессора.

Установите браузер (Windows Server 2022)

Добрый совет: если используете Windows Server и браузер Edge, то там работают повышенные меры безопасности. Их можно отключить, но т.к. браузер — важная часть системы, то это может привести к примерно любым последствиям. Чтобы нормально браузить интернет и не погрязнуть в троянах, советую скачать Firefox: https://www.mozilla.org/ru/firefox/new/

Установите WSL2 (Windows Server 2022)

WSL2 на этой платформе не поддерживается.

Почитать можно здесь:

Вместо этого нужно использовать Docker Engine, который будет работать с Hyper-V напрямую.

Установите WSL2 (Windows 10/11)

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Дальше нужно вкорячить патч на ядро: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

Просто запустите и прощелкайте кнопку Next.

Переключитесь на WSL2:

wsl --set-default-version 2

Если после выполнения этой команды вы увидите огромную простыню текста, как если бы вы вызвали эту команду с ключиком –help, это означает, что WSL2 на вашей платформе почему-то не поддерживается (например, вы используете Windows Server).

Выберите дистрибутив для WSL:

wsl -l -o

Ожидаемый выхлоп:

The following is a list of valid distributions that can be installed.
Install using 'wsl --install -d <Distro>'.

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

Теперь, установите выбранное. Парметром нужно указвать NAME из таблицы выше.

wsl --install -d Ubuntu
wsl --setdefault Ubuntu

Проверьте версию WSL:

wsl --list --verbose

Ожидаемый выхлоп:

 wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

Если вы увидите там цифру 1, то вы забыли переключить версию ( wsl –set-default-version 2 ).

Установите nested Docker Dekstop (Windows 10/11)

Подробнее в этой документации: https://docs.docker.com/desktop/windows/install/

Просто скачайте его с официального сайта: https://www.docker.com/products/docker-desktop

Скачайте и прощёлкайте кнопку Next. По ходу инсталляции поставьте галку рядом с “Install required Windows components for WSL2”. В принципе, вы и так уже установили всё, что нужно, но чем чёрт не шутит.

Перезагрузите виртуальную машину.

Установите nested Docker Engine (Windows Server 2022)

Подробности описаны вот в этой документации: https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/set-up-environment?tabs=Windows-Server

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

Если по ходу установки будут какие-то ошибки, в которых говорится про SSL и TLS, попробуйте такое:

[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;

Установите Docker Engine:

Install-Package -Name docker -ProviderName DockerMsftProvider

Перезапустите виртуальную машину:

Restart-Computer -Force

Проверьте, что Докер запустился и действительно работает:

docker run hello-world

Ожидаемый выхлоп:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
11961e4f2e13: Pull complete
d24add324b48: Pull complete
caa028ea82a4: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

Profit

Я научил вас всему, что сам знал. А теперь…

olegchir

Links: Facebook | Twitter | Instagram

Indie game developer. All opinions are my own.

Add comment

Follow me (@olegchir)

Don't be shy, get in touch. I love meeting interesting people and making new friends.

Most popular

Most discussed