Match ends, Dundee 1, Celtic 2.
Dundee 1-2 Celtic
Celtic moved to within one win of their sixth straight Scottish Premiership title with victory at Dundee.
The hosts frustrated Celtic for most of the first half, Dedryck Boyata's header cleared off the line by Paul McGowan.
But Jozo Simunovic's flick towards goal deflected off Kevin Gomis to creep in, and Stuart Armstrong headed in a James Forrest cross to double the lead.
Marcus Haber missed two good chances for Dundee, but Faissal El Bakhtaoui's 25-yard stunner ensured a nervy finale.
Ultimately though, Brendan Rodgers' side extended their unbeaten domestic run this season to 36 matches.
With a 25-point lead over second-placed Aberdeen and nine games left, Celtic could clinch the title in their next Premiership match against Hearts at Tynecastle on Sunday, 2 April, although they would already be champions if the Dons fail to secure at least a point at Dundee on 31 March.
Paul Hartley's side remain in eighth place, four points off the top six.
We have witnessed many different types of performances from the Celtic juggernaut as it rolls relentlessly towards six titles in a row. This was a mixture of the good and the ugly - there is rarely bad.
When things are not going their way, they simply put their heads down and grind away at teams until they finally buckle.
It's not always pretty but it's usually positive, and so it was in the first half against a very well organised Dundee side determined to change their fortunes after two straight defeats.
Celtic dominated but despite trying to progress down both flanks and through the middle, and enjoying set-pieces galore, Dundee stood firm and looked likely to head into the break all-square.
But the buckle came just seconds before the whistle when - moments after McGowan cleared Boyata's header off the line - Simunovic fired in at close range, with a little help from a deflection off the back of Gomis.
The goal certainly fired Celtic up and took some of the wind out of Dundee's sails.
Rodgers' side flew at the Dark Blues from the restart and doubled their lead via a 12th goal of the season from Armstrong, who flicked his header expertly past Scott Bain after a fabulous run and cross from Forrest.
Most observers of Celtic this season would have bet their mortgage on that being game over. Ultimately that proved correct but the thanks for that went to the defence.
Hartley's side went into this fixture having failed to pick up a point or score a goal in March, following a productive February that featured an impressive 2-1 win over Rangers.
The same spirit was evident at the start and end of this match as Dundee fought, pressed and harried Celtic all over the pitch and made life difficult for the visitors' flair players such as Moussa Dembele and Scott Sinclair.
Hartley once again showed his tactical prowess when he changed things in the second half and watched his side claw their way back through a spectacular solo effort from El Baktaoui.
The Moroccan striker came off the bench and skipped through the Celtic midfield before firing into Craig Gordon's top right-hand corner. It was simply stunning.
Haber should have scored before that but screwed his effort wide. It was a defeat for the Dee but far from a demoralising one.
Dundee boss Paul Hartley: "I felt, especially in the second half, we were excellent.
"We knew they would have a lot of possession but even in the first half they never really cut us open, and it was a bit of sucker punch with the opening goal, where they got a bit of fortune.
"We conceded a poor second goal but we changed the shape to 4-4-2, Marcus Haber had an excellent opportunity and we scored an excellent goal. I'm pleased with the players' attitude - they never gave in, they kept believing.
"El Bakhtaoui has that in his locker, but he has just not been consistent enough. He has jumped up two leagues (after scoring 30 goals for Dunfermline in League One last season), and we knew it was never going to be easy for him. But he just needs to produce it more often."
Celtic boss Brendan Rodgers: "Dundee have picked up of late, they make things very difficult and we knew it would be a tough game.
"But we deserved the victory, even if it was a bit closer in the end than it should have been.
"At times we played some fantastic football and had chances to make it more comfortable but we didn't make the final pass, and we gave away a poor goal on the defensive side, although it was a great finish.
"Then we had to show we could stand up to a lot of high balls coming into our box, but the players did magnificently to defend that.
"There is a different competition in itself, to see who can maybe be the first (domestic) team to beat Celtic. But we can only apply ourselves as well as we possibly can. I've told the players not to worry about headlines in terms of 'invincibles' or 'trebles'. My worry is just to play the best football we can, and if we do that, we will win games."
- 55GomisBooked at 35mins
- 6O'DeaBooked at 41mins
- 3HoltBooked at 90mins
- 4VincentSubstituted forWightonat 59'minutes
- 18McGowanBooked at 21mins
- 7HateleySubstituted forRossat 68'minutes
- 22OjamaaSubstituted forEl Bakhtaouiat 74'minutes
- 20El Bakhtaoui
- 42McGregorSubstituted forKouassiat 68'minutesBooked at 74mins
- 8BrownBooked at 62mins
- 49ForrestSubstituted forRobertsat 71'minutes
- 11SinclairSubstituted forSviatchenkoat 83'minutes
- 10DembeleBooked at 87mins
- William Collum
- Shots on Target
Second Half ends, Dundee 1, Celtic 2.
Foul by Nick Ross (Dundee).
Kieran Tierney (Celtic) wins a free kick in the defensive half.
Kevin Holt (Dundee) is shown the yellow card for a bad foul.
Patrick Roberts (Celtic) wins a free kick in the defensive half.
Foul by Kevin Holt (Dundee).
Moussa Dembele (Celtic) is shown the yellow card.
Foul by Patrick Roberts (Celtic).
Kevin Holt (Dundee) wins a free kick in the defensive half.
Foul by Mikael Lustig (Celtic).
Craig Wighton (Dundee) wins a free kick on the right wing.
Substitution, Celtic. Erik Sviatchenko replaces Scott Sinclair.
Attempt missed. Marcus Haber (Dundee) header from the centre of the box misses to the right.
Attempt blocked. Moussa Dembele (Celtic) right footed shot from the centre of the box is blocked.
Attempt missed. Faissal El Bakhtaoui (Dundee) right footed shot from outside the box is too high.
Goal! Dundee 1, Celtic 2. Faissal El Bakhtaoui (Dundee) right footed shot from outside the box to the top right corner. Assisted by Kevin Holt.
Substitution, Dundee. Faissal El Bakhtaoui replaces Henrik Ojamaa.
Eboue Kouassi (Celtic) is shown the yellow card for a bad foul.
Foul by Moussa Dembele (Celtic).
Kevin Holt (Dundee) wins a free kick in the attacking half.
Substitution, Celtic. Patrick Roberts replaces James Forrest.
Substitution, Celtic. Eboue Kouassi replaces Callum McGregor.
Substitution, Dundee. Nick Ross replaces Tom Hateley.
Corner, Celtic. Conceded by Darren O'Dea.
Corner, Celtic. Conceded by Scott Bain.
Corner, Dundee. Conceded by Dedryck Boyata.
Scott Brown (Celtic) is shown the yellow card for a bad foul.
Foul by Scott Brown (Celtic).
Paul McGowan (Dundee) wins a free kick in the attacking half.
Attempt missed. Marcus Haber (Dundee) right footed shot from outside the box is close, but misses to the right.
Substitution, Dundee. Craig Wighton replaces James Vincent.
Goal! Dundee 0, Celtic 2. Stuart Armstrong (Celtic) header from very close range to the high centre of the goal. Assisted by James Forrest.
Tom Hateley (Dundee) wins a free kick in the attacking half.
Foul by Scott Brown (Celtic).
Corner, Celtic. Conceded by Mark O'Hara.
Stuart Armstrong (Celtic) wins a free kick in the defensive half.
Foul by Tom Hateley (Dundee).
Attempt saved. Kevin Holt (Dundee) left footed shot from outside the box is saved in the bottom left corner.
Foul by Jozo Simunovic (Celtic).