Price turned back double-digit shots on goal in all three periods and survived six Vancouver power plays, four of which occurred in the second period.
Andrei Kostitsyn, David Desharnais and Brian Gionta scored for the Canadiens, who broke a three-game losing streak that included Sunday's 4-0 loss to the Flames in an outdoor game in frigid Calgary.
The win kept Montreal four points behind Boston in the Northeast Division.
Henrik Sedin and Mikael Samuelsson scored for the Canucks, who continue to lead the NHL with 85 points. Roberto Luongo allowed three goals on 25 shots in the loss.
Desharnais and Gionta scored in the first period to stake Montreal to a 2-0 advantage and the Habs never trailed.