Docker Community Forums

Share and learn in the Docker community.

Differences in external hostname resolution between docker run and docker-compose up

dns

(Kyle Douglass) #1

Hello everyone,
I am trying to understand the difference between docker-compose and docker run when attempting to resolve the hostname of a host on the network at my work from inside a container. In the example below, why does docker run work only when I specify my work’s DNS address whereas docker-compose works without any explicit DNS info? In this example, myhost is another PC on the network at my work.

Minimal example

Dockerfile

FROM ubuntu:16.04
MAINTAINER Kyle M. Douglass <myemail@mywork.com>

RUN apt-get update && apt-get install -y wget

CMD wget myhost > index.html

docker-compose.yml

version: "3"                                                                                                                                                                                                
services:                                                                                                                                                                                                   
  my_service:                                                                                                                                                                                              
    build: .                                                                                                                                                                                                
    image: kmdouglass/my_image:latest
    command: wget myhost > index.html

Versions

Client:
Version:           18.09.0
API version:       1.39
Go version:        go1.10.4
Git commit:        4d60db4
Built:             Wed Nov  7 00:48:57 2018
OS/Arch:           linux/amd64
Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false

Network

$docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4e829bd60a47        bridge              bridge              local
bdf7a8489980        host                host                local
8d15410c6cc1        none                null                local

Experiment 1

Build the container and use docker-run to fetch the web page from the host. In this case, it fails because I do not pass the DNS address:

$ docker build -t kmdouglass/my_image:latest .
$ docker run -t --rm kmdouglass/my_image
--2018-12-06 08:00:23--  http://myhost/
Resolving myhost (myhost)... failed: Name or service not known.
wget: unable to resolve host address 'myhost'

Experiment 2

The same as before, but specify the DNS address at my work. In this experiment the hostname resolution succeeds:

$ docker run -t --rm --dns=x.x.x.x kmdouglass/my_image
--2018-12-06 08:02:27--  http://myhost/
Resolving myhost (myhost)... y.y.y.y
Connecting to myhost (myhost)|y.y.y.y|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: /graphs/ [following]
--2018-12-06 08:02:27--  http://myhost/graphs/
Reusing existing connection to myhost:80.
HTTP request sent, awaiting response... 200 OK
[...]

Experiment 3

Now, remove the image to have a clean working environment and run the container with docker-compose. This should have the same result as Experiment 1 because I do not specify my local DNS in the docker-compose.yml file. However, the hostname resolution succeeds without any problems:

$ docker image rm kmdouglass/my_image:latest
$ docker-compose up
Creating network "docker_question_default" with the default driver
Creating docker_question_my_service_1 ... done
Attaching to docker_question_my_service_1
my_service_1  | --2018-12-06 08:11:54--  http://myhost/
my_service_1  | Resolving myhost (myhost)... y.y.y.y
my_service_1  | Connecting to myhost (myhost)|y.y.y.y|:80... connected.
my_service_1  | HTTP request sent, awaiting response... 302 Found
my_service_1  | Location: /graphs/ [following]
my_service_1  | --2018-12-06 08:11:54--  http://myhost/graphs/
my_service_1  | Reusing existing connection to myhost:80.
my_service_1  | HTTP request sent, awaiting response... 200 OK

Thanks for the help!
-kmd