тут нужно понимать, что вот это 0.0.0.0:5000->5000/tcp - к самому контейнеру не относится
это настройка порфорвардинга в сетевом драйвере самого докера
И она нужна для того чтоб к контейнеру обратиться снаружи и не имеет отношения к связи контейнеров друг с другом.
Возможно в вашем случае порт postgres выставлять вообще не стоит из соображений безопасности
между собой контейнеры (внутри одного хоста) обращаются без выхода наружу по своим внутренним адресам
postgres: "IPAddress": "172.17.0.3"
flask: "IPAddress": "172.17.0.4"
адреса контейнерам назначает докер, поэтому именно адреса использовать не стоит, а лучше использовать имена. докер для этого предоставляет параметр --link
он нужен чтобы докер сделал запись (IP адрес ->
имя_контейнера_с_которым_нужна_связь) в /etс/hosts контейнера
так же необходимо передать
имя_контейнера_с_которым_нужна_связь внутрь приложения
потому что, понятно, что localhost ни разу не годится. он у каждого контейнера свой и не совпадает с localhost хоста
для этого можо использовать переменные окружения и соответственно параметр
-e
ну и внутри приложения вот примерно такой строкой делаем приложение docker-ready
PG_HOSTNAME = environ.get("PG_HOSTNAME") if environ.get("PG_HOSTNAME") else "localhost"
контейнеры в итоге запускать примерно так:
docker run -d --name postgress postgress
docker run -d --name flask --link postgress -e PG_HOSTNAME=postgress flask
disclaimer: я за докером давно не слежу. сейчас заметил, что параметр --link отмечен как legacy. Так что, возможно, я предлагаю немодное решение, но оно до сих пор работает