同一ホスト上のDockerコンテナ間とホスト-コンテナ間の通信はどちらが早いのだろうか

3 min read読了の目安(約3200字

なんとなく気になって確認したのでメモ

とりあえずtracerouteしてみた感じどっちも間に何もなかったので
あんまり差は出なそうと思った

コンテナ-コンテナ間

# traceroute -U 172.17.0.2
traceroute to 172.17.0.2 (172.17.0.2), 30 hops max, 60 byte packets
 1  172.17.0.2 (172.17.0.2)  0.065 ms  0.009 ms  0.008 ms

ホスト-コンテナ間

$ traceroute -U 172.17.0.2
traceroute to 172.17.0.2 (172.17.0.2), 30 hops max, 60 byte packets
 1  172.17.0.2 (172.17.0.2)  0.054 ms  0.007 ms  0.005 ms

手っ取り早く計測したかったのでUDPでポート開いたコンテナに別のコンテナ及びホストOSから/dev/zeroを突っ込んでどれくらい速さに差が出るのかで比較する
という完全に我流の測定方法で比較してみた

こんなやり方じゃだめだよ的な指摘があればコメントお願いします。

試したDockerのバージョン

$ docker version 
Client:
 Version:           20.10.2
 API version:       1.41
 Go version:        go1.13.8
 Git commit:        20.10.2-0ubuntu1~20.04.2
 Built:             Tue Mar 30 21:24:57 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.2
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.8
  Git commit:       20.10.2-0ubuntu1~20.04.2
  Built:            Mon Mar 29 19:10:09 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.3-0ubuntu2.3
  GitCommit:        
 runc:
  Version:          spec: 1.0.2-dev
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:

コンテナ-コンテナ間

コンテナを2個立ち上げて調査に必要なパッケージを入れる

$ docker run -it --rm ubuntu bash
root@0999f600f3b0:/# apt update -y && apt install -y pv netcat iproute2

両方のコンテナのIPを調べる

root@82de58e15a8c:/# ip a show eth0
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@0999f600f3b0:/# ip a show eth0
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

172.17.0.2にて速度測定調査用のポートをOPEN

# nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null

172.17.0.3から/dev/zeroを172.17.0.2に転送する

root@0999f600f3b0:/# nc -u 172.17.0.2 8080 < /dev/zero

すると172.17.0.2が50GB分のデータを受信した時点で終わります
(ポート開いてからデータ送信するまでの時間が0bps扱いになるからすばやく一連の作業をこなしました)

root@82de58e15a8c:/# nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null
50.0GiB 0:01:30 [ 564MiB/s] [ 564MiB/s] [==================================================================================================================================>] 100%

コンテナーコンテナ間は564MiB/sでした

ホストーコンテナ間

やることは同じです172.17.0.3でやったことをホストOSでやれば172.17.0.2で速度が表示されます。

$ nc -lu 172.17.0.2 8080 | pv -Ss 50G -ptebar > /dev/null
50.0GiB 0:01:08 [ 742MiB/s] [ 742MiB/s] [==================================================================================================================================>] 100%

ホストーコンテナ間は742MiB/sでした

結論

何度かやったけど数M程度の誤差でした。

この事から何が言えるかって。。。?🤔

どっちかからでっかいデータ流す必要が出たときはホストOSからコンテナに流すほうが1.3倍くらい早いのでオススメ?(今までそんな事態になったこと無。。。🤐)

以上、現場からお届けしました。

P.S.

完全に興味本位でやった内容なので誰の役にも立たない記事になってる気がする🤣