Как запустить Podman и Docker-Compose в Windows
2 июня 2022 г.Как вы знаете, контейнеры — это вещь Linux. Microsoft представила свое [решение] (https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/), но я никогда не видел, чтобы они использовались.
Для использования контейнеров у нас есть в основном две альтернативы: docker и podman. Я предпочитаю последнее по двум причинам. Потому что он имеет архитектуру без демонов и потому что ему не нужны права суперпользователя. Но использовать его с docker-compose в Windows сложно. Именно поэтому я решил написать и поделиться этой историей.
Мотивация
Я думаю, что использование Docker Desktop в Windows — это самый быстрый способ использования контейнеров. Он сам все настраивает. Но, исключая архитектурные предпочтения, я нашел еще две причины избегать этого:
- Проблема с лицензией. Docker Desktop требует лицензии на пользователя для коммерческого использования в крупных компаниях.
- Вам это не нужно. Например, я никогда не использовал его графический интерфейс. Наверное, потому что я так привык использовать его в линуксе из cli.
Предпосылки
Использование podman в Windows возможно благодаря WSL2. Microsoft предоставляет инструкции в соответствии с вашей версией Windows. Вы можете найти их здесь: https://docs.microsoft.com/en-us/windows/wsl/install.
Podman поддерживает docker-compose с версии 3.0.0.
TL;DR
Следующие абзацы посвящены проблемам, которые я обнаружил в Debian и Ubuntu. Итак, зачем нам OpenSUSE Tumbleweed в качестве дистрибутива Linux. По этой причине я резюмировал в параграфе Заключение только необходимые шаги.
дистрибутивы Linux
В Microsoft Store есть несколько дистрибутивов Linux. И вот тут начался мой путь.
:::Информация
Общие решения о дистрибутивах находятся в разделе «Устранение неполадок».
Дебиан
Текущий стабильный дистрибутив Debian — это версия 11. Он имеет кодовое название Bullseye, и это первый дистрибутив, который я попытался использовать.
Первое, что нужно проверить, это наличие podman в официальном репозитории. К счастью, это так, и в настоящее время это версия 3.0.1. Итак, он должен работать с docker-compose.
Итак, я обновил систему и установил podman и docker-compose:
``` ударить
$ sudo подходящее обновление
$ sudo подходящее обновление
$ sudo apt установить podman docker-compose
Затем я настроил podman, чтобы избежать использования systemd. На WSL2 мы не можем полагаться на него, потому что система инициализации — это специальное решение Microsoft.
Для этого я скопировал /usr/share/containers/containers.conf
в $HOME/.config/containers
. Потом поменял последний. В частности, я установил для cgroup_manager
значение cgroupfs
, а для events_logger
значение file
:
[двигатель]
cgroup_manager = "cgroupfs"
event_logger = "файл"
Я нашел эти советы на https://www.redhat.com/sysadmin/podman-windows-wsl2.
Затем я попытался запустить простой контейнер:
``` ударить
$ docker run -dp 8080:80 docker.io/httpd
Но я получил: «Ошибка: ошибка инициализации исходного докера… x509: сертификат, подписанный неизвестным центром». Чтобы решить эту проблему, я установил ca-certificates
. Затем я попытался снова запустить контейнер:
``` ударить
$ sudo apt установить ca-сертификаты
$ docker-run -dp 8080:80 docker.io/httpd
На этот раз получилось! И хост может добраться до контейнера.
Итак, я попробовал простой docker-compose для проверки связи между двумя контейнерами:
``ямл
версия: "3.7"
Сервисы:
дБ:
изображение: docker.io/mariadb
перезапуск: всегда
Окружающая среда:
MYSQL_ROOT_PASSWORD: пароль
phpmyadmin:
изображение: docker.io/phpmyadmin
перезапуск: всегда
порты:
- 8080:80
Окружающая среда:
- PMA_ARBITRARY=1
Но я получил эту ошибку:
``` ударить
$ docker-компоновать
ОШИБКА: не удалось подключиться к демону Docker по адресу http+docker://localhost — он запущен?
Если он находится в нестандартном месте, укажите URL-адрес с переменной среды DOCKER_HOST.
Очевидно, что он не запущен. Итак, я проверил документацию podman, и нам нужно запустить сокет podman вручную. Мы должны сделать это вручную, потому что мы не можем полагаться на службу systemd. Затем мы должны указать расположение сокета для docker-compose.
``` ударить
$ системная служба podman --time=0 unix:///home/user/podman.sock &
[1] <число>
$ docker-compose -H unix:///home/user/podman.sock up
Вытягивание изображений...
Создание изображений...
ОШИБКА: для <имя службы> сетевое подключение не включено для контейнеров без рута
ОШИБКА: для <имя службы> сетевое подключение не включено для контейнеров без рута
Я искал ошибку и нашел GitHub [issue] (https://github.com/containers/podman/issues/9169) о podman. Кажется, это ошибка, исправленная в версии 3.2.
Итак, я искал другие поддерживаемые дистрибутивы Linux в надежде найти более новую версию podman.
Убунту
В настоящее время существует три версии Ubuntu:
- 18.04.5 ЛТС
- 20.04.4 ЛТС
- 22.04 ЛТС
Но, как и Debian, они не поддерживают последнюю версию Podman. По этой причине я их вообще не пробовал. И в этот момент я был немного немотивирован. Я был бы признателен за скользящий дистрибутив. И вот когда я вижу OpenSUSE Tumbleweed в магазине Microsoft Store…
Перекати-поле OpenSUSE
OpenSUSE Tumbleweed — это скользящий дистрибутив. Это означает, что он поддерживает последние версии пакетов. Действительно, текущая версия podman — 4.0.3. Еще одна хорошая новость заключается в том, что я использовал Tumbleweed в течение нескольких лет, и это было здорово!
Итак, я обновил систему и установил podman и docker-compose:
``` ударить
$ sudo zypper обновление
$ sudo zypper установить podman docker-compose
На данный момент я настроил podman так, чтобы он не использовал systemd, как Debian.
Я попытался запустить простой контейнер, открывающий порт. И это сработало.
Итак, я запустил сокет podman. Затем я запустил docker-compose с тем же файлом. И два контейнера завелись!
Но когда я попытался подключиться к базе данных из phpmyadmin, я получил следующую ошибку:
Ошибка getaddrinfo: имя или служба неизвестны
Я немного исследовал и обнаружил, что контейнеры не могут обмениваться данными через DNS-имя.
По этой причине я исследовал сеть в Podman 4.x и обнаружил, что они изменили сетевой стек. Но он также должен поддерживать разрешение DNS.
Тем не менее, podman продолжает поддерживать старый сетевой стек (например, cni) по соображениям совместимости. Итак, я проверил, какой стек включен, и это был старый. Итак, я изучил это и разрешение DNS и нашел [официальную статью] (https://podman.io/getting-started/network#using-dns-in-container-networks). Старый стек поддерживает плагины, и один из них касается разрешения DNS-имен: dnsname
.
Итак, я искал его в репозитории Tumbleweed, и он был там. Итак, я установил его:
``` ударить
$ sudo zypper установить cni-plugin-dnsname
И на этот раз контейнеры взаимодействовали корректно.
Кроме того, я принудительно добавил старый стек в podman в $HOME/.config/containers/containers.conf
:
[сеть]
network_backedn = "cni"
Исправление проблем
Не удалось разрешить DNS в WSL2
В каждом дистрибутиве мне не удавалось разрешить доменные имена. Например, я получил такие ошибки, как:
Временная ошибка при разрешении ‘<имя домена>’
W: Не удалось получить <URL-адрес>
Сообщение об ошибке: Не удалось разрешить хост: <имя хоста>'
Итак, я прочитал файл /etc/resolv.conf
, и там был плохой DNS-сервер. К счастью, Microsoft добавила подсказку:
Этот файл был автоматически сгенерирован WSL. Чтобы остановить автоматическое создание этого файла, добавьте следующую запись в /etc/wsl.conf:
[сеть]
generateResolvConf = false
сервер имен
Итак, я написал файл /etc/wsl.conf
:
[сеть]
сгенерироватьResolvConf = ложь
Затем я удалил файл /etc/resolv.conf
(это была ссылка) и создал правильный:
сервер имен
Вывод
Как видите, запуск podman с docker-compose в Window был путешествием. Мы прошли много шагов. Итак, чтобы упростить и лучше организовать их, я снова написал здесь:
- Установите WSL2
- Установите OpenSUSE Tumbleweed как дистрибутив Linux.
- Исправьте /etc/resolv.conf, если не удается разрешить DNS-имя в раздаче
- Обновить раздачу
- Установите podman, docker-compose и cni-plugin-dnsname.
- Настройте podman, чтобы он не использовал systemd
- Настройте podman для использования cni в качестве сетевого сервера.
- Запустите сокет podman
- Прибыль
На этом этапе вы можете настроить свой опыт, чтобы упростить рабочий процесс. Например, псевдонимы команд или добавление команд при загрузке.
Оригинал