Docker Now Supports Adding Host Mappings
In my previous blog entry, I mentioned that Docker didn’t provide any way to add host-to-ip
mappings to /etc/hosts
. Well, the most recent version of Docker (1.3.1) now
addresses that issue with a new add hosts option. Let’s take a quick look
at what it does.
Given a standard default /etc/hosts
.
% docker run -it ubuntu cat /etc/hosts
172.17.0.8 b14031841b2b
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
We can add a mapping for server ‘foo’ at ‘10.0.0.3’.
% docker run -it --add-host foo:10.0.0.3 ubuntu cat /etc/hosts
172.17.0.9 189a650112db
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
10.0.0.3 foo
We can also add mappings for multiple servers, in this case ‘foo’ and ‘bar’.
% docker run -it --add-host foo:10.0.0.3 --add-host bar:10.7.3.21 ubuntu cat /etc/hosts
172.17.0.13 3f8543ecc372
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
10.7.3.21 bar
10.0.0.3 foo
So far so good. But there are a couple more scenarios to consider. The first is how to handle the case where a single server is hosting multiple services. These services could be in a single Docker container, separate containers or not in a container at all. What’s important is that they are both on some remote server.
So let’s consider the case where our services are named svca
and svcb
.
We could try to add both of them as host mappings. Let’s see how that
works out.
% docker run -it --add-host svca:10.0.0.9 --add-host svcb:10.0.0.9 ubuntu cat /etc/hosts
172.17.0.16 5d7eaa5dcd16
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
10.0.0.9 svcb
10.0.0.9 svca
Both services are pointing to the same IP address, but I’m not sure this is
valid for /etc/hosts
. The format is supposed to be IP hostname [hostalias]*
.
Lucky for us, there is another option. When invoking add-host
, we can
include both services inside of double quotes. It’s not documented, but
it does work as you can see below.
% docker run -it --add-host "svca svcb":10.0.0.9 ubuntu cat /etc/hosts
172.17.0.17 380df28b4612
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.0.9 svca svcb
There we go, both services pointing to the same IP address and /etc/hosts
written in a valid format.
Another issue is how to provide hostaliases of localhost. As far as I can tell, Docker still doesn’t have anything to address this issue. For the time being this means that I’ll still be using Mungehosts to do that work.
In summary, add-host
is a valuable new tool in the Docker toolbox for
pointing to remote services. It’s worked well for all the cases I needed
for it and it’s easy to use. It’s good to see Docker adding more config options
to make our lives easier.