Как я интегрировал полнофункциональную настройку докеров в 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 не запускается по двум причинам:

  1. Сценарий выполняет вызовы от имени суперпользователя, поэтому сам сценарий должен вызываться от имени суперпользователя для правильной работы. Это должно быть так же просто, как использовать sudo, но это требует ввода данных пользователем, что было бы неприятно делать после каждой загрузки 😢
  2. Первую команду для монтирования 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 ⚡

Источники

  1. onomatopellan на GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Официальная документация Docker: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Интерфейс командной строки Bash: https://docs.microsoft.com/en-us/windows/wsl/reference
  5. Изображение в заголовке: http://www.architectureartdesigns.com/10-crazy-shipping-container-homes-you-must-see/

Присоединяйтесь к нашему сообществу Slack и читайте наши еженедельные темы о Фавнах ⬇

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