Trouble publishing a UDP port on an IP alias

So I built a docker container that runs dnscache (from djbdns/dbndns). It’s running:

root@rome:~# docker -H :2375 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                              NAMES
4c47ff914f5d        jeff/jdns1          "/init.sh"          53 minutes ago      Up 53 minutes       172.17.2.110:53->53/tcp, 172.17.2.110:53->53/udp   grave_cray
root@rome:~#

Inside the container dnscache is listening on 53/udp

root@rome:~# docker -H :2375 exec -ti 4c47 netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp6 0 0 [::]:domain [::]:*
root@rome:~#

This dnscache actually works inside the container:

root@rome:~# docker -H :2375 exec -ti 4c47 dig +short @127.0.0.1 google.com
173.194.204.101
173.194.204.138
173.194.204.100
173.194.204.139
173.194.204.102
173.194.204.113
root@rome:~#

More proof this dnscache is actually getting used (inside the container):

root@rome:~# docker -H :2375 exec -ti 4c47 ls -l /etc/dnscache/log/main/current
-rw-r–r-- 1 dnslog dnslog 10440 Mar 2 16:08 /etc/dnscache/log/main/current
root@rome:~# date -u
Wed Mar 2 16:08:54 UTC 2016
root@rome:~#

But, even though the docker host see the udp port listening (172,17.2.110 is an ip alias) it doesn’t respond.

root@rome:~# netstat -uln | grep 172.17.2.110:53
udp 0 0 172.17.2.110:53 0.0.0.0:*
root@rome:~# dig +short @172.17.2.110 google.com
;; connection timed out; no servers could be reached
root@rome:~#

Any idea what’s going on?

This is no joke. I’ve “dockerized” several tcp services over the past two weeks. Works fine. With UDP ports it just doesn’t work. I think I provided ample evidence above.

@seamanjeff If you have a minimal, consistently reproducible example I highly suggest filing an issue at https://github.com/docker/docker/issues/new, this is more of a Q&A forum than a bug tracker.

Well, I’m not sure entirely what was going on before but now I’ve got it working.

I’ll put this up on bitbucket later but for now, this is a Dockerfile for dnscache:

FROM ubuntu:trusty

ENV DEBIAN_FRONTEND noninteractive

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

ENV DNSCACHE_USER=dnscache
ENV GID=1000
ENV UID=1000
ENV DNSCACHE_DIR=/etc/$DNSCACHE_USER
ENV ROOT=$DNSCACHE_DIR/root
ENV SERVERS_DIR=$ROOT/servers
ENV IP_DIR=$ROOT/ip

RUN groupadd $DNSCACHE_USER -g $GID && useradd $DNSCACHE_USER -s /bin/false -d $DNSCACHE_DIR -u $UID -g $GID
RUN mkdir $DNSCACHE_DIR $ROOT $SERVERS_DIR $IP_DIR

ENV CACHESIZE=100000000
ENV IP=0.0.0.0
ENV IPSEND=0.0.0.0
ENV CLIENT_IPS=“10 127.0.0.0.1 172.17 192.168”

RUN dd if=/dev/urandom of=/etc/dnscache/seed bs=128 count=1 && chmod 600 /etc/dnscache/seed

RUN wget -qO- ftp://ftp.internic.net/domain/named.root | perl -ane ‘if ($F[2] eq “A”) {print “$F[3]\n”;}’ > $SERVERS_DIR/@

RUN (cd $IP_DIR; touch $CLIENT_IPS)

RUN chown -R dnscache /etc/dnscache

CMD /usr/bin/dnscache < /etc/dnscache/seed 2>&1

To start it:

$ ./start_dnscache jaddns6:latest 192.168.1.212

start_dnscache:

#!/bin/bash
docker run
–detach=true
–publish=$2:53:53/udp
–name=jaddns
–read-only
$1

Note that the disk is read-only. It dispenses with DJB’s daemontools and multilog and does it the “docker way”. The logs can be stored and rotated using switches to the docker run command.

I plan to also do one for tinydns and then allow dnscache to find the tinydns to implement split-horizon dns with two cooperating Docker containers.

1 Like