Не удается запустить службу dockerd на Windows 10 Pro.

Вопрос или проблема

Я пытаюсь настроить Docker Engine (docker.exe и dockerd.exe, см. здесь) на виртуальной машине Windows 10, работающей на последней версии Proxmox (включена вложенная виртуализация, включая поддержку Hyper-V, WSL, Containers и т.д. в гостевой ОС) без использования Docker Desktop (из-за лицензирования). Я хотел бы запускать контейнеры Windows (например, Server Core) для проведения тестов и упаковки приложений для Windows (см. документация).

Я скачал последнюю версию (в данный момент 27.4.1) здесь. В ней содержатся два исполняемых файла – docker.exe и dockerd.exe.

Я добавил группу под названием docker-users и добавил туда своего пользователя user1 поскольку я прочитал, что Docker Desktop создает такую группу. Оба исполняемых файла находятся в папке C:\Users\user1\docker. Я также добавил путь в PATH для системного доступа к docker.exe для взаимодействия с инфраструктурой контейнеров.

В администраторском Powershell я запустил dockerd.exe --register-service. Моя первоначальная попытка не включала конфигурационный файл daemon.json (размещенный в C:\ProgramData\Docker\config\) с целью его создать.

Запись сервиса видна в списке служб Windows. По умолчанию сервис создается с флагом запуска Automatic. Однако, когда я проверил его статус, я увидел, что он не запущен. Ручная попытка – как через Start-Service в Powershell, так и через меню служб Windows для этой записи – привела к ошибке.

UI служб Windows выдал мне ошибку 1067

введите описание изображения здесь

Вызов Powershell выдал мне

Start-Service: Не удалось запустить службу 'Docker Engine (docker)'.
на строке:1 символе:1
+ Start-Service docker
- ~~~~~~~~~~~~~~~~~~~~
  + CategoryInfo         : OpenError : (System.ServiceProcess.ServiceController.ServiceController) [Start-Service], ServiceCommandException
  + FullyQualifiedErrors : StartServiceFailed, Microsoft.PowerShell.Commands.StartServiceCommand

Попытка использовать docker.exe (например, docker pull hello-world) приводит к

Используется тег по умолчанию: latest

    ошибка во время подключения: эта ошибка может указывать, что демонический процесс docker не запущен: Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.47/images/create?fromImage=hello-world&tag=latest": open //./pipe/docker_engine: The system cannot find the file specified.

что, как я полагаю, ожидаемо с учетом сбоя сервиса.

Я также включил WSL 2 и установил Debian на всякий случай, хотя это и не должно требоваться с учетом моей настройки.

Моя первая попытка запустить сервис завершилась неудачей по до сих пор неизвестной причине. После этого я добавил конфигурационный файл, который нашел здесь. Я сделал небольшие корректировки (например, hosts и group были изменены). После множества попыток запустить сервис и неудач я проверил журналы событий (благодаря комментарию от @Ramhound). Я не знал о Get-EventLogs (я не очень опытный пользователь Windows).

Основываясь на этом и этом сообщениих я выполнил

Get-EventLog -LogName Application -Source Docker -Newest 10 | select -ExpandProperty message

Я узнал, что ошибка исходит из файла daemon.json. Такие директивы как cluster-advertise, disable-legacy-registry и т. д. не поддерживаются или являются пустыми, что приводит к проблемам с загрузкой конфигурации.

Я удалил файл JSON, снял регистрацию и заново зарегистрировал сервис, после чего вызвал Start-Service и получил

API listen on //./pipe/docker_engine
Демон завершил инициализацию
Докер-демон [commit=c710688 storage-driver=windowsfilter containerd-snapshotter=false version=27.4.1] загрузка контейнеров: выполнено.
Восстановление существующих оверлейных сетей из HNS в docker
Загрузка контейнеров: начало.
[graphdriver] попытка настроенного драйвера: windowsfilter
Режим изоляции по умолчанию для Windows: hyperv
OTEL трассировка не настроена, используется песочница tracer провайдер
Запуск

Тестирование Docker с помощью изображения hello-world:

