Рубрики
Uncategorized

Установите Docker в Windows (WSL) без Docker Desktop

Подсистема Windows For Linux 2 Sports A Фактическое ядро Linux, поддерживая настоящие контейнеры Linux и Doc … Tagged с Docker, DevOps, WSL, Windows.

Подсистема Windows для Sports Linux 2 фактическое ядро Linux, поддерживая настоящие контейнеры Linux и Docker. Docker работает на WSL 2, а без требуя надежного, но тяжелого докера настольного компьютера, если это нежелательно. Однако из-за сложностей WSL и Docker требуется небольшая нежная любящая забота, чтобы получить докер и бегать. Эта статья пытается изучить такой процесс и варианты по пути.

Вопреки тому, что может предложить длительность этой статьи, получая докер, работающий на WSL, довольно прост. В двух словах:

  • Вместо того, чтобы использовать систему init, например Systemd, чтобы запустить Docker Daemon, запустите его, позвонив Докерд вручную.
  • Если делиться делом Docker Daemon между экземплярами WSL, настройте его, чтобы использовать сокет, хранящуюся в общем /mnt/wsl каталог.
  • Если требуется совместное использование и привилегированный доступ без sudo, настройте Докер Группа, чтобы иметь тот же идентификатор группы по всем экземплярам WSL
  • Вместо того, чтобы запускать клиент на основе Windows Docker, запускайте Докер внутри WSL.

Больше нюанса и решения ниже, конечно. Смотрите подробности относительно компаньон github repo прокручивая на дно.

Вы уверены, что не хотите Docker Desktop?

Прежде чем продолжить, отметим, что Docker Desktop удивительно. Если вы хотите Docker работать на Windows и WSL 2, Установка Docker Desktop скорее всего, путь к работе. С Docker Desktop’s WSL 2 Backend , Docker интегрирует с Windows довольно элегантным способом, и клиент Docker может быть запущен из PowerShell или Linux. Чтение о том, что происходит под капотом также является интересным и информативным усилением. Очень умно.

Если вы пришли сюда, глядя, как легко запускаться докера, или если вы хотите, чтобы контейнеры Windows (все еще редкость), а не только контейнеры Linux, то Docker Desktop — ваш друг, и вы можете Go Установите это сейчас.

Но если вы, как я, почувствуете, что вся добавленная сложность Docker Desktop не нужна, вам не нужны контейнеры Windows, или вы просто устали от этого кита в системном подносе … Итак … долго … Тогда, возможно, вы хотите запустить Docker Daemon ( Dockerd ) в WSL Distro на ваш выбор и будьте счастливы. Вы находитесь в нужном месте.

Вы пытались подман?

Прежде чем мы вместе, хотя: вы знаете Подман ? Podman является демонстрирующим (не нужен фоновый сервис), современные (cgroups v2 из коробки), не поддерживает безрассудку и служит заменой Docker. Не требуя беспокойства о розетках и портах, много головных болей уходят.

Я написал о том, чтобы получить подман для работы на WSL 2. Не стесняйтесь попробовать это. Вы можете никогда не оглянуться назад. И да, VSCode может работать с подманом.

И все еще… Иногда нужно просто нуждаться в докере для работы. Может быть, некоторые инструменты, которые вы используете, не можете обрабатывать Podman, или вы просто хотите поставить WSL через его шансы. Если это так, прочитайте.

Убедитесь, что WSL — версия 2

Обратите внимание, что эти шаги требуют WSL 2 (не версии 1). WSL 2 использует фактическое ядро Linux, которое позволяет контейнерам Linux. WSL 1 был Genius с запуском Linux на ядре Windows, но, конечно, не хватало некоторых функций, таких как контейнеры. Microsoft предлагает Более подробное сравнение в документах Отказ Вам, безусловно, нужно использовать WSL 2 для запуска службы докера.

Команда wsl --et-main-default-версия 2 работай? Это установит версию по умолчанию на WSL 2 или выйти из строя, если вы все еще на первой версии.

У Microsoft есть пошаговые инструкции по обновлению на WSL 2 Отказ

