The hosts rarely threatened their opponents, who were happy to hold onto what they had after McDonald's deflected effort.
There were very few chances in the first half, with Martyn Waghorn's effort the most either goalkeeper had to deal with.
It was Charlton who were keeping possession without ever hurting the Millwall defence, and they were punished for their lack of creativity on 28 minutes.
Bradley Pritchard's poor pass was collected by McDonald who, after playing a one-two with Waghorn, picked up the ball and fired towards goal, seeing a fortunate deflection off Dorian Dervite direct the ball past the goalkeeper.
The hosts tried to force an instance response, but went in behind at half time having failed to have an effort on target.
It was a similar story in the second period. Millwall were comfortable in defence and were happy to play on the counter-attack.
The visitors then almost made sure of the win, freeing Scott Malone with a sweeping team move, but the full-back fired just wide from the edge of the box.
Charlton pushed for an equaliser deep into injury time but rarely threatened a clear chance.