The encounter at the Stade de Gerland looked to be heading for a draw before the Italian defender pounced on a loose ball in the area to leave his side in command.
The outcome, Lyon's first defeat at home in the competition since the group stages, has left Les Gones needing to overturn the result in next week's return leg in Turin.
Juve will be hoping Carlos Tevez will be fit after their top scorer was forced to leave the pitch with a suspected groin injury in the 55th minute.
Tevez had gone into the contest looking to score his first goal in European competition since April 2009.
Serie A leaders Juve bossed the early exchanges but found it hard work breaking down Lyon's well-organised defence.
The home side, without seven injured players, were first to threaten in the 26th minute.
Steed Malbranque's right-footed shot from 20 yards was kept out by Juve goalkeeper Gianluigi Buffon.
Seconds later, Jimmy Briand wasted a great chance to put Lyon ahead when he struck the ball wide from close range following a corner.
Before the half-hour mark, Tevez received a pass from Andrea Pirlo between the lines but the Argentinian striker failed to beat Lyon goalkeeper Anthony Lopes in a one-on-one opportunity.
On the stroke of half-time, Lyon defender Samuel Umtiti cleared a dangerous ball from Bonucci with Dani Osvaldo ready to pounce.
Umtiti was first to test Buffon in the second half with a 30-yard free-kick which was saved by the Italian keeper.
At the other end, a fast counter-attack saw Tevez surge inside the area and strike a right-footed shot that was kept out by Lopes.
On the hour mark, Pirlo's free-kick was deflected off Briand to force Lopes to fully stretch to clear.
Juve continued to press forward and in the 83rd minute, substitute Sebastian Giovinco fed Mirko Vucinic in the box and the Montenegrin forward shot wide from a good position.
The visitors' efforts were finally rewarded five minutes from time when Lyon failed to clear a Giorgio Chiellini cross from the left and the ball fell to Bonucci who struck home past Lopes.