Foden had missed a series of chances to double City's lead earlier in the second-half, but made amends at the death to give Pep Guardiola's men the advantage with the second leg to come in Germany on April 14.
City have failed to get beyond the last eight in their previous four seasons under Guardiola and once again struggled replicate their scintillating Premier League form on the European stage.
The English side were overwhelming favourites before a ball was kicked against a Dortmund side that has fallen seven points adrift of the top four in the Bundesliga.
By contrast, City men have now won 27 of their last 28 games in all competitions to remain on course for a historic quadruple of Champions League, Premier League, FA Cup and League Cup.
But the hosts had to ride their luck to take a narrow advantage to Germany next week.
A composed start from Dortmund was undone when Emre Can gifted the ball away to Riyad Mahrez inside the City half.
The Algerian started a brilliant team move as De Bruyne, Foden and Mahrez exchanged passed before the Belgian tapped home from close range.
City thought they had a great chance to double their advantage moments later when Rodrigo went down under Can's challenge inside the area and referee Ovidiu Hategan pointed to the penalty spot.
Hategan, though, rightly overturned his call on a VAR review in the first of a number of dubious decisions from the Romanian official.
His next big call ruled out a Dortmund goal when Hategan adjudged Jude Bellingham to have fouled Ederson as he dispossessed the Brazilian and tapped into an empty net just before half-time.
Haaland was the focus of much of the pre-match hype with City one of a number of clubs interested in the Norwegian wonder kid.
The 20-year-old had failed to score in just two of his previous 14 Champions League appearances, but he spurned his one big chance to net early in the second-half.
Haaland showed great strength and pace to outmuscle and outsprint Ruben Dias, but could not lift the ball over the advancing Ederson.
De Bruyne was at the heart of all of City's most dangerous moments as Foden should have done better than fire too close to Marwin Hitz with the goal gaping.
The City captain then sent a low shot inches wide before once more picking out Foden, who saw another effort beaten away by Hitz.
Haaland showed he is more than just a goalscorer as his brilliant reverse ball released Reus to fire beyond Ederson in what seemed a sting in the tale.
But Dortmund could not hold out in the closing stages as City pushed for a winner.
De Bruyne was the creator again as his cross found Ilkay Gundogan at the back post and his cut-back was swept home by a relieved Foden.