Доступ к интерфейсу хоста из Docker-контейнера#
Ориентируемся на https://stackoverflow.com/a/46449030
Мне нужно было подключиться из Docker-контейнера к базе данных PostgreSQL, работающей на хост-системе.
При запуске контейнера добавляем опцию –add-host и в реквизитах
подключения вместо localhost или 127.0.0.1 пишем host.docker.internal
:
...
--add-host host.docker.internal:host-gateway \
-e PHOTOVIEW_POSTGRES_URL=postgres://photoview:xxxxx@host.docker.internal:5432/photoview \
...
Далее делаем магию со StackOverflow с небольшими изменениями:
# sysctl -w net.ipv4.conf.docker0.route_localnet=1
# iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 5432 -j DNAT --to 127.0.0.1:5432
# iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 5432 -j ACCEPT
Теперь у контейнера появился доступ к сетке хоста (а именно, к 127.0.0.1), но надо ещё донастроить постгрес.
/etc/postgresql/12/main/pg_hba.conf
local photoview photoview scram-sha-256
host photoview photoview 172.17.0.0/24 scram-sha-256
Оставляем возможность подключаться с локалхоста и также разрешаем коннекты с интерфейса докера.
Рестуртуем постгрес и радуемся:
# systemctl restart postgresql.service
Чтобы ничего не развалилось после рестарта системы надо сохранить правила iptables и записать конфиг sysctl.
# apt install iptables-persistent
# dpkg-reconfigure iptables-persistent
# systemctl enable --now iptables.service
# echo 'net.ipv4.conf.docker0.route_localnet=1' > /etc/sysctl.d/80-docker0-custom.conf
# sysctl -p