Для запуска WSL 2 требуется Windows версии 1903 или выше, с сборкой 18362 или выше. Чтобы сказать, какую версию вы работаете, запустите Winver в PowerShell или CMD, или просто введите клавишу Win и R (⊞-R), чтобы открыть диалоговое окно Run, а затем ввести Winver Отказ Надеюсь, вы увидите что-то вроде «Версия 2004. ОС Build 19041.329 «

Установите Linux Distro

Если у вас еще нет запущенного экземпляра WSL с дистрибутивом по вашему выбору, следующий шаг — Выберите один из Microsoft Store Отказ Если вам не нравится магазин Windows, Есть и другие варианты Отказ

Пользовательские установки также имеют отличный вариант с WSL 2. Например, Установить и настроить Fedora или любой другой дистрибутив, для которого вы можете получить rootfs в формате tar, а затем WSL --import. rootfs.tar Отказ

Это руководство включает в себя инструкции по запуску Dockerd в Debian , Ubuntu , Альпийский и Федора Отказ Если вы думаете, что есть еще один очевидный дистрибутив WSL, который следует рассмотреть, не стесняйтесь, дайте мне знать в комментариях.

Настройте пользователь без root

После того, как вы установили дистрибутив на ваш выбор, запустите его и настройте пользователь Non-root, если у вас еще нет. Debian и Ubuntu настроят это автоматически с первого запуска. Для Alpine или Fedora используйте AddUser Myusername создать новый пользователь. На альпийском, это подскажет новый пароль. На Федора, вы будете дополнительно надо Passwd Myusername и введите пароль, который вы хотите использовать. (Если ваша Федора не имеет Passwd тогда вам нужно будет сначала DNF Установить Passwd Cracklib-Dicts ).

Настройте администратор (sudo) доступа для пользователя без root

Если вы использовали Debian или Ubuntu из хранилища Windows и настройте пользователя по умолчанию на первый запуск, то Sudo уже должен быть настроен от имени пользователя по умолчанию. Вы можете пропустить этот шаг и перейти к обновлению пакетов и тестирование сетевых подключений ниже.

Когда подписано как пользователь, который вы настроили (попробуйте SU MyUsername Если вы все еще root), можете ли вы sudo -v Без ошибки?

Если нет, сначала убедитесь, что Sudo установлен. На альпийском, это APK Добавить Sudo. А на Федора, DNF Установить Sudo. . Если это не удается из-за подключения к сети, см. Ниже. Вы можете следовать указаниям там, чтобы исправить DNS, но, конечно, устранить любое возникновение Sudo В этих командах, как у вас еще нет, и вы все равно должны быть root.

Ваш пользователь «Sudoer»? Попробуйте следующее, чтобы увидеть, являются ли они частью Sudo или колесо группа:

grep -E 'sudo|wheel' /etc/group

На дистрибутиве, которые имеют Sudo Группа, такая как Ubuntu и Debian, вы должны увидеть что-то вроде Sudo: X: 27: MyUsername и на дистрибутиве, которые имеют колесо Группа, такая как Федора и альпий, вы должны увидеть что-то вроде Колесо: 27: MyUsername Отказ

Если ваше имя пользователя отсутствует из группы, примите к сведению имя группы ( Sudo или колесо ) и добавьте вопрос о том, что касается этой группы:

  • Alpine: Addgroup колесо MyUsername
  • Федора: USERMOD -AG колесо MyUsername
  • Вероятно, не нужно, но На Убунту/Debian: USERMOD -AG Sudo MyUsername

Наконец, убедитесь, что группу администратора (будь то sudo или колесо ) включено для sudo:

sudo grep -E '%sudo|%wheel' /etc/sudoers

Если линия там, но прокомментирована с # Затем запустите Visudo Затем убедитесь, что линия читает таким образом (используйте колесо или Sudo Как определено ранее):

%wheel ALL=(ALL) ALL

Тогда сохраните.

Как только эти шаги будут завершены, снова проверьте:

su myusername
sudo -v

Если вам будет предложено для пароля, то все хорошо. Если вы вместо этого получили ошибку, содержащую что-то вроде «Извините, пользовательское имя пользователя может не запустить sudo», то вам может понадобиться последующие шаги снова с самого начала.

