Striker Steve Morison was sent off as Millwall's play-off hopes were dented by a resilient Bristol City.
Nicky Maynard, Marvin Elliott and Brett Pitman all went close for the visitors in the first half.
Millwall poured forward after the break with Tamika Mkandawire firing over from the edge of the box and Andros Townsend shooting straight at David James.
Maynard missed a glorious late chance before Morison was dismissed in stoppage-time for a reckless lunge.
The Lions' 17-goal top-scorer will now be suspended for most of the run-in as Millwall chase back-to-back promotions.
Millwall had won four of their last five matches to move into play-off contention.
But they could easily have lost to a City side who were threatening early on through the lively pair of Maynard and Albert Adomah.
Maynard headed Adomah's cross wide and former Lion Marvin Elliott missed a free header from Jordan Spence's centre.
At the other end, Morison and Paul Robinson both wasted headed chances before Josh McQuoid fired across goal.
James then made a hash of a deflected Townsend shot but when the ball fell to Morison, the angle was too tight and the former England goalkeeper was able to block his effort.
With Millwall dominating the second half, City remained a threat on the break and just before the hour mark, David Forde pulled off an excellent diving save to keep out Martyn Woolford's 20-yard drive.
Four minutes from time, Maynard sprung the Lions offside trap but stumbled as he was bearing down on goal, allowing Forde to save.
Any relief for Lions fans was short-lived as Morison's needless lunge at Jamal Campbell-Ryce earned him a straight red card.