Runar Ovesen Hjerpbakk

Software Philosopher

DNS worked using Docker run but not in Docker Compose

I created an API internal to our organization today. The API needed to access an SQL Server database and worked perfectly running on my local machine on the corporate network.

Then the time came to run it in a Docker container. And it failed. The API could not connect to the SQL database.

The API connects to the SQL Server using a regular connection string:

Data Source=DB;Initial Catalog=Catalog;Persist Security Info=True;User ID=ID;Password=Password

But I didn’t understand how it couldn’t work from within the container. Luckily, my co-worker had a suggestion, try telling Docker the IP of our internal DNS server.

Using docker run, you can specify a DNS server using the --dns option:

docker run --dns 10.0.103.78 -p 1337:5000 hjerpbakk/api

The API worked perfectly.

Then I needed to get Docker Compose to work. Compose also has the dns option, so naturally, I tried this first:

version: '3'

services:
  dsak-api:
    image:  hjerpbakk/api${tag}
    restart: always
    ports:
      - 1337:5000
    dns: 10.0.103.78

But it turns out using bridged network mode was both necessary and sufficient:

version: '3'

services:
  dsak-api:
    image:  hjerpbakk/api${tag}
    restart: always
    ports:
      - 1337:5000
    network_mode: "bridge"

Every time I containerize an application I learn something new.