Podman и Docker: совместное использование сети и/или разрешения имен между службами?

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

Итак, у меня есть сеть Docker с именем home, в которой находятся все мои контейнеры с правами root (или контейнеры Docker, которые было слишком сложно перенести на Podman).

sudo docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
9d5788b45048   bridge               bridge    local
b1f4756feab4   home                 bridge    local
5d7ee6579f19   host                 host      local
8678a773e2f2   none                 null      local

И для Podman у меня очень похожая конфигурация.

podman network ls
NETWORK ID    NAME        DRIVER
8b17ae3d5d67  home        bridge  
2f259bab93aa  podman      bridge

В чем проблема? Оказывается, что разрешение имен для контейнеров не работает между одной сетью и другой. Например, у меня запущен nginx-proxy-manager на Podman, и я хочу перенаправить http://domain/freshrss на сервис freshrss, указав freshrss и соответствующий номер порта. Это не работает, и это имеет смысл, так как сети Docker и Podman по сути отделены друг от друга.

Поэтому мой вопрос прост: есть ли способ объединить эти две сети в одну сеть, связав их вместе, не нарушая целостности индивидуальных сетевых конфигураций? В качестве альтернативы, есть ли какой-либо способ обойти эту проблему с коммуникацией, не указывая доменное имя в перенаправлении и порте? Например, я думал, что перенаправление на 127.0.0.1:<порт freshrss> сработает, так как это должно идти на хост, а затем подключаться к соответствующему порту, но это не сработало.

docker/podman compose адаптированные ответы приветствуются, так как именно так я настраиваю свои сервисы.

Например, я думал, что перенаправление на 127.0.0.1: сработает, так как это должно идти на хост,

127.0.0.1 внутри контейнера всегда означает “этот контейнер” (если вы не работаете в режиме сетевого хоста). Если вы хотите ссылаться на порт, который опубликован на хосте, то вам нужно использовать IP-адрес, назначенный одному из интерфейсов хоста. Вы можете использовать волшебное имя хоста host.docker.internal во многих случаях для обращения к вашему хосту; в последних версиях Podman это доступно по умолчанию, а в Docker это доступно, если (a) вы используете Docker Desktop на Windows или MacOS, или (b) вы на Linux и вы включаете --add-host host.docker.internal:host-gateway в командной строке docker run.

Это означает, что если вы запускаете контейнер следующим образом:

docker run -d --name myservice -p 8888:8888 myservice:latest 

Тогда из контейнера Podman или Docker вы можете получить доступ к сервису следующим образом:

curl http://host.docker.internal:8888

Нет простого способа сделать разрешение имен работающим между двумя средами.

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

Вопрос о совместном использовании сетей Docker и Podman: Решение проблемы

В последнее время всё больше специалистов в области информационных технологий сталкиваются с необходимостью интеграции различных контейнерных технологий, таких как Docker и Podman. Когда речь идет о взаимодействии между сервисами, работающими в этих двух окружениях, часто возникает проблема сетевого взаимодействия и разрешения имен. В данной статье мы рассмотрим, как можно эффективно организовать работу контейнеров в Docker и Podman, устраняя проблемы с сетевыми конфигурациями.

Описание текущей ситуации

У вас уже создана сеть Docker под названием home, в которой находятся контейнеры Docker, и аналогичной сети Podman с тем же именем. Однако при попытке организовать взаимодействие между сервисами, работающими в этих двух сетях, возникают затруднения с разрешением имен. Например, вы хотите настроить редирект из http://domain/freshrss на сервис freshrss, который работает в Podman, однако стандартные механизмы разрешения имен не позволяют свести воедино эти две сети.

Таким образом, ваша задача заключается в том, чтобы либо объединить эти две сети, сохраняя при этом их индивидуальные конфигурации, либо найти способ обойти указанные трудности, не прибегая к усложнению конфигурации доменных имен.

Возможные решения и рекомендации

  1. Сетевой мост (Bridge Network)
    Одним из способов решения данной проблемы является создание отдельного сетевого моста, который будет доступен для обоих окружений. Вы можете создать временный сетевой мост в вашем хосте и подключить контейнеры из Docker и Podman к этому мосту. Для этого необходимо:

    • Создать новый мост на уровне хоста.
    • Подключить контейнеры Docker и Podman к этому мосту.

    Однако данный метод может нарушить индивидуальные сетевые настройки, что может быть неприемлемо для многих сценариев.

  2. Использование host.docker.internal
    Как упоминалось ранее, внутри контейнера адрес 127.0.0.1 ссылается лишь на сам контейнер. В некоторых версиях Docker и Podman можно использовать специальное имя host.docker.internal, чтобы обратиться к сервисам, запущенным на хосте. Для этого выполните следующие шаги:

    • В Docker добавить флаг --add-host host.docker.internal:host-gateway при запуске контейнера.
    • В Podman это имя является доступным по умолчанию.

    Это позволит контейнерам Docker и Podman обращаться к сервисам на хосте, используя адрес http://host.docker.internal:порто́н.

  3. Настройка прокси-сервиса
    Можно также рассмотреть возможность настройки прокси-сервиса, который будет доступен в обеих средах. Например, если у вас работает nginx или traefik, вы можете настроить его так, чтобы он принимал запросы на уровне хоста и перенаправлял их на соответствующие контейнеры. Это обеспечит единый вход для всех внешних запросов и упростит обработку имен.

  4. Сетевые алиасы и статические IP-адреса
    Другим подходом является использование статических IP-адресов и описания алиасов для контейнеров. Настройки статического IP в Docker и Podman позволят вам явно указывать адреса и имена, что может помочь в разрешении имен.

Заключение

Вам предстоит выбрать оптимальный вариант интеграции, исходя из уникальных целей вашего проекта и соответствующих бизнес-требований. Решения варьируются от создания сетевых мостов до использования прокси-сервисов и статических IP-адресов. Каждый подход имеет свои плюсы и минусы, и лучший выбор определяется спецификой вашей системы и задачами, которые необходимо решить.

Если у вас возникнут дополнительные вопросы или понадобится более углубленная информация о конкретных конфигурациях, не стесняйтесь обращаться.

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

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