The visitors kicked off and enjoyed the best of the early exchanges but it was the home side who opened the scoring in the 12th minute.
Paul McVeigh's left-foot volley from the edge of the penalty area found the net inside Tony Warner's left hand post when The Lions failed to clear Phillip Mulryne's free-kick from the left wing.
Two minutes later it was 2-0 when Ian Henderson headed in Darren Huckerby's left-wing cross from 10 yards.
Paul Robinson was carried off with a leg injury in the 21st minute to be replaced by Matt Lawrence.
A delightful through ball from Mulryne released Huckerby down the City left, but when he cut into the penalty area, he curled his shot wide of the far post.
Huckerby and Henderson combined again to good effect in the 30th minute. Huckerby's left-wing cross was volleyed in at the far post by the Canary youngster.
Paul Ifill was booked for a foul on Adam Drury in the 39th minute as the visitors struggled to get the ball off a confident City side.
Millwall made a half-time substitution replacing Bob Peeters with Kevin Braniff and 14 minutes into the half, David Livermore made way for the pacey Aboubaka Fofana.
The left-winger showed an impressive turn of speed but the chances were still falling to the home side. Warner did well to keep out a fierce drive from Damien Francis.
Keith Briggs replaced Mulryne in the 73rd minute and was soon being tested by the lively Fofana.
Huckerby went down in the Lions penalty area under pressure from Robbie Ryan, but referee Clattenburg was not impressed.
With 10 minutes left, Peter Crouch made way for Iwan Roberts and two minutes later there was a standing ovation for Huckerby when he made way for Ryan Jarvis.
In injury time, Darren Ward poked in a consolation goal from two yards out at the far post as the City defence failed to clear Peter Sweeney's left-wing corner, won by the running of Fofana.