Jurgen Klopp's side could have climbed to within a point of ninth-placed Werder Bremen, and the top half, with victory but they failed to break down Peter Stoger's well-drilled visitors.
It is Dortmund's second consecutive draw in the league, following four straight wins, and it could have been worse as the visitors fashioned the better chances.
Cologne's deep defensive line succeeded in stifling the hosts' creative talents, as Stoger's men followed up their first victory since January with a hard-earned point that moves them six points clear of the bottom three.
Attention now turns to the UEFA Champions League for Klopp's side, as they host Juventus in the second leg of their last-16 tie on Wednesday, seeking to overturn a 2-1 deficit.
The match began in breathless fashion, as Deyverson got in behind the Dortmund defence inside two minutes, only to panic and waste his moment, before Neven Subotic headed just over from Shinji Kagawa's in-swinging corner at the other end.
Anthony Ujah was next to exploit the early space behind Subotic and Mats Hummels, but once again Dortmund goalkeeper Roman Weidenfeller rushed off his line and did enough to put the forward off.
Unfortunately, that frantic five-minute spell was not a sign of things to come, as the contest soon settled into its expected pattern, with Dortmund probing as Cologne set out a deep defensive line.
Klopp's side struggled to inject any tempo into their play and spent too much time in front of their opponents, while the pace of Stoger's frontline made Cologne a real threat on the break.
The second half started much like the first, with a great opening for Deyverson. This time it was the enthusiastic running of Ujah that created the opportunity, but the result was the same.
The Brazilian lacked the composure to break the deadlock, blasting over from 12 yards following a smart cut-back, as Dortmund scrambled to get men back behind the ball.
The hosts' faltering quest for creativity was not helped by a painful-looking injury suffered by Henrikh Mkhitaryan. He connected with Mergim Mavraj when attempting to volley a clipped ball over the top late in the first half and battled on until the 60th minute, when he was finally replaced by Jakub Blaszczykowski.
Cologne's Timo Horn was forced into a rare save in the 66th minute, as Marco Reus volleyed at goal from a long throw, but the goalkeeper got down well to turn the ball behind.
Dortmund's frustration was demonstrated by Pierre-Emerick Aubameyang's pathetic attempt to reach Kevin Kampl's 72nd-minute cross with his arm.
That earned him a booking and he was soon substituted, as Dortmund failed to find any late spark.
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.