FRRouting で routing できる環境を Docker で作ろうとしたお話
FRRouting なるものの存在を知ってしまい, 動かしてみたくなったのがきっかけです
Quagga から fork して開発してるらしいです
私はこれを見たときめんどくさそう...ってのが第一感想でした
Docker ないかな...って探したら普通にありましたね. こちら
とりあえずこの通りにDocker For Mac で動かしてみました
問題なく動いたんですが, nic が Mac の nic をそのまま認識していて????
どうやら, Docker の --net オプションで host を指定するとどうやら HostOS の nic をそのまま使うらしい
つまり, ubuntu の上にそのまま動かせば良さそう
今回考えた構成は, ubuntu の Docker の上に frr の Docker を動かしてやろうという頭の悪いことします
Q. そもそも Docker の上で Dcoker が動くのか?
A. できそう. dind (Docker in Docker) とか Docker マトリョーシカとか前例あり
docker run に --privileged オプションをつければできる. 参考
実際に Docker For Mac で ubuntu 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 ネットワークについてちょっと詳しくなれたなって感じです
やはり手を動かさないとわからないことってあるなって思いました