Как обеспечить существование сети (интерфейса) Docker, даже если она не запущена?

Как обеспечить существование сети (интерфейса) Docker, даже если она не запущена?

У меня есть стек контейнеров (указанный с помощью docker-compose.yml). Для стека требуется база данных PostgreSQL, но я использую локально запущенный собственный экземпляр вместо того, чтобы сделать его частью стека (например, чтобы упростить резервное копирование и сэкономить ресурсы). Экземпляр PostgreSQL настроен на привязку и прослушивание 172.17.0.1, IP-адреса, по которому хост доступен из контейнеров Docker.

Однако во время запуска системы PostgreSQL не привязывается к этому адресу, и контейнеры впоследствии не инициализируются. Если я перезапускаю PostgreSQL после этого, я вижу, что он привязан (через ss), и контейнеры инициализируются нормально. Это на 100% воспроизводится при каждой загрузке.

Я думаю, это потому, что интерфейс еще не существует, поэтому не к чему привязываться. Есть ли способ "сохранить" сеть (или интерфейс), чтобы его можно было привязать, даже если docker еще не инициализирован?

(Я также пытался указать After=docker.serviceв файле службы systemd для PostgreSQL, но безуспешно — думаю, это потому, что, хотя docker уже инициализирован, стеки контейнеров еще не инициализированы, и поэтому сети еще не созданы. Указать «ждать запуска контейнера docker» в systemd, насколько мне известно, невозможно.)

решение1

Я имел дело с той же проблемой. Я нашел решение, но оно может вам не понравиться. Если вы установите listen_addressesв Postgresql значение '*', то он будет привязываться к 0.0.0.0адресу, который будет получать трафик со всех интерфейсов. Я подтвердил, что это работает правильно на нескольких серверах.

Да, грех позволять вашему серверу БД привязываться к вашему публичному адресу. У вас уже должен быть UFW, блокирующий внешний трафик, плюс строго настроенный, pg_hbaразрешающий только соединения с соответствующими БД из подсети Docker, плюс только локальная аутентификация unix для postgresучетной записи суперпользователя и надежные пароли для всех остальных учетных записей, так что я полагаю, что это достаточно безопасно. По крайней мере, это работает, и я не смог найти другого способа заставить это работать.

Связанный контент