Потому что надо указывать имя хоста для подключения в том виде, в котором он описан в docke-compose-файле, т.е. "postgres"
Потому что реальное имя контейнера зависит от параметров запуска, про которые контейнер ничего не знает, поэтому докер внутри контейнера прописывает алиасы к другим контейнерам по их именам в compose-файле
$dbconn = pg_connect("host=postgres port=5432 dbname=messenger user=admin password=root")