Как я интегрировал полнофункциональную настройку докеров в WSL
Предпосылки ✋
Прежде чем приступить к делу, вам необходимо убедиться, что в вашей системе есть следующее:
- Windows 10 версии 1803, сборка 1734 и выше ⬆
- Ubuntu для WSL 16.0.4 LTS или аналогичный (пробег может отличаться)
Важно, чтобы ваша версия Windows не была ниже указанных выше номеров версии и сборки. В ядро WSL было внесено важное изменение, которое позволяет использовать cgroups, необходимые Docker для управления ресурсами вашей системы в контейнерах.
Установка Docker-CE 17.09.0 💘
Самая последняя версия Docker Community Edition, которая была проверена для работы в подсистеме Windows Linux, - 17.09.0, поэтому давайте ее установим. в нашей (под) системе!
Первое, что нужно сделать - избавимся от любых предыдущих установок Docker. Откройте новый терминал bash и запустите следующее:
$ sudo apt-get remove docker docker-engine docker.io containerd runc
Теперь нам нужно будет настроить репозиторий Docker-CE в apt-get, чтобы мы могли установить определенную версию, не собирая ее самостоятельно из исходных текстов. Следуя инструкциям на официальном сайте Docker, это можно сделать следующим образом:
# Update the source listing $ sudo apt-get update # Ensure that you have the binaries needed to fetch repo listing $ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common # Fetch the repository listing from docker's site & add it $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # Update source listing now that we've added Docker's repo $ sudo apt-get update
Если вы когда-либо добавляли новый репозиторий в apt, это будет вам знакомо. Если нет, надеюсь, ты все еще со мной здесь 🤗
Затем мы устанавливаем конкретную версию Docker, которая нам нужна…
$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu
Если вы не используете версию WSL Ubuntu, вы можете перечислить доступные версии для вашего дистрибутива с помощью команды:
$ apt list -a docker-ce
… Или аналогичный, если выбранный вами менеджер пакетов не подходит.
Наконец, нам нужно добавить вашего текущего пользователя в группу 'docker', чтобы вам было разрешено взаимодействовать с Docker Engine, который будет работать в вашей системе как корень.
sudo usermod -aG docker $USER
Запуск службы Docker в Windows 🚀
Теперь, когда Docker установлен, нам нужно будет разработать хитрый метод, чтобы запускать его как службу в WSL каждый раз при загрузке Windows. Возможно, это звучит просто; однако это нужно делать как системный суперпользователь из командной оболочки с повышенными привилегиями, что немного усложняет работу ™
Чтобы немного упростить процесс, создайте в /usr/local/sbin/
новый сценарий, содержащий соответствующие команды для запуска службы Docker:
$ sudo nano /usr/local/sbin/start_docker.sh
со следующим содержанием…
#!/usr/bin/env bash sudo cgroupfs-mount sudo service docker start
Первая команда настроит cgroups mounts в подсистеме (это нужно делать только один раз при перезагрузке), а вторая вызовет службу докеров с помощью systemd.
Теперь, если вы включите выполнение скрипта и запустите его…
$ sudo chmod +x /usr/local/sbin/start_docker.sh # Lock down edit privileges $ sudo chmod 755 /usr/local/sbin/start_docker.sh $ /bin/sh /usr/local/sbin/start_docker.sh
Служба Docker не запускается по двум причинам:
- Сценарий выполняет вызовы от имени суперпользователя, поэтому сам сценарий должен вызываться от имени суперпользователя для правильной работы. Это должно быть так же просто, как использовать
sudo
, но это требует ввода данных пользователем, что было бы неприятно делать после каждой загрузки 😢 - Первую команду для монтирования cgroups необходимо выполнить в оболочке bash с повышенными привилегиями (правда? - да.) Чтобы запустить оболочку с повышенными привилегиями при загрузке без ввода данных пользователем, мы будем необходимо заручиться помощью Планировщика заданий Windows 🕑
Давайте займемся этими вопросами… 🕵️♂️
Вызов нашего скрипта с root без ввода данных пользователем
В Linux файл /etc/sudoers
определяет, кто может вызывать кого-либо как суперпользователь в системе. Давайте изменим его, чтобы ваша учетная запись пользователя могла вызывать наш скрипт без необходимости указывать пароль root. (ПРИМЕЧАНИЕ. Не возитесь с этим файлом! Очень легко заблокировать себя в системе, если вы не знаете, что делаете!)
$ sudo nano /etc/sudoers
И добавьте следующее в внизу файла - обязательно укажите свое имя пользователя (используйте echo $USER
, если не знаете, что это такое):
# Enable docker services to start without sudo <your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh
Теперь вы можете запустить $ sudo /bin/sh /usr/local/sbin/start_docker.sh
, чтобы запустить Docker Service из оболочки bash с повышенными привилегиями, и она не будет запрашивать пароль! Отлично!
Запустите Docker в запросе с повышенными правами при загрузке Windows
Теперь, когда можно запустить Docker с помощью одной неинтерактивной команды, мы можем запускать его от имени администратора при загрузке вашей системы.
Запустите Планировщик заданий из меню «Пуск» Windows и щелкните Библиотека планировщика заданий на левой панели, затем Создать задачу… на правой панели.
Должен появиться новый запрос с отображением некоторых основных параметров задачи. Назовите свою задачу как-нибудь описательно и убедитесь, что остальные настройки совпадают с моими. Важно выбрать «Запускать с наивысшими привилегиями».
На вкладке Триггеры добавьте новый триггер, который будет запускать нашу задачу, когда ваш локальный пользователь входит в систему.
На вкладке Действия создайте новое действие, которое запускает оболочку bash и немедленно выполняет наш скрипт со следующим аргументом командной строки:
-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"
Обратите внимание, что это выполняется в оболочке с повышенными привилегиями, поскольку мы отметили параметр «Запускать с наивысшими привилегиями» на вкладке Общие.
Остальные параметры в основном зависят от ваших предпочтений, но я покажу свои настройки, если вы хотите их скопировать. Некоторые параметры питания могут не отображаться, если вы используете настольный компьютер, так как я использую ноутбук 💻
Так и должно быть! Если вы не запускали Docker с помощью нашего сценария в оболочке с повышенными привилегиями на предыдущих шагах, просто щелкните правой кнопкой мыши задачу, которую мы создали в библиотеке Task Scheduler, и выберите Беги! Вот и все!
Убедитесь, что у вас все работает 🔬
Если вы чувствуете себя особенно опасно, перезагрузите компьютер (да, это означает закрытие всех вкладок Google Chrome…), откройте обычную оболочку bash и выполните следующее:
$ docker run --rm hello-world
Если все пойдет хорошо, вы должны увидеть стандартное приветственное сообщение Docker! Служба Docker запускается автоматически в WSL! Поздравляю! 🎉🍾
Завершить 🎀
Вы только что запустили Docker в WSL. Это означает, что теперь ваши контейнеры могут совместно использовать ядро Ubuntu, уже запущенное в вашей системе, вместо того, чтобы запускать новое (виртуализированное), как это делала бы официальная программа Windows Docker. Производительность выполнения Docker в WSL оставляет желать лучшего, но она будет только улучшаться по мере развития платформы с будущими обновлениями Windows ⚡
Источники
- onomatopellan на GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
- Официальная документация Docker: https://docs.docker.com/install/linux/docker-ce/ubuntu/
- cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
- Интерфейс командной строки Bash: https://docs.microsoft.com/en-us/windows/wsl/reference
- Изображение в заголовке: http://www.architectureartdesigns.com/10-crazy-shipping-container-homes-you-must-see/
Присоединяйтесь к нашему сообществу Slack и читайте наши еженедельные темы о Фавнах ⬇