In a game delayed slightly after a crowd disturbance, Dortmund atoned for double defeat to their fierce rivals last season and maintained pace with Bayer Leverkusen and Bayern Munich at the Bundesliga summit.
Pierre-Emerick Aubameyang turned home in the 14th-minute after a typically energetic start from the visitors, who continued to dominate afterwards.
However, Schalke were gifted a chance for an equaliser against the run of play on the half-hour mark as Neven Subotic was penalised for a foul on Christian Fuchs in the penalty area.
Kevin-Prince Boateng stepped up from 12 yards, but was denied by Roman Weidenfeller - the Dortmund keeper's fourth penalty save from the last eight he has faced in Bundesliga games.
A stunning strike from Nuri Sahin doubled Dortmund's lead, but they were pegged back by teenage substitute Max Meyer's third goal of the season.
As Schalke pushed on for a winner though, Jakub Blaszczykowski netted on the break with 16 minutes remaining to seal Dortmund's win.
Jurgen Klopp made just one change to the side that beat Arsenal in the UEFA Champions League on Tuesday, replacing Blaszczykowski with Aubameyang, while former Dortmund loanee Boateng returned to Schalke's team in one of four changes.
The start of the game was delayed by 10 minutes as sections of the Dortmund support appeared to throw flares onto the pitch and into nearby home fans.
Once the action did get under way, Dortmund exploded into life with Marco Reus thundering a volley at Timo Hildebrand, with the visitors intercepting Schalke's attempted build-up play high up the pitch.
And they were rewarded in the 14th minute as slick interplay from Kevin Grosskreutz and Henrikh Mkhitaryan gave Reus free space on the right and he cut back for Aubameyang to tap in.
Hildebrand had to be alert to save another Aubameyang effort soon after, but Schalke were handed a way back into the game as Subotic was adjudged to have fouled Fuchs in the box. However, Weidenfeller was on hand to spring to his right and keep Boateng's penalty out.
The save opened the game up, but Schalke were unable to equalise with Roman Neustadter spurning a good chance from Fuchs' corner late in the half.
And they were made to pay just five minutes after the break, Sahin receiving the ball 20 yards out and lashing an effort across Hildebrand.
Subotic denied Julian Draxler with a brave block, but they halved the deficit just after the hour mark as Meyer swept home, having been on the pitch less than a minute.
But Klopp will have been happy with a change of his own 10 minutes later as Blaszczykowski latched onto Mkhitaryan's throughball to slot past Hildebrand and restore the two-goal cushion.
Weidenfeller was forced to tip away Draxler's fierce effort in the closing stages, but Dortmund comfortably held on to win.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.