The Robins started well, with Jay Emmanuel-Thomas's long-range half-volley parried away by Colchester goalkeeper Sam Walker early on.
And the visitors were ahead in the eighth minute when Martin Paterson fired past Walker inside the area after good work from Emmanuel-Thomas down the right.
Colchester went close when City goalkeeper Frank Fielding dived to parry away Alex Gilbey's fierce shot, while at the other end Emmanuel-Thomas curled wide from inside the area after good play by Brendan Moloney.
Bristol City doubled their lead three minutes after half-time through Scott Wagstaff, who bundled home after Walker had fumbled Moloney's low cross.
Fielding palmed over an effort from Colchester substitute Freddie Sears on the hour before Gavin Massey reduced the deficit with 17 minutes remaining when he bundled in Marcus Bean's cross from close range.
And five minutes later, Sears lashed home a fine low shot from 20 yards to rescue an important point for Colchester.