Установите пользователя по умолчанию

Если вы получили Ubuntu или Debian из магазина, вы, вероятно, можете пропустить этот шаг, так как пользователь по умолчанию уже установлен.

Если, однако, когда вы запускаете WSL, вы все еще root, то установите свой новый пользователь как значение по умолчанию.

Пользователь по умолчанию для данного WSL EDRO устанавливается в реестре Windows. Прежде чем делать это, нам понадобятся два бита информации: идентификатор пользователя и имя WSL DISTRO. Скорее всего, вы уже знаете это. Если нет, вы можете получить идентификатор пользователя с ID -U MyUsername и проверьте свой список дистрибутивов WSL (в PowerShell) WSL -L.

Теперь используйте следующую команду в PowerShell, но используйте имя WSL Distro вместо «Alpine» и используйте свой идентификатор пользователя вместо «1000»:

Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq Alpine  | Set-ItemProperty -Name DefaultUid -Value 1000

Теперь выйдите из WSL и войдите в систему. Убедитесь, что WHOAMI дает правильное имя пользователя. Успех.

Обновление/обновление пакетов и тестовая сетевая связь

Давайте сделаем все новое и блестящее одним из следующих действий:

  • Debian/Ubuntu: Sudo APT Update && Sudo APT обновление
  • Федора: sudo dnf. Обновить
  • Alpine: Sudo APK обновление -U

Сетевые проблемы?

Обновление пакетов также служит сетевым тестом. По разным причинам, проблемы со связью сети кажется распространенным С WSL 2 и настраивая настройки DNS всегда разрешают эти проблемы в моем опыте. Если команда обновления преуспела, вы можете пропустить этот раздел. Но если вышеуказанные команды не могут получить доступ к серверам пакетов, это может быть что-то уникальное для вашей сети, или вашему брандмауэру или программному обеспечению борьбы с болотом. Я рекомендую следующее:

echo -e "[network]\ngenerateResolvConf = false" | sudo tee -a /etc/wsl.conf
sudo unlink /etc/resolv.conf
echo nameserver 1.1.1.1 | sudo tee /etc/resolv.conf

Первая строка рассказывает WSL, чтобы перестать автоматически настроить /etc/resolv.conf файл. Затем мы удаляем/не знаем старый файл и создайте новый.

С помощью этого недавно настроенного DNS Resolver (в этом случае, указывая непосредственно на DNS CloudFlare DNS), вы можете попробовать снова обновлять пакеты. Успех? Превосходно.

Подготовьтесь к установке докера

К счастью, есть Официальные гиды для установки Докера на различных дистрибутивах Linux. Я основывался эти инструкции на тех, с некоторыми настройками извлеченных на реальные мировые тестирования.

Удалить остаток

Если это не новая установка, и вы, возможно, экспериментировали с Docker до того, как сначала очистите любой остаточный докер устанавливается:

  • Федора: Sudo DNF удалить MOBY-Engine Docker Docker-Client Docker-Client-New Client Docker-Common Common Docker-Neamone Docker-Lame-Logrotate Docker-Logrotate Docker-Selinux Docker-Engine-Selinux Docker-Engine
  • Debian/Ubuntu: Sudo APT удалить Docker Docker-Engine Docker.io Containerd Runc
  • Альпийский (вероятно, не нужен, но на всякий случай): Sudo APK DEL Docker-CLI Docker-Engine Docker-OpenRC Docker-Compose Docker

Установка зависимостей

Затем установите предварительные реквизиты:

  • Debian/Ubuntu: Sudo APT Установка --NO-Install - рекомендует APT-транспорт-HTTPS CA-сертификаты CURL GNUPG2
  • Федора: sudo dnf установить dnf-plugins-core
  • Alpine: ничего не нужно. Зависимости будут установлены позже, автоматически.

Конфигурация репозитория пакета Debian/Ubuntu

На Debian или Ubuntu сначала временно установите некоторые переменные определенные ОС:

source /etc/os-release

Тогда убедитесь, что APT Доверь доверять репо:

curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo apt-key add -

