%20Docker%2C%20%D0%B4%D0%B0%D0%B6%D0%B5%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%BE%D0%BD%D0%B0%20%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%B0%3F.png)
У меня есть стек контейнеров (указанный с помощью 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
учетной записи суперпользователя и надежные пароли для всех остальных учетных записей, так что я полагаю, что это достаточно безопасно. По крайней мере, это работает, и я не смог найти другого способа заставить это работать.