The dev team faced recently a problem of handling to many requests at once. It happens in the largest factory during the shift change. Whenever a new brigade starts the duty they simply switch on their machines which ends up as requests flood coming at the weak and fragile central server.
To find a solution they first needed to run around 150 instances of the edge application at once in a lab environment. Obviously they couldn’t bring 150 machines from the factory into the office.
And here comes my approach based on Docker. I have put their edge app into an image and I have written a little script that brings up as many containers as they wish. This made them happy however a drawback of this approach appeared pretty quickly – all request from all containers arrived at the central server sourced from the same IP address and this obviously does not represent the actual behavior of the factory.
OK lets tweak this.
First we can bring up as many IP aliases on a single network interface as we wish. Then we can bind each container to specific IP of the host. We can do this with well known -p switch as follows
docker run -p host_address:host_port:container_port image_name
You can test this by yourself.
In this example my WiFi interface wlp0s20f3 already has an IP 192.168.43.153. Let’s bring up two aliases
ifconfig wlp0s20f3:0 192.168.43.154 up
ifconfig wlp0s20f3:1 192.168.43.155 up
This way my PC gained two additional IP’s .154 and .155
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.153 netmask 255.255.255.0 broadcast 192.168.43.255
wlp0s20f3:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.154 netmask 255.255.255.0 broadcast 192.168.43.255
wlp0s20f3:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.155 netmask 255.255.255.0 broadcast 192.168.43.255
Lets use nginx for the sake of simlicity. Starting three containes and binding them individually to certain IP address looks like this
docker run -p 192.168.43.153:8080:80 -v ${PWD}:/usr/share/nginx/html nginx
docker run -p 192.168.43.154:8080:80 -v ${PWD}:/usr/share/nginx/html nginx
docker run -p 192.168.43.155:8080:80 -v ${PWD}:/usr/share/nginx/html nginx
Pay attention that I use port 8080 three times here. It would fail if the IP binding would’t be successful. I also attach three different index.html per each container to observe that the response differs depending on the requested IP address.