ID будет либо «Ubuntu», либо «Debian», в зависимости от того, что находится в /etc/os-release Отказ

Затем добавьте и обновите информацию о репо, чтобы APT будет использовать его в будущем:

echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update

Конфигурация репозитория пакета Fedora

На Федора сначала добавьте репо Докер:

sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

Установить Docker

Теперь мы можем установить официальный документ докеров и клиентских инструментов:

  • Debian/Ubuntu: Sudo APT Установить Docker-CE Docker-CE-CLI Containerd.io
  • Федора: sudo dnf установить docker-ce docker-ce-cli containerd.io
  • Alpine (установить последний от края): Sudo APK Add Docker://dl-cdn.alpinelinux.org/alpine/geed/community

Добавить пользователя в Docker Group

Docker Daemon — это услуга, которую Docker требует запуска на заднем плане. Сервис ( Dockerd ) и клиент ( Docker ) общаются через розетку и/или сетевой порт. Для связи над розеткой требуется привилегированный доступ. Два способа получить этот доступ:

  • Беги Докер как root (то есть sudo docker )
  • Через членское членство в Группе, предоставляйте конкретные пользователи привилегированные доступ к сокетку докера

Другими словами, если вы не хотите использовать Sudo или root Access каждый раз, добавьте пользователя в группу Docker, названные Докер :

  • Fedora/Ubuntu/Debian: Sudo Usermod -Ag docker $ user
  • Alpine: Sudo Addgroup $ User Docker

Затем закройте окно WSL и запускайте WSL снова. Вы должны увидеть Докер Когда вы запускаете команду Группы в список членов группы.

Sharing Dockerd: Выберите общий идентификатор для группы Docker

Если вы планируете только с использованием одного WSL EDRO, этот следующий шаг не является строго необходимым. Тем не менее, если вы хотите, чтобы вы могли бы поделиться системой сокета Docker Socket, через дистрибутивы WSL, потом всем нужно будет поделиться общим идентификатором группы для группы Докер Отказ По умолчанию у каждого из них может быть другой идентификатор, поэтому новый в порядке.

Во-первых, давайте выберем один. Это может быть любой идентификатор группы, который не используется. Выберите номер Больше 1000 и Менее 65534 Отказ Чтобы посмотреть, какие идентификаторы группы уже назначены, которые являются 1000 или выше:

getent group | cut -d: -f3 | grep -E '^[0-9]{4}' | sort -g

Не могу решить, какой номер использовать? Могу ли я предложить 36257. (Просто наберите докр на вашей телефонной клавиатуре …) Вряд ли будет уже в использовании, но проверять все равно:

getent group | grep 36257 || echo "Yes, that ID is free"

Если вышеуказанная команда возвращает линию от /etc/group (Это не включает Docker ), затем выберите другой номер и попробуйте снова. Если он возвращает «Да, этот идентификатор свободен», то вы хотите пойти, со следующими:

sudo sed -i -e 's/^\(docker:x\):[^:]\+/\1:36257/' /etc/group

Или, если GroupMod Доступен (который он находится на Федоре, Убунту и Debian, но не альпийской, если вы не Sudo APK Add Shadow ), это безопаснее:

sudo groupmod -g 36257 docker

Как только идентификатор группы был изменен, закройте окно терминала и повторно запускайте свой WSL EDRO.

Обратите внимание, что вышеуказанные шаги с участием докер Группа необходимо будет запускать на любое распределение WSL, которое вы в настоящее время имеете или устанавливаете в будущем, если вы хотите дать ему доступ к общему сокетку Docker.

Настроить докер

Давайте сначала сделайте общий каталог для сокета Docker, и устанавливайте разрешения, чтобы Группа Docker может написать ему.

DOCKER_DIR=/mnt/wsl/shared-docker
mkdir -pm o=,ug=rwx "$DOCKER_DIR"
chgrp docker "$DOCKER_DIR"

Я предлагаю использовать файл конфигурации /etc/docker/daemon.json Чтобы установить параметры запуска Dockerd. Если /etc/docker каталог еще не существует, создайте его с помощью sudo mkdir/etc/etc/Docker/ Таким образом, он может содержать файл конфигурации. Тогда следующее, если размещено в /etc/docker/daemon.json Установите Docker Host на общий сокет:

