The Irishman fired home from close range early in the first half, but second half goals from Aron Gunnarsson and Junior Hoilett condemned Nuno Espirito Santo’s side to their fifth Premier League defeat in six matches.
Cardiff started the game the stronger of the two sides and with just five minutes of the first half gone Joe Ralls took a snapshot from the angle of the Wolves box. His fierce effort missed just wide of Rui Patricio’s nearside post.
More Cardiff pressure followed in the early stages, but Wolves caught Cardiff cold just after the quarter hour mark. Doherty played a perfect pass to release Adama Traore down the right wing and the forward took a touch before seeing his cross headed behind for a Wolves corner.
And Wolves took the lead from that resulting corner. Joao Moutinho’s cross found the head of Raul Jimenez in the Cardiff box who headed an effort across goal, but the home side’s goalkeeper Neil Etheridge saved well. However, the ball falls to the feet of Doherty – celebrating his 200th league appearance in Old Gold – who hammered an effort home from a matter of yards.
Traore was using his pace to cause problems in the Cardiff back line and found himself through on goal after Wolves moved the ball quickly up the pitch from a Bluebirds corner. The speedy forward was played through by Jimenez, but his first touch was too heavy, and the ball ran through to Etheridge.
The Cardiff supporters thought they were level as the half wore on. The ball broke to Harry Arter following a Cardiff corner, and the midfielder struck a sweet half volley which crashed back off the post.
But Wolves kept on the pressure, which saw Jimenez set up Neves on the edge of the Cardiff box. He took a first time shot but his effort missed just wide of the near post.
Half-time: Cardiff 0 Wolves 1
Wolves came out of the second half looking to keep up their pressure of the first 45 minutes and found themselves with a chance just three minutes in. Traore burst forwards from midfield and exchanged a one-two with Jimenez, but the return pass evaded the forward as he strode into the Cardiff box.
But for every Wolves effort, Cardiff matched their visitors. Gunnarsson had a chance shortly after as he looked for goal on the half-volley from the edge of the Wolves box, but he couldn’t keep his effort down.
It was then Wolves’ turn to have an attack, with Ruben Neves having two long range efforts in quick succession. His first effort was punched clear by Etheridge, while the second missed wide of the target.
Wolves’ good work was undone on 65 minutes when Gunnarsson pounced on a loose ball in the visitor’s box to hammer home from close range and bring the hosts level.
Just moments later, Jimenez had another headed effort at the Cardiff goal. Picked out by Ruben Vinagre from the left flank, the youngster whipped a teasing ball towards the edge of the six-yard box, but the Mexican headed just over.
With just under 15 minutes left on the clock the ball found its way out to Junior Hoilett on the edge of the box, who shoots first time from an angle, curling a pin-point effort beyond Patricio and off the underside of the crossbar to put Cardiff in front.
Ivan Cavaleiro got straight into the action after Vinagre made way late in the second half. Played in on goal by fellow substitute Diogo Jota, the Portuguese international could only fire a shot straight at Etheridge from about eight yards out.
Wolves continued to pile pressure onto Cardiff, but it wasn't to be for the visitors, as with just minutes left in the match, Cavaleiro put in a wicked cross from the right wing towards an onrushing Morgan Gibbs-White who met the ball first time at the back post but can only fire over.
Full-time: Cardiff 2 Wolves 1
Cardiff: Etheridge, Bamba, Morrison, Ecuele Manga, Hoilett, Ralls, Gunnarsson, Arter (Harris 76), Murphy (Decordova-Reid 65), Paterson, Camarasa.
Unused subs: Smithies, Pelter, Bennett, Ward, Mendez-Laing.
Wolves: Patricio, Doherty, Saiss, Coady, Boly, Vinagre (Cavaleiro 82), Moutinho, Neves, Costa (Jota 66), Traore (Gibbs-White 72), Jimenez.
Unused subs: Ruddy, Bennett, Giles, Bonatini.
Referee: Andre Marriner