Henrikh Mkhitaryan's sublime solo goal proved the difference as second-placed Dortmund moved within five points.
The Armenia captain ran at the away defence from deep before firing into the bottom corner from 20 yards.
Pep Guardiola's side can restore their eight-point lead with a win at relegation battlers Augsburg on Sunday.
Bayer Leverkusen moved into third when they fought back from behind to win 2-1 at Darmstadt, while Hertha Berlin dropped to fourth after losing 2-0 at Stuttgart.
Second-bottom Hoffenheim, with new 28-year-old manager Julian Nagelsmann taking charge for the first time, drew 1-1 at relegation rivals Werder Bremen.
Borussia Dortmund narrowed the gap on Bundesliga leaders Bayern Munich with a hard-fought win against bottom side Hannover.