{
  "hosts": ["unix:///mnt/wsl/shared-docker/docker.sock"]
}

ПРИМЕЧАНИЕ. На Debian (но не Fedora или Alpine или Ubuntu) я обнаружил, что мне нужно было отключить поддержку Dockerd iptables, чтобы Dockerd работать с NfTable по умолчанию. Я бы хотел услышать более вклад на это, если кто-то изменил опыт с Debian или другими проблемами DISTRO и NFTABLE/IPTables с Dockerd. Чтобы отключить поддержку iptables на конфиге, вы можете заставить его выглядеть так:

{
  "hosts": ["unix:///mnt/wsl/shared-docker/docker.sock"],
  "iptables": false
}

Запуск докера

Большинство дистрибутивов Linux используют SystemD или другую систему init, но имеет свою собственную систему init. А не крутить вещи, чтобы использовать существующую систему init, мы просто запускаем Докерд напрямую:

sudo dockerd

Должно быть несколько строк информации, предупреждения, связанные с Cgroup Blkio и тому подобное, с чем-то вроде API Прослушайте/mnt/wsl/shared-docker/docker.sock в конце. Если это так, у вас успех.

Откройте другой терминал WSL и попробуйте что-то вроде:

docker -H unix:///mnt/wsl/shared-docker/docker.sock run --rm hello-world

Вы должны увидеть «Привет от докера!» сообщение.

Запустите скрипт для докера

Следующие строки могут быть размещены в .bashrc или .профиль Если autolaunching желательна, или в отдельном скрипте оболочки. Например, вы можете захотеть создать скрипт ~/bin/docker-service так что вы можете запустить Docker-Service. Только когда вы хотите, вручную.

DOCKER_DISTRO="Debian"
DOCKER_DIR=/mnt/wsl/shared-docker
DOCKER_SOCK="$DOCKER_DIR/docker.sock"
export DOCKER_HOST="unix://$DOCKER_SOCK"
if [ ! -S "$DOCKER_SOCK" ]; then
    mkdir -pm o=,ug=rwx "$DOCKER_DIR"
    chgrp docker "$DOCKER_DIR"
    /mnt/c/Windows/System32/wsl.exe -d $DOCKER_DISTRO sh -c "nohup sudo -b dockerd < /dev/null > $DOCKER_DIR/dockerd.log 2>&1"
fi

Обратите внимание, что Docker_distro должен быть установлен на дистрибутив, вы хотите запустить докер . Если не уверены из имени, просто запустите wsl -l -q От PowerShell, чтобы увидеть ваш список распределений WSL. Выберите правильный и установите его на Docker_distro Отказ

Скрипт выше делает следующее:

  • Устанавливает переменную среды $ Docker_host указать на общее сокет. Это не нужно для Докерд Но это позволит запустить Докер без необходимости указывать -H UNIX:///mnt/wsl/shared-docker/docker.sock каждый раз.
  • Проверяет, если Docker.sock Файл уже существует и является сокетом. Если он присутствует, ничего не делай. Если нет, то скрипт делает оставшиеся шаги, следующим образом.
  • Создает общий каталог докеров для сокета и Докерд Журналы, настройки разрешений соответствующим образом
  • Бежит Докерд из указанного дистриба Отказ Это важно, потому что это позволяет запускать любой WSL для запуска докер Если это еще не работает.
  • Когда Докерд Запускается, трубайте его вывод и ошибки к общему файлу журнала.
  • Когда Докерд Запускается, он работает на заднем плане, поэтому вам не нужно посвятить окно терминала к процессу, поскольку мы сделали ранее. sudo -b Флаг дает нам это, и мы бежим с нога так что он работает независимо от терминала, с явным нулевым входом в Nohup избегать дополнительных предупреждений. Как стандартные выводы, так и ошибки записываются в логину, поэтому 2> & 1 перенаправить.

Запуск Passhentless Of Dockerd

