The hosts began the game on the front foot and dominated possession, but Borussia Dortmund seemed more than willing to allow Manchester City time on the ball.
Manchester City took the lead less than 20 minutes into the game when Emre Can carelessly conceded possession in midfield. That allowed Pep Guardiola's men to break before Kevin De Bruyne converted from close range.
There was controversy in the first half when referee Ovidiu Hategan awarded a penalty to Manchester City for Can's foul on Rodri. However, VAR correctly overturned the decision, but Can's booking was not reversed.
Towards the end of the first half, English teenager Jude Bellingham robbed Ederson of the ball just outside the area and was through on goal with the net gaping.
The match official blew his whistle for a foul by the Englishman on Ederson. Replays, though, showed that it was a clean dispossession. But the referee's bizarre decision not to let Bellingham score first and then consult with his VAR for any foul left Borussia Dortmund berated.
The second half saw a drop in intensity from both sides. With Manchester City failing to build on their advantage, Borussia Dortmund restored parity five minutes from time, courtesy an effort from the visiting captain Marco Reus..
However, stung by the goal, Manchester City broke out of their stupor and reasserted their ascendancy. A sublime ball behind the Borussia Dortmund defence from De Bruyne saw Ilkay Gundogan and Phil Foden in space. The German squared the ball to Foden to score the winner.
A deserved win for Manchester City sees them head into the second leg with a first-leg lead. But Borussia Dortmund would fancy their chances of turning around the tie at home, thanks to their crucial away goal.
On that note, let's take a look at five hits and flops from either team.
Hit: Joao Cancelo (Manchester City)
Joao Cancelo has come to life for Manchester City this campaign. He has easily been Pep Guardiola's first-choice full-back on either flank.
Against Borussia Dortmund, the former Juventus man was played on the left side of defence, where he once again showed why he is so highly rated. Cancelo registered the most touches and passes on the night as he thrived as a key attacking outlet.
Cancelo was marauding down the flanks, easily scampering past Borussia Dortmund players while also being dutiful defensively.
Flop: Emre Can (Borussia Dortmund)
The former Liverpool man was at fault for the first goal of the game, as he carelessly gave the ball away to Riyad Mahrez under absolutely no pressure. Manchester City capitalised on Can's sloppiness, quickly broke through on goal and scored the opener.
A few minutes later, the German was adjudged to have given away a penalty after a high boot on Rodri. The decision was overturned on review, but the incident pretty much summarised Can's performance for large spells of the game: overzealous and erratic.