Доступ к интерфейсу хоста из 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