The home side were unchanged from the team that claimed a 2-1 victory at Norwich City last time out, while the Citizens showed two alterations to the starting XI who began the 3-1 win at home to Leicester City.
The fit-again Sergio Aguero replaced fellow striker Gabriel Jesus, who missed out due to illness, while Rodri was preferred to Ilkay Gundogan in midfield.
City enjoyed the better of the early possession, although neither keeper was troubled in the opening stages of the Molineux clash.
That all changed 11 minutes in as Citizens gloveman Ederson charged out of his area and was shown a straight red card for clattering into Diogo Jota, with Claudio Bravo taking over in goal and Aguero the man to come off.
However, midway through the first half it was the visitors who had the chance to go ahead after a VAR check handed them a penalty for a foul on Riyad Mahrez.
Raheem Sterling’s initial spot-kick was saved by Rui Patricio, but a retake was ordered for encroachment and, while the Portuguese also kept out the second penalty, Sterling was able to tuck home the rebound.
The hosts pressed for an equaliser for much of the remainder of the first half, but were unable to penetrate a dogged Citizens backline.
City brought on defender Eric Garcia in place of Mahrez at half-time, with Jota threatening an equaliser within two minutes of the restart.
However, the hosts were then caught out on the counter-attack, with Kevin de Bruyne playing in Sterling, who lifted a superb finish over the advancing Patricio to give the Citizens a 2-0 advantage.
Five minutes later the deficit was halved as Adama Traore was allowed time and space to power a low 20-yard right-foot shot into the corner of the net.
Leander Dendoncker then tested Bravo with a bouncing effort from distance, while City looked to the pace of Sterling to relieve the pressure on their defence.
Bravo was down smartly to deal with a Traore drive with just over 20 minutes to play, while Romain Saiss headed narrowly wide from a Joao Moutinho free-kick.
Eight minutes from time Wolves got their reward as Benjamin Mendy failed to clear his lines, allowing Traore to rob him of the ball and cross for Raul Jimenez to fire home from close range and make the score 2-2.
And there was still time for Doherty to grab a dramatic winner, skipping past a couple of challenges before planting a low left-foot drive beyond the despairing dive of Bravo.