Вопрос или проблема
Я пытаюсь настроить 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 или конфигурации служб, настроены неправильно.
Применение:
-
Проверка конфигурации: Убедитесь, что конфигурационный файл
daemon.json
не содержит неподдерживаемых или пустых параметров. Минимизируйте настройки, оставив только необходимые. Например, укажите хост какnpipe:////./pipe/docker_engine
и избегайте устаревших директив, таких какcluster-advertise
илиdisable-legacy-registry
, которые могут вызвать ошибки. -
Повторная настройка службы: После проверки и правки конфигурации выполните повторную регистрацию и запуск службы Docker. Выполните команды от имени администратора:
dockerd.exe --unregister-service dockerd.exe --register-service Start-Service docker
Убедитесь, что путь к исполняемым файлам
docker.exe
иdockerd.exe
добавлен в системную переменную PATH для их доступности из любой точки системы. -
Мониторинг журналов событий: Регулярно анализируйте Журналы событий Windows на наличие ошибок, связанных с Docker, используя команду PowerShell:
Get-EventLog -LogName Application -Source Docker -Newest 10 | select -ExpandProperty message
Это поможет выявить конкретные причины сбоев и скорректировать настройки в соответствии с обнаруженными уведомлениями.
-
Настройки безопасности: Если требуется доступ к демону 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, со всеми вытекающими преимуществами контейнеризации для развертывания и тестирования приложений.