Mario Mandzukic scored the only goal of an entertaining game in the 18th minute, and Juventus goalkeeper Gianluigi Buffon did well to prevent City from levelling.
“I think it was a very good game for both teams,” City coach Manuel Pellegrini said. “Both played well. I think we were unlucky to lose. They scored a goal which I think was a foul before Mandzukic finished but the referee didn’t blow the whistle. But we had chances and didn’t score.”
Both sides also hit the woodwork.
Juventus moved onto 11 points, two more than already-qualified City, heading into the final group match. It also has a better head-to-head record, having won 2-1 in Manchester.
“I think the group is not finished,” Pellegrini added. “Of course there was a chance to at least draw so we could go into the final game defending our position. But Juventus has a difficult game against Sevilla, who will need to win for the Europa League and the group is not finished.”
In the other Group D match, Borussia Moenchengladbach beat Sevilla 4-2 — which would have ensured Juventus progressed even if the Italian team had lost.
Juventus visits Sevilla in the final match, with City hosting ‘Gladbach.
Juventus coach Massimiliano Allegri disagreed that his side was fortunate to win after guiding a team into the last-16 for the sixth successive year — including four times with AC Milan.
“There were chances for both sides,” Allegri said. “We could have scored more and they could have equalized. That’s how matches go. I think it was a good Champions League match tonight.
“What’s important is that we won.”
There was a comical moment shortly before kickoff when the stadium announcer said “this is the team for Manchester United” — City’s biggest rival — before swiftly correcting himself.
Both teams had injury problems but Sergio Aguero made his first start for City after returning from injury at the weekend and scoring in the 4-1 defeat by Liverpool.
The match got off to a bright start, with Paulo Dybala skewing a shot well wide for Juventus following a good pass from Paul Pogba. Fernandinho went closer for City moments later after Juventus struggled to clear a corner, but his effort flew narrowly wide of the left upright.
The Brazil midfielder wasted a brilliant chance in the 16th when Giorgio Chiellini and Yaya Toure collided as they went to meet a cross and the ball was knocked back but Fernandinho blasted over from 12 yards.
City was left to rue that missed opportunity as Juventus went straight down the other end and scored.
Pogba feinted round his marker and the former Manchester United player spread the ball to the left for Alex Sandro to cross in towards Mandzukic, who volleyed home.
It wasn’t until the stroke of halftime that City tested Gianluigi Buffon.
Claudio Marchisio’s terrible backpass was intercepted by Aguero, who tried to round the Juventus goalkeeper but Buffon did brilliantly to block the Argentina forward and force the ball out for a corner.
Buffon — and the goalframe — prevented City from levelling early in the second half. The Italy goalkeeper dived smartly to save Fernando’s close-range header from a corner but failed to hold onto the ball, which bounced off his left post and back into his hands.
Alvaro Morata was brought on for Mandzukic and almost had an immediate impact with a lob which was going wide before Stefano Sturaro got a touch to it but could only volley it off the post at full stretch.
The Spain forward could have sealed the match late on as he skipped past two opponents before unleashing an effort which Hart did well to save.
However, the City goalkeeper injured himself doing so and had to be substituted.
City almost levelled before Hart went off but Andrea Barzagli got his body in the way to prevent a certain goal from substitute Raheem Sterling.