Docker network performance

I think everyone has thought about what the difference between BRIDGE and HOST modes to run containers, except run applications with the same port. To test network performance we need 2 instances:

I chose http://software.es.net/iperf/ to measure the network bandwidth. Very simple and have enough features to check basic metrics. On the server instance, we require the docker. I tested against Docker 1.12.6 version.

Test Original Network Throughput

First, we need to get the original stats without docker containers. Running on the server instance:

[root@192.168.89.3 ~]# iperf3 -s -p 5202

and on the client machine:

[root@192.168.89.4 ~]# iperf3 -c 192.168.89.3 -p 5202

Both server and client would return useful information. For now, we need only the result values:

Connecting to host 192.168.89.3, port 5202
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval       Transfer   Bandwidth     Retr
[  4] 0.00-10.00 sec 884 MBytes 742 Mbits/sec 75  sender
[  4] 0.00-10.00 sec 882 MBytes 740 Mbits/sec     receiver

I use c4.large instances and AWS limit the network to 500 Mbit/sec, here we have a bit more: 740Mbit/sec.

Test Docker container with Network mode

To run iperf3 in the docker is quiet simple. There are a lot of images available in the hub.docker.com.

[root@192.168.89.3 ~]# docker run --net=host  -it --rm --name=iperf3-server networkstatic/iperf3 -s -p 5203

From client side there are no changes, only I changed the default ports depends on how we run the server iperf3:

[root@192.168.89.4 ~]# iperf3 -c 192.168.89.3 -p 5203      # Run client
Connecting to host 192.168.89.3, port 5202
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval       Transfer   Bandwidth    Retr
[  4] 0.00-10.00 sec 884 MBytes 741 Mbits/sec 63  sender
[  4] 0.00-10.00 sec 881 MBytes 739 Mbits/sec     receiver

The results are pretty the same: 740 Mbit/sec.

Test Docker container with Bridge mode

This time I used next port. So you can run in same time all servers and do tests.

[root@192.168.89.3 ~]# docker run  -it --rm -p 5204:5204 --name=iperf3-server networkstatic/iperf3 -s -p 5204

From client side there are no changes:

[root@192.168.89.4 ~]# iperf3 -c 192.168.89.3 -p 5204
Connecting to host 192.168.89.3, port 5202
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval       Transfer   Bandwidth     Retr
[  4] 0.00-10.00 sec 692 MBytes 580 Mbits/sec 405     sender
[  4] 0.00-10.00 sec 691 MBytes 580 Mbits/sec         receiver

OK. We have only 580 Mbit/sec. It is 80% of the maximum allowed. When we did test few years ago, for older versions of docker we had 50%.

Summary

There is no risk of reaching or exceeding the maximum throughput of your network by running an application inside the docker. Result table:

| Max Possible | Host mode    | Bridge mode  |
| 740 Mbit/sec | 740 Mbit/sec | 580 Mbit/sec |
| 100 %        | 100 %        | 80 %         |

That’s all folks!

Michael Nikitochkin is a Lead Software Engineer. Follow him on LinkedIn or GitHub.

If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories.