Как установить и запустить Docker с помощью Nix

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

Я использую Debian на WSL. Nix уже установлен.

Я устанавливаю Docker с помощью этой команды:

nix-env -iA nixpkgs.docker

Я хочу запустить демон:

systemctl start docker

Не удалось подключиться к шине: Нет такого файла или директории

Обновление

Для вашего сведения:
$XDG_RUNTIME_DIR= /mnt/wslg/runtime-dir
$UID=1000
$DBUS_SESSION_BUS_ADDRESS не имеет значения

ls -l /mnt/wslg/runtime-dir

drwx—— 4 pierre pierre 120 26 дек 00:41 runtime-dir

Я могу получить доступ к шине. Но мне нужно использовать sudo

sudo systemctl start docker

Теперь у меня эта проблема

Не удалось запустить docker.service: юнит docker.service не найден.

Я думаю, что docker.service — это этот файл:
/etc/systemd/system/docker.service

Но его нет в моей ОС.
Я пытался удалить и переустановить Docker с помощью nix. Безуспешно.

Я думаю, это связано:

https://discourse.nixos.org/t/docker-packages-systemd-unit-files-dont-work-on-ubuntu/12160

sudo cp ~/.nix-profile/etc/systemd/system/docker.service /etc/systemd/system/docker.service

sudo cp ~/.nix-profile/etc/systemd/system/docker.sock /var/run/docker.sock

sudo systemctl enable docker

Не удалось запустить docker.service: юнит docker.socket не найден.

Не удалось запустить docker.service: юнит docker.socket не найден.

После прочтения этой ссылки, я использую эту команду, чтобы узнать, куда мне нужно заменить файл docker.socket:

systemctl list-sockets --all

Но docker.socket не указан

**обновление

Я выполнил все команды с нуля. Теперь у меня эта проблема:
Задание на зависимость для docker.service не выполнено. См. ‘journalctl -xe’ для подробностей.

Если я правильно понял проблему, вам нужно установить XDG_RUNTIME_DIR вручную (потому что /run/user/... иногда принадлежит какому-то другому пользователю?? (Не уверенно, если честно)):

Попробуйте установить XDG_RUNTIME_DIR = "/run/user/$UID", а затем снова запустить nix?

Если это не сработает, возможно, вам нужно установить DBUS_SESSION_BUS_ADDRESS также на DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus".

Вы можете найти аналогичную тему здесь:
https://superuser.com/questions/1561076/systemctl-user-failed-to-connect-to-bus-no-such-file-or-directory-debian-9

Вам нужно найти директорию, используйте cd .. и перейдите в /bin/, там ваша программа, затем начинайте с ./docker или используйте systemctl start docker.

sudo groupadd docker
sudo chgrp docker docker.sock
sudo systemctl start docker

Нет сообщения об ошибке

Вам нужно изменить настройки по умолчанию docker.service, например, изменив параметры запуска

[Unit]
...
Requires=~/.nix-profile/etc/systemd/system/docker.socket

[Service]
...
ExecStart=/home/xx/.nix-profile/bin/dockerd -H unix:///var/run/docker.sock

Возможно, вам нужно перезагрузить

sudo systemctl daemon-reload

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

Установка и запуск Docker с использованием Nix на Debian (в WSL) могут вызвать некоторые сложности из-за особенностей управления сервисами и прав доступа. Ниже приведены шаги для успешной установки и запуска Docker в вашей конфигурации:

Шаг 1: Установка Docker с использованием Nix

Как вы уже сделали, сначала установите Docker с помощью команды:

nix-env -iA nixpkgs.docker

Шаг 2: Создание группы Docker

Убедитесь, что у вас есть группа docker, и вы являетесь её членом, чтобы избежать необходимости использовать sudo для выполнения Docker команд. Выполните следующие команды:

sudo groupadd docker  # Создание группы docker, если она еще не существует
sudo usermod -aG docker $USER  # Добавляем текущего пользователя в группу docker

После этого выйдите и войдите обратно в систему, чтобы изменения вступили в силу.

Шаг 3: Настройка XDG_RUNTIME_DIR

Настройка переменной окружения XDG_RUNTIME_DIR критично важна для работы Docker в WSL:

export XDG_RUNTIME_DIR="/run/user/$UID"

Добавьте эту строку в ваш файл ~/.bashrc или ~/.zshrc, чтобы она применялась автоматически при запуске терминала.

Шаг 4: Настройка DBUS_SESSION_BUS_ADDRESS

Если вы столкнулись с проблемами подключения к bus, попробуйте также установить переменную DBUS_SESSION_BUS_ADDRESS:

export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"

Вставьте это в тот же файл, что и предыдущую строку.

Шаг 5: Запуск Docker Daemon

Поскольку WSL не поддерживает systemd, вам нужно запускать Docker напрямую. Воспользуйтесь следующей командой для запуска Docker Daemon:

dockerd &

Это запустит Docker в фоновом режиме. Убедитесь, что вы находитесь в той же сессии терминала, так как он будет использовать окружения, которые были установлены выше.

Шаг 6: Тестирование установки

Для проверки работы Docker выполните следующую команду:

docker run hello-world

Если всё корректно настроено, то изображение будет загружено, и вы увидите сообщение о том, что Docker работает.

Дополнительные советы

Если вам нужно изменить конфигурацию docker.service, вы также можете это сделать. Пример конфигурации:

[Unit]
Description=Docker Application Container Engine
Requires=~/.nix-profile/etc/systemd/system/docker.socket

[Service]
ExecStart=/home/your_username/.nix-profile/bin/dockerd -H unix:///var/run/docker.sock

Шаг 7: Перезапуск демона

Если вы вносили изменения в систему, возможно, потребуется выполнить команду для перезагрузки конфигурации сервисов (что может быть не применимо в WSL):

sudo systemctl daemon-reload

Однако, в большинстве случаев на WSL это не будет работать, так как systemd не установлен. Вместо этого просто убедитесь, что dockerd работает.

Заключение

Выполнив вышеописанные шаги, вы должны успешно установить и запустить Docker на Debian через WSL с использованием Nix. Убедитесь, что вы следите за выводом команд и справляетесь с возможными ошибками. Если возникнут дополнительные проблемы, обратитесь к документации Docker или обращениям о поддержке Nix.

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

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