Hello from Docker!
Это сообщение показывает, что ваша установка, по-видимому, работает правильно.
Для генерации этого сообщения Docker предпринял следующие шаги:
1. Клиент Docker связался с демоном Docker.
2. Демон Docker скачал образ "hello-world" с Docker Hub. (windows-amd64, nanoserver-1809)
3. Демон Docker создал новый контейнер из этого образа, который выполняет исполняемый файл, производящий вывод, который вы сейчас читаете.
4. Демон Docker передал этот вывод клиенту Docker, который отправил его в ваш терминал.
Чтобы попробовать что-то более амбициозное, вы можете запустить контейнер Windows Server с помощью: PS C:\> docker run -it mcr.microsoft.com/windows/servercore: 1809 powershell
Делитесь изображениями, автоматизируйте рабочие процессы и многое другое с помощью бесплатного Docker ID: https://hub.docker.com/
Для получения дополнительных примеров и идей посетите: https://docs.docker.com/get-started/

Я добавил меньший кастомный конфигурационный файл JSON с основами, и он тоже работает. К сожалению, демонический процесс Docker не создает один автоматически.

И последнее, но не менее важное: многие примеры в интернете раскрывают TCP сокет демона для внешних подключений (tcp://0.0.0.0:2375). Проверка журналов событий сервиса показывает предупреждение о том, что в будущем это будет жесткой ошибкой и не должно использоваться. Сервис запустится, но вы не сможете запустить контейнер.

В моем случае, мне это не нужно, так как единственное подключение к демону Docker идет с localhost и поступает от GitLab runner. Однако, если такая функциональность необходима, я предлагаю изучить документацию о том, как работает TLS (ключевые слова: tls, tlsverify, tls-key, tls-cert) с Docker и предоставить необходимые файлы для его работы.

Ответ или решение

Запуск службы dockerd на Windows 10 Pro без использования Docker Desktop может вызывать определенные сложности, особенно если учитывать настройки виртуализации и совместимости на виртуальной машине (VM). Давайте разберем возможные причины и решения проблемы, основываясь на предоставленных деталях.

Теория:

Основная цель — обеспечение работы Docker Engine на Windows без GUI-оболочки Docker Desktop, которая может иметь лицензионные ограничения. При этом важен ряд факторов: совместимость с операционной системой, корректная настройка системы и поддержка необходимых функций Windows, таких как Hyper-V и WSL 2. Недостаточная настройка серверных компонентов или конфигурационных файлов может вызвать ошибки при попытке запуска службы Docker.

Пример:

Вы столкнулись с ошибкой 1067 при попытке запуска службы ‘Docker Engine’ на Windows 10, работающей на виртуальной машине под управлением Proxmox. Проблемы могут возникать из-за некорректной конфигурации файла daemon.json, который отвечает за параметры запуска демона Docker. Также возможно, что системные переменные окружения, такие как PATH или конфигурации служб, настроены неправильно.

Применение:

  1. Проверка конфигурации: Убедитесь, что конфигурационный файл daemon.json не содержит неподдерживаемых или пустых параметров. Минимизируйте настройки, оставив только необходимые. Например, укажите хост как npipe:////./pipe/docker_engine и избегайте устаревших директив, таких как cluster-advertise или disable-legacy-registry, которые могут вызвать ошибки.

  2. Повторная настройка службы: После проверки и правки конфигурации выполните повторную регистрацию и запуск службы Docker. Выполните команды от имени администратора:

    dockerd.exe --unregister-service
    dockerd.exe --register-service
    Start-Service docker

    Убедитесь, что путь к исполняемым файлам docker.exe и dockerd.exe добавлен в системную переменную PATH для их доступности из любой точки системы.

  3. Мониторинг журналов событий: Регулярно анализируйте Журналы событий Windows на наличие ошибок, связанных с Docker, используя команду PowerShell:

    Get-EventLog -LogName Application -Source Docker -Newest 10 | select -ExpandProperty message

    Это поможет выявить конкретные причины сбоев и скорректировать настройки в соответствии с обнаруженными уведомлениями.

  4. Настройки безопасности: Если требуется доступ к демону Docker из внешней сети, настройте соединение по защищённому протоколу TLS. Избегайте конфигурации, использующей tcp://0.0.0.0:2375, так как это небезопасно и может вызвать ошибки в будущем. Изучите документацию Docker по настройке сертификатов TLS и используйте соответствующие директивы в daemon.json, такие как tls, tlsverify, tls-key, tls-cert.

Следуя этой инструкции, можно обеспечить стабильную работу Docker Engine на Windows 10 Pro без использования Docker Desktop, со всеми вытекающими преимуществами контейнеризации для развертывания и тестирования приложений.

Оцените материал
Добавить комментарий

Капча загружается...