The visitors took an early lead, but City fought back with a quick leveller from Sergio Aguero and second-half strikes from Ilkay Gundogan and Ferran Torres completing what, ultimately, was a comfortable win.
After a fairly even opening, City went behind after just 14 minutes with the sort of goal you see once in a blue moon.
Ruben Dias’ pass was cut out on the halfway line by Luis Diaz who then set off on a run towards goal, cutting in from left to the and largely unchallenged before rounding Joao Cancelo and drilling a low shot past Ederson.
It was the lack of a meaningful attempt to dispossess the Colombian that will have concerned Pep Guardiola.
A quick response was needed, and it came courtesy of a rash challenge from 37-year-old Porto skipper Pepe.
VAR then took an age to decide the referee was correct before Aguero stepped up to squeeze a low shot under the keeper and into the bottom left corner.
Porto went close to regaining the lead not long before half-time with only a superb Kyle Walker clearance off the line preventing the Portuguese going ahead again.
Three City players were booked before the break with the visitors making the most of any tackles or challenges.
Porto, often with ten men behind the ball as City attacked, continued the frustrate the hosts until the 65th minute and it was Gundogan who was instrumental in winning the free-kick that he himself scored from, curling a beauty over the wall and into the top left corner.
It was just reward for City’s efforts against a disciplined, defensive-minded opponent.
Gundogan and Aguero were then taken off as they both build up their match fitness, and their 20-year-old replacements Phil Foden and Ferran Torres took just five minutes to create and score City's third of the evening.
Rodri's spectacular 30-yarder struck the post as City dominated the closing moments, with Marchesin making a superb save, but the victory was already assured by the point.
The only sour note was late sub Fernandinho limping off with an as yet unspecified knock.
What it means…
City top Group C with one game played.
Olympiakos are second after beating Marseille 1-0 and the French side and Porto are bottom with no points to date.
Who caught the eye?
Kyle Walker has hardly put a foot wrong since the start of the new campaign and he was again impressive against Porto.
The England defender’s pace is enough to give any winger nightmares and his physical strength and work-rate begs the question – is he playing the best football of his career?
Ilkay Gundogan was solid throughout and involved in the opening goal as well as scoring the second.
And Ferran Torres' brief cameo off the bench will excite City fans - the young Spanish winger looks quite a prospect.
Dias’ tough introduction to city life
Ruben Dias impressed on his debut against Leeds United and again against Arsenal at the weekend.
The Portuguese centre-back looks calm and assured and is confident with the ball at his feet or competing in the air.
But our new No.3 has not had the same partner twice.
That’s tough going for any new player, let alone for one who will be looking to forge a strong understanding with his fellow centre-back.
Let’s hope our defensive injuries clear up quickly.
It's back to the Premier League as City travel to the London Stadium to face West Ham United on Saturday, kick-off 12.30pm.