fgrehm/easy-lb
Experimental automagic load balancing for Docker web apps in less than 100 lines of bash.
On Ubuntu 14.04 hosts, you'll need to install libnss-resolver and run:
apt-get install dnsmasq
echo "nameserver 127.0.0.1:5353" | sudo tee -a /etc/resolver/docker.dev
I suppose you are able to do something similiar when using Macs + Vagrant / boot2docker but I don't own a Mac to put the pieces together, LMK if you know how to make this work over there and I'll update the docs accordingly
Launch the load balancer and DNS server:
git clone https://github.com/fgrehm/docker-easy-lb.git
cd docker-easy-lb
./launch-host
And verify if things are working:
# Is DNS working?
$ ping hello.docker.dev
PING hello.docker.dev (172.17.0.175) 56(84) bytes of data.
64 bytes from 172.17.0.175: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 172.17.0.175: icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from 172.17.0.175: icmp_seq=3 ttl=64 time=0.150 ms
^C
# Can we reach the load balancer?
$ curl hello.docker.dev
<html>
<head>
<title>404 - No application configured for this subdomain</title>
<style>
# Lets start a web server exposing the 3000 port
$ docker run -d --name hello -h hello -p 3000 ubuntu:14.04 python3 -m 'http.server' 3000
4e2731f1d2919e9a1259d9c4439e8cfb9953e8d6debbe9f64f66b8455b2ea002
# And verify that the app has been addded to the load balancer
$ curl hello.docker.dev
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ascii">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
....
# Don't forget to clean up
$ docker rm -f hello
When the launch-host script gets run, it will start a dnsmasq
server
on your machine pointing any address under *.docker.dev
to a fgrehm/easy-lb
container that has the Docker socket /var/run/docker.sock
bind mounted inside it. From
there it will use supervisord to kick off Redis +
Hipache + a "service" that will
register a Docker events listener
that responsible for registering / deregistering containers that
expose a port normally used by web apps.
It does not depend on any other tool apart from Docker and dnsmasq
itself but it
plays really well with devstep, fig
and basically anything that creates Docker containers that is able to expose the
following ports:
80
3000
4000
4567
5000
8080
9000
9292
For some reason that I don't know yet the DNS / load balancer combo stopped
working every now and then during the early days of this project when a container
got removed. Even my Chrome browser crashed sometimes when the dnsmasq
started
misbehaving.
When that happens I first try restarting the dnsmasq
server launched by the
launch-host
script and if it still doesn't work I run:
sudo dpkg-reconfigure ubuntu14-libnss-resolver
docker rm -f easy-lb
./launch-host
If it still doesn't make things work please create an issue with as much information as possible on how to consistently reproduce your problem.
docker.dev
dnsmasq
as part of the load balancer containerdocker pull fgrehm/easy-lb