A Riyad Mahrez penalty could have made it four wins from five in the competition so far this season, but the Algerian was denied from the spot by goalkeeper Gregor Kobel.
Pep Guardiola’s side are three points ahead of Dortmund with one match remaining, but the head-to-head record after our September victory over the German club ensures we cannot be overtaken. The point also means Dortmund will progress in second place.
We can now look forward to November’s Round of 16 draw knowing we will face another group’s runners-up.
The Blues kept our German hosts at arm’s length throughout the night, with debutant goalkeeper Stefan Ortega Moreno rarely called into action.
While the 3,526 in the away end, including supporters from 40 different nations, left without seeing a goal, they can be content that the hard work in the group stage is now complete with a game to spare.
Story of the Match
Dortmund had the first chance of the night at a packed out Westfalenstadion, but John Stones denied Julian Brandt just as the German attacker was winding up a shot.
It was Brandt who had the first blow on goal however, firing a 25-yard free-kick over Stefan Ortega Moreno’s goal.
Ortega Moreno was called upon for the first time in the 16th minute when Karim Adeyemi cut in from the right and hit a low left-footed shot that the goalkeeper swatted away.
With three central defenders and Joao Cancelo and Riyad Mahrez moving into wide spaces, we rotated between a number of formations.
It was through the middle that our first chance of the night was created, but Haaland was shut out by a last-ditch tackle from talismanic Dortmund captain Mats Hummels.
The German side focused their attacks through Adeyemi down the right and it was the 20-year-old who created the best chance of the first half. He burst beyond City’s high line and fired a ball across that Youssoufa Moukoko diverted wide from inside 10 yards.
Dortmund came out the more aggressive in the second period, with Ake and Ortega Moreno denying each of Adeyemi and Bellingham in quick succession.
City had a penalty just before the hour mark when Mahrez was felled by an erratic Emre Can challenge. The Algerian picked himself up to take the spot kick but was disappointed to see Swiss international Gregor Kobel guess correctly and get a strong wrist to the shot.
That proved to be the final major chance for either side, but we did enjoy almost exclusive use of the ball for the final 30 minutes as Dortmund sat back and settled for the point that took them through with us.
DORTMUND XI: Kobel, Schlotterbeck, Hummels (c), Sule, Reyna (Papadopoulos 86), Can, Bellingham, Hazard (Wolf 81), Brandt, Moukoko (Modeste 81), Adeyemi (Malen 73)
Subs: Meyer, Unbehaun, Passlack, Rothe, Coulibaly
Man of the Match
Nathan Ake – Ever reliable, the Dutch defender is the perfect man for nights like these. With a point necessary to guarantee top spot, the Blues were always going to prioritise keeping Dortmund quiet.
The furthest left of three centre backs and playing behind the attacking Joao Cancelo in the first half, Ake was often asked to defend the channels against the pacey Karim Adeyemi.
However, our No.6 was more than up to the task against the player that Dortmund relied upon for creativity.
Ortega Moreno's debut
Stefan Ortega Moreno was cool, calm and collected on his competitive City debut on a stage he knows reasonably well.
The 29-year-old had played every season of his career in Germany before making the move to Manchester in the summer and featured at the Westfalenstadion on two occasions.
He was solid with his hands when called upon and didn’t look flustered at any point with the ball at his feet. All in all, it’s clear to see why Ortega Moreno was this summer considered a City goalkeeper in waiting by the Club’s coaching staff.
Pep Guardiola reaction
"We spoke about whether Dortmund would make a high-pressing, like they did against Bayern Munich and like we saw against Sevilla, or stay a little deeper like the three times we played against them lately.
"In the first half we realised after we make a good build up, played defensively the way they played these times - every time you lose balls in this country, they punish you on the transition like no other country in the world. We missed some passes.
"In the first half we had some problems making our high pressing because Sule was so, so down and the distance for Joao was so big and that’s what we corrected in the second half and it was much better, much more productive.
"In the second half, the result was good for us. They defend 5-4-1, with the striker dropping, and they didn’t want to push. Both teams are happy. We have won the group and they are happy because they are in the last 16."
What it means
City will top Group G as we now have 11 points from five matches, three more than second placed Borussia Dortmund. Our head-to-head record against the German team means that no matter the result in the final group games, we cannot be overtaken.
The Blues reached the knockout phase of the UEFA Champions League for the tenth consecutive season following the recent draw with FC Copenhagen.
Next up for the Blues is a Saturday lunchtime trip to recently rejuvenated Leicester City. Brendan Rodgers’ side were struggling in the Premier League but have taken seven points from their last three matches.
That meeting will be played at 12:30 on Saturday 29 October, live on BT Sport.
Our final game in the UEFA Champions League group stages will be against Sevilla on Wednesday 2 November. That is an 20:00 GMT kick-off and will also be live on BT Sport. Sevilla's 3-0 win over Copenhagen on Tuesday leaves them in pole position for Europa League qualification.
News about BVB v Man City
Dortmund v City: Full-match replay
Watch the entirety of our penultimate Group G clash in the UEFA Champions League at Signul Iduna Park on CITY+. Watch more
Dortmund 0-0 City: Pitcam highlights
Our regular match re-run from a different perspective... Watch more
Dortmund 0-0 City: Stats of the match
Manchester City ensured passage to the last 16 of the Champions League as group winners courtesy of a 0-0 draw against Borussia Dortmund. Read more
Matchday Live: Pundits react to Dortmund draw
Watch our Matchday Live panel analysis from the 0-0 draw with Borussia Dortmund. Watch more
Training: City make a splash after topping Group G!
View the best pictures from Wednesday’s training session, where City certainly made a splash! View more
Highlights: Borussia Dortmund 0-0 City
Enjoy the best of the action from City’s clash with Borussia Dortmund at Signal Iduna Park. Watch more
Guardiola: Top spot with a game to spare is biggest compliment to players
Pep Guardiola hailed City's 'exceptional' Champions League form so far that has guaranteed top spot in Group G with one match remaining. Read more
Guardiola: I admire penalty takers’ courage
Pep Guardiola has praised Riyad Mahrez for shouldering the responsibility of taking a penalty in our goalless draw with Borussia Dortmund. Watch more