I like Docker. A lot.
Everything I build and deploy now ends up in their own container on some server/VPS of mine. One reason for this is because of how easy it is to move the site or service to another server if needed. Just export and import the Docker container and you’re done. No config on web and database servers needed, it’s all done.
But there’s one thing you need to do. You can’t have lots of containers listening on the same public port 80, so you have to have your containers listening on some random port like 4553, 4566, 4333 etc. But your site’s visitors are coming to port 80 so you need to somehow listen to port 80 and forward requests to the right Docker container on the right port.
There are several ways to do this and I started out with Nginx as a reverse proxy. This works fine but I don’t want a web server doing that. I’ve used HAProxy in the past for load balancing. And it is actually just what I need, a load balancer is made for forwarding requests.
So here’s how you use it as a reverse proxy for your docker containers.
Install HAProxy (Debian)
sudo apt-get install haproxy
Edit config file
sudo nano /etc/haproxy.cfg //Put this in the file global daemon maxconn 4096 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:80 acl is_site1 hdr_end(host) -i domain1.se acl is_site2 hdr_end(host) -i domain2.com use_backend site1 if is_site1 use_backend site2 if is_site2 backend site1 balance roundrobin option httpclose option forwardfor server s2 127.0.0.1:49153 maxconn 32 backend site2 balance roundrobin option httpclose option forwardfor server s1 127.0.0.1:2082 maxconn 32 listen admin bind 127.0.0.1:8080 stats enable
sudo /usr/sbin/haproxy -f /etc/haproxy.cfg -D -p /var/run/haproxy.pid
There are lots more stuff you can do with HAProxy but this is a basic forwarding proxy.
The only downside with this is that it’s static and any change in ports needs to manually be updated in HAProxy config file.
I’ve created a post on how you can automate this with Nginx config files, Nginx as a reverse proxy in front of your docker containers >>