I have the Docker version 1.10 with embedded DNS service.
I have created two service containers in my docker-compose file. They are reachable each other by hostname and by IP, but when I would like reach one of them from the host machine, it doesn't work, it works only with IP but not with hostname.
So, is it possible to access a docker container from the host machine by it's hostname in the Docker 1.10, please?
Update:
docker-compose.yml
version: '2'
services:
service_a:
image: nginx
container_name: docker_a
ports:
- 8080:80
service_b:
image: nginx
container_name: docker_b
ports:
- 8081:80
then I start it by command: docker-compose up --force-recreate
when I run:
docker exec -i -t docker_a ping -c4 docker_b
- it worksdocker exec -i -t docker_b ping -c4 docker_a
- it worksping 172.19.0.2
- it works (172.19.0.2
isdocker_b
's ip)ping docker_a
- fails
The result of the docker network inspect test_default
is
[
{
"Name": "test_default",
"Id": "f6436ef4a2cd4c09ffdee82b0d0b47f96dd5aee3e1bde068376dd26f81e79712",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1/16"
}
]
},
"Containers": {
"a9f13f023761123115fcb2b454d3fd21666b8e1e0637f134026c44a7a84f1b0b": {
"Name": "docker_a",
"EndpointID": "a5c8e08feda96d0de8f7c6203f2707dd3f9f6c3a64666126055b16a3908fafed",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"c6532af99f691659b452c1cbf1693731a75cdfab9ea50428d9c99dd09c3e9a40": {
"Name": "docker_b",
"EndpointID": "28a1877a0fdbaeb8d33a290e5a5768edc737d069d23ef9bbcc1d64cfe5fbe312",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
"Options": {}
}
]
As answered here there is a software solution for this, copying the anwser:
There is a opensource application that solves this issue, it's called DNS Proxy Server
It's a DNS server that solves containers hostnames, if could not found a hostname with that hostname then solve it from internet as well
Start the DNS Server
It will set as your default DNS automatically (and recover to the original when stops)
Start your container for test
docker-compose.yml
Now solve your containers hostnames
from host
from another container
As well it solves internet hostnames
Similar to @larsks, I wrote a Python script too but implemented it as service. Here it is: https://github.com/nicolai-budico/dockerhosts
It launches dnsmasq with parameter
--hostsdir=/var/run/docker-hosts
and updates file/var/run/docker-hosts/hosts
each time a list of running containers was changed. Once file/var/run/docker-hosts/hosts
is changed, dnsmasq automatically updates its mapping and container become available by hostname in a second.There are install and uninstall scripts. Only you need is to allow your system to interact with this dnsmasq instance. I registered in in systemd-resolved:
To specifically solve this problem I created a simple "etc/hosts" domain injection tool that resolves names of local Docker containers on the host. Just run:
You will be able to access a container using the
container name
,hostname
,container id
and vía thenetwork aliases
they have declared for each network.Containers are automatically registered when they start and removed when they are paused, dead or stopped.
Here's what I do.
I wrote a Python script called dnsthing, which listens to the Docker events API for containers starting or stopping. It maintains a
hosts
-style file with the names and addresses of containers. Containers are named<container_name>.<network>.docker
, so for example if I run this:I get this:
I then run a
dnsmasq
process pointing at thishosts
file. Specifically, I run a dnsmasq instance using the following configuration:And I run the
dnsthing
script like this:So:
dnsthing
updates/run/dnsmasq/docker.hosts
as containers stop/startdnsthing
runssystemctl restart dnsmasq_docker
dnsmasq_docker
runsdnsmasq
using the above configuration, bound to a local bridge interface with the address172.31.255.253
.The "main" dnsmasq process on my system, maintained by NetworkManager, uses this configuration from
/etc/NetworkManager/dnsmasq.d/dockerdns
:That tells dnsmasq to pass all requests for hosts in the
.docker
domain to thedocker_dnsmasq
service.This obviously requires a bit of setup to put everything together, but after that it seems to Just Work:
The easiest way to do this is to add entries to your hosts file
127.0.0.1 docker_a docker_b
to /etc/hosts filedocker-machine ip default