nemunemu_zzzの日記

備忘録的な何かになればいいな

FRRouting で routing できる環境を Docker で作ろうとしたお話

FRRouting なるものの存在を知ってしまい, 動かしてみたくなったのがきっかけです

FRRとは

Quagga から fork して開発してるらしいです

ubuntu 環境での FRR の展開方法がこちら

私はこれを見たときめんどくさそう...ってのが第一感想でした

Docker ないかな...って探したら普通にありましたね. こちら

とりあえずこの通りにDocker For Mac で動かしてみました

問題なく動いたんですが, nicMacnic をそのまま認識していて????

どうやら, Docker の --net オプションで host を指定するとどうやら HostOS の nic をそのまま使うらしい

つまり, ubuntu の上にそのまま動かせば良さそう

今回考えた構成は, ubuntu の Docker の上に frr の Docker を動かしてやろうという頭の悪いことします

Q. そもそも Docker の上で Dcoker が動くのか?

A. できそう. dind (Docker in Docker) とか Docker マトリョーシカとか前例あり

docker run に --privileged オプションをつければできる. 参考

実際に Docker For Macubuntu Docker に dind で frr 動きました.

あとは docker の nic が増やせれば問題なさそうですね

今回 Docker の nic を増やすのには, Open VSwitch を使うことにしました.  

理由は Docker に対して, OVS を使ってるケースを見かけるのと, OVS 触ったことないからってだけです. 参考

ほんとはこの参考サイトをもとに構成しようと思ったのですが, ubuntu in frr の dind が容量を取るため, ルータは2つだけで検証

とりあえず, OVS を使うために, VituralBox で ubuntu を立ち上げる.

ubuntu に入って, OVS を install

$ sudo apt install openvswitch-switch

bridge を作成

$ sudo ovs-vsctl add-br switch1

次に Docker を install

こちらの記事通りの手順で問題なく動きます

Docker で ubuntu のコンテナを作ります

$ sudo docker run -t -d --privileged --name router1 ubuntu:18.04
$ sudo docker run -t -d --privileged --name router2 ubuntu:18.04

次に 立ち上げた router コンテナ を OVS で繋いでいく

$ sudo ovs-docker add-port switch1 eth1 router1 --ipaddress=10.0.1.1/24
$ sudo ovs-docker add-port switch1 eth1 router2 --ipaddress=10.0.1.2/24

これで, 各コンテナに eth1 が生えました

疎通の確認も取れました

$ sudo docker exec -it router1 ping -c 2 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.067 ms

--- 10.0.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1035ms
rtt min/avg/max/mdev = 0.067/0.220/0.373/0.153 ms

ここで何回も OVS の設定をやり直していると, VM の ubnutu にゴミの nic が大量にできてしまい通信がうまく行かなくて悩まされてました

VM 再起動でゴミは全部消しました

さらにここから, ubuntu docker に frr docker を乗せていきます. まずはコンテナ内へ

$ sudo docker exec -it router1 /bin/bash

ubuntu で docker を入れる手順は上記と同じです. frr を落としてきます

# docker pull cumulusnetworks/frrouting
# docker run -t -d --net=host --privileged --name frr cumulusnetworks/frrouting:latest

ここで問題が発生しまして

# docker run -t -d --net=host --privileged --name frr cumulusnetworks/frrouting:latest
Unable to find image 'cumulusnetworks/frrouting:latest' locally
latest: Pulling from cumulusnetworks/frrouting
d54efb8db41d: Pull complete
f8b845f45a87: Pull complete
e8db7bf7c39f: Pull complete
9654c40e9079: Pull complete
6d9ef359eaaa: Pull complete
4a732078a2f1: Pull complete
4f7cbc8d602e: Pull complete
13725b9e5347: Pull complete
37b1b30cb517: Pull complete
1549dc55e52f: Pull complete
daac6794bfc5: Pull complete
ab5b5e4985df: Pull complete
d017e3cc4bac: Pull complete
0587bcefe519: Pull complete
Digest: sha256:8049446ceee0c4a2bc9ee29965c2b14cead85f944fddaaba0d4477e7611772e0
Status: Downloaded newer image for cumulusnetworks/frrouting:latest
docker: Error response from daemon: error creating aufs mount to /var/lib/docker/aufs/mnt/a45f20517fb6460ff82bec1811f90f55a607a0d4abb0a6f6b328f19f33151992-init: invalid argument.

Docker For Mac でやったときはなんの問題もなくコンテナを動かせたのにエラーが出ました

とりあえず docker info で 目diff で違いを探した結果 Storage Driver に違いがありました

Mac では vfs, ubuntu docker では aufs

エラーの内容的にもここを変更すればなんかいけそう

てなわけで変更します. 参考

storage driver の違いはちゃんと見てないので把握してませんが, vfs にします

# service docker stop // まず docker を止める
# dockerd --storage-driver=vfs & //裏で動かす. そうするとDriver が vfs に変わっている
# docker run -t -d --net=host --privileged --name frr cumulusnetworks/frrouting:latest

これで通るようになります. 実際にコンテナが作成されていることが確認できます

# docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS               NAMES
d7657055e400        cumulusnetworks/frrouting:latest   "/usr/lib/frr/start.…"   5 hours ago         Up 5 hours                              frr

これで後は frr でループバックアドレス設定して, ospf 設定したら router1 と router2 で lo に対して ping が通りました

ルーティングのところはまた今度...

ルータ2つ brige 1つで容量は12G くらい

なんとなくVirtual Box を何個も立てずに Docker でできないかなって意地になってやりましたが, VM に frr コンテナを立てた方が楽ですね(容量的にも)

今回はこんな頭の悪いことしましたが, docker ネットワークについてちょっと詳しくなれたなって感じです

やはり手を動かさないとわからないことってあるなって思いました