Если вышеуказанный скрипт размещен в .bashrc (большинство дистрибутивов Linux) или .Profile (Distries, как Alpine, которые имеют золь/приборную среду в качестве оболочки по умолчанию) или другой скрипт init Shool, затем он имеет неудачный побочный эффект: вы, скорее всего, будут предложены для пароля, который больше всего запускается, что запущено новое окно терминала.

Работать вокруг этого, вы можете, если вы выберете, скажите Sudo Чтобы предоставить доступ к паролюисту к докер , Пока пользователя является членом Докер группа. Сделать это, введите Sudo Visudo и добавьте следующую строку (если ваш Visudo использует VI или погибший Затем обязательно нажмите » Я «Чтобы начать редактирование и нажмите Esc, когда закончите редактирование):

%docker ALL=(ALL)  NOPASSWD: /usr/bin/dockerd

Сохранить и выйти (« : WQ », если редактор есть VI , или Ctrl-X, если это Nano ), а затем вы можете проверить, если Sudo Dockerd Подсказывает пароль или нет. Для душевного спокойствия вы можете дважды проверить: что-то вроде sudo -k ls -a/root Должен еще необходим пароль, если только пароль не был введен недавно.

Убедитесь, что $ Docker_Host всегда устанавливается

При использовании сценария ранее запустите Докерд Тогда $ Docker_host будет установлен, а будущие вызовы Докер не понадобится громоздкий -H UNIX:///mnt/wsl/shared-docker/docker.sock

Если этот сценарий уже в вашем .bashrc или .профиль Тогда следующее не нужно. Если, однако, вы вручную ссылаетесь Докер Каким-то образом, то следующее может быть желательно в вашем .bashrc или .Profile :

DOCKER_SOCK="/mnt/wsl/shared-docker/docker.sock"
test -S "$DOCKER_SOCK" && export DOCKER_HOST="unix://$DOCKER_SOCK"

Вышеуказанные проверки для сокета докеров в /mnt/wsl/shared-docker/docker.sock И, если присутствует, устанавливает $ Docker_host Переменная среды соответственно. Если вы хотите более обобщенного «если это WSL, то установите сокет Pro-активно», то вы можете предпочесть следующее, которое просто проверяет наличие наличия /mnt/wsl каталог и устанавливает сокет Docker, если так:

[ -d /mnt/wsl ] && export DOCKER_HOST="unix:///mnt/wsl/shared-docker/docker.sock"

Бегущий докер из окон

Если настроен, как указано выше, я рекомендую всегда работать докера из WSL. Хотите запустить контейнер? Сделать это из окна WSL. (См. Смешите мою статью об использовании терминала Windows для удобного способа использования WSL и PowerShell.)

Это также не только относится к терминалу. Например, VSCode поддерживает Docker в WSL 2 Отказ

Но если вы хотите удобство и утилиту бегового докера в окне PowerShell у меня есть пара предложений.

Один — выставить Докерд через порт TCP. Этот метод будет исследован в более поздней статье.

Упрощенный метод, который я рекомендую: функция PowerShell, которая вызывает WSL Докер прохождение по любым аргументам. Эта функция может быть размещена в вашем профиле PowerShell, обычно находится в ~ \ Documents \ WindowsPowerShell \ Microsoft. PowerShell_Profile.ps1.

$DOCKER_DISTRO = "fedora"
function docker {
    wsl -d $DOCKER_DISTRO docker -H unix:///mnt/wsl/shared-docker/docker.sock @Args
}

Опять же, попробуйте WSL -L. -q Чтобы увидеть список ваших дистрибутивов WSL, если вы не уверены, какой использовать.

Убедитесь, что демон Docker работает, затем запустите новое окно PowerShell и попробуйте Привет-мир контейнер снова. Успех?

Вы также можете сделать пакетный файл с соответствующей командой в нем. Например, назвать его docker.bat и место в C: \ Windows \ System32 или другое расположение включено в % Путь% Отказ Следующее содержимое будет работать в таком скрипте:

@echo off
set DOCKER_DISTRO=fedora
wsl -d %DOCKER_DISTRO% docker -H unix:///mnt/wsl/shared-docker/docker.sock %*

