The Hoops had performed well only to lose 2-0 to AC Milan in their Champions League Group H opener in the San Siro on Wednesday night but they responded with a first-half blitz of the visitors.
In a one-sided first half, Finnish striker Teemu Pukki, making his first start for his new club, opened the scoring with a drive in the 10th minute with midfielder Charlie Mulgrew adding a second in the 26th minute with fine left-footed shot.
The second half was mostly a non-event until Perth substitute Liam Caddis, on for David Wotherspoon, bundled in a Dave MacKay cross with nine minute remaining before another Saints replacement, Stevie May, hit the post in added time with the Hoops hanging on for the final whistle.
Manager Neil Lennon made two changes to his side following the trip to Italy.
Pukki came in for Georgios Samaras who started on the bench while wide-man Derk Boerrigter replaced right-back Mikael Lustig who dropped out altogether.
Saints manager Tommy Wright made three changes with Brian Easton, Chris Millar and Gary McDonald in, and Tom Scobbie, Nigel Hasselbaink and May dropping to the bench and they took to the field in an AC Milan-style red and black kit.
The home side's domination of possession from the kick-off was almost total.
Saints' 10-man defence situated themselves at the edge of their own box and repelled a series of Hoops attacks.
Striker Anthony Stokes set up the opener when he played a clever ball to Pukki inside the box and from 10 yards out the former Schalke forward drove it low between the legs of Saints defender Frazer Wright and keeper Alan Mannus.
An old-fashioned thrashing looked on the cards as wave after wave of green and white attacks threatened to engulf the Perth men.
There was no respite for St Johnstone. A sweeping move started by full-back Adam Matthews, the game's best player in the first half, ended with Pukki knocking Stokes' cross from wide on the right past the near post.
Celtic's second goal came when Saints midfielder Wotherspoon cut out a Stokes pass only for the ball to spin to Mulgrew, who set himself before drilling it low past Mannus from 25 yards.
Five minutes later, with the McDiarmid Park side retreating into their box as Celtic surged forward again, Mulgrew curled a shot from 25 yards just past the post before Boerrigter made a mess of a Stokes cross from six yards, knocking it wide when it appeared easier to score.
Israel midfielder Nir Biton replaced Matthews for the start of the second half to make his home debut, with Efe Ambrose moving to right-back and Mulgrew going back to the centre of defence alongside Virgil van Dijk.
Stokes fired wide from the edge of the box a few minutes into the second period but the match went flat.
St Johnstone had more of the ball without looking as if they would threaten.
Samaras replaced Commons just on the hour mark before May came on for Perth midfielder Murray Davidson.
As the match continued to drift aimlessly, May headed a cross from Wotherspoon over the bar with what was Saints' best chance to that point.
Stokes then had a header from a Mulgrew corner cleared off the line by MacLean as Celtic looked to finish with a flourish.
However, the ending was at odds with the earlier script.
In the 79th minute Celtic's hitherto under-worked keeper Fraser Forster had to make a good save from Millar after the Saints midfielder had burst right through the Hoops defence.
Celtic let their guard slip even further and allowed Saints back into the game when MacKay's cross from the right was knocked in from close range by Caddis, who nipped in front of Ambrose to set up a fraught ending for the home side.
As the nerves jangled among the home support, May hit the post in injury time with a glancing header before Forster made a fine save from MacKay as the home side held out for the three points which should have been secured by the interval.