Вы могли бы пойти еще дальше и убедиться, что Докер работает всякий раз, когда вы запускаете PowerShell. Предполагая, что Докерд Запустите скрипт подробного выше, сохраняется в файле в WSL AS $ Главная/Bin/Docker-Service И исполняется исполняется (попробуйте chmod a + x $ home/bin/docker-service ), то следующая строка в вашем профиле PowerShell запускается Докерд автоматически:

wsl -d $distro ~/bin/docker-service

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

function Docker-Service {
  Param ([string]$distro)
  $DOCKER_DIR = "/mnt/wsl/shared-docker"
  $DOCKER_SOCK = "$DOCKER_DIR/docker.sock"
  wsl -d "$distro" sh -c "[ -S '$DOCKER_SOCK' ]"
  if ($LASTEXITCODE) {
    wsl -d "$distro" sh -c "mkdir -pm o=,ug=rwx $DOCKER_DIR ; chgrp docker $DOCKER_DIR"
    wsl -d "$distro" sh -c "nohup sudo -b dockerd < /dev/null > $DOCKER_DIR/dockerd.log 2>&1"
  }
}

Эта функция принимает один параметр: имя диета.

Во всех вышесказанных принцип одинаково: вы запускаете исполняемые файлы Linux, используя WSL взаимодействие Отказ

Примечание на креплениях Binds: остаться на файловой системе Linux

С докером можно установить каталог хост-системы или файлы в контейнере. Следующее часто работает, но это не Целесообразно при запуске WSL Docker из Windows:

echo "

Hello, World

" > index.html docker run -p "8080:80" -v "$PWD:/usr/share/nginx/html:ro" nginx

Вместо того, чтобы делать вышеперечисленные случайно, при запуске WSL Docker от PowerShell, две рекомендации:

  1. По причинам эффективности только связывайтесь крепление из файловой системы Linux. Чтобы добраться до каталога Linux в PowerShell, попробуйте что-то вроде CD (WSL WSLPath -m ~/путь/к/my/dir)
  2. Вместо $ PWD Чтобы получить текущий каталог, попробуйте $ (WSLPath -a.) ' И, да, отдельные цитаты полезны для выхода.

Пример:

cd (wsl wslpath -m ~)
mkdir html
cd html
echo "

Hello, World

" > index.html docker run -p "8080:80" -v '$(wslpath -a .):/usr/share/nginx/html:ro' nginx

Затем укажите браузер на http://localhost: 8080 и счастье приведет к счастью. (В зависимости от Конфигурация вашей сети , вы можете вместо этого вам нужно получить доступ к этому через http://[WSL IP-адрес]: 8080, который следует получить с ifconfig или IP Addr Несомненно

Попробуйте WSL WSLPath от PowerShell или просто WSLPath От Linux, чтобы увидеть варианты. Это очень полезный инструмент, чтобы сказать наименее.

Пример скриптов

После прохождения по шагам в этой статье вы должны теперь иметь работу и потенциально автозапуск Докерд Общий сокет Docker и удобно настроен Докер команда.

Некоторые из приведенных выше примеров кода были помещены в скрипты в Companion GitHub Repo . Я суммирую файлы, доступные здесь:

  • Docker-service.sh Является ли скрипт оболочки Unix для запуска докер
  • Docker-Service.ps1 Содержит функцию PowerShell для запуска Докерд в WSL
  • docker.bat это файл пакет Windows для запуска WSL Докер от CMD
  • Docker.ps1 Содержит функцию PowerShell для запуска WSL Докер от PowerShell, если размещен в вашем профиле

Без сомнения, есть пути, которыми они могут быть подрезаны, чтобы быть более полезными и надежными; Не стесняйтесь публиковать в комментариях.

Заинтересованы в дальнейшем Tinkering с WSL 2?

Другие статьи, которые я написал на WSL:

  • Используя подмана вместо докера
  • Вам, вероятно, не нужна SystemD на WSL
  • Установить Fedora на WSL
  • Как обновить из Fedora 32 до Fedora 33

Оригинал: «https://dev.to/bowmanjd/install-docker-on-windows-wsl-without-docker-desktop-34m9»