Posted at
DockerDay 6

dockerに向いてないことを無理矢理やった話(ネットワークがらみ)

More than 1 year has passed since last update.


はじめに

投稿が遅れてしまい、7日目担当の@ryo-endoさんに抜かれてしまった、@mnagakuです。

自分で仕事を増やして、この体たらく。不甲斐ない。

いっそ、@ryo-endoさんの記事のフォローアップを書いて、時間の流れに逆らってみようとか思いましたが、そんなことやってる場合じゃないなと思ったので、予定通り、表題の話を書きます。

魔改造したJupyterでイベント会場のWiFi環境を爆誕させる話で紹介しているmnagaku/wifiでは、OSSのソフトウェアルータVyOSをコンテナ化して使っています。この周辺で、いろいろ動かなかったよとゆー体験談を書きます。

dockerのネットワーク回りは、当たり前ですが、dockerが想定するユースケースを満たすように作られていて、生のLinuxに可能な限り近付けるとゆー風には作られていません。この辺、過剰品質に行かないで、事前にゴールを決めて作ってるように見えるので、上手いことやってるなーと思わんこともないのですが、僕みたいな変態がいらんことやって、「こいつ動くぞ」「こうなることを予想して」みたいにならないのは、感動が足りないなとも思います。

因みに、dockerのバージョンは、17.09.0-ceです。


コンテナ化されたVyOSをフル機能で使えない

firewallやQoSの設定を入れると、エラーが出ます。


firewallの例

vyos@vyos# set firewall name FW1 rule 1 destination address 192.168.14.0/24

[edit]
vyos@vyos# set firewall name FW1 rule 1 action drop
[edit]
vyos@vyos# set firewall name FW1 default-action accept
[edit]
vyos@vyos# commit
[ firewall twa-hazards-protection disable ]
sh: /proc/sys/net/ipv4/tcp_rfc1337: No such file or directory

[[firewall]] failed
[[firewall name FW1]] failed
Commit failed
Aborted


ソフトウェアルータって、ベンダーの機器みたいな設定方法を受け付けて、Linuxのiptablesとかsysctlとかに翻訳して実行してくれる、とゆーのが基本的な振る舞いだと思うのですが、この辺、カーネルパラメータを書き換えようとしたりするので、/proc以下のファイルが見つかんないとか、エラーが出ます。

コンテナですもんね......

natとかルーティングは大丈夫でした。


ネットワークのアタッチ順が不定

dockerでネットワークをどうこうってなったら、普通は複数のコンテナが絡むので、composeすると思います。で、複数のbridgeネットワークを作って、コンテナにアタッチするわけですが、コンテナから見えるインタフェース名とbridgeネットワークの関係が、一意ではなく不定です。restartで入れ替わったりもします。

どうした兄弟、インタフェース名がeth1だろうがeth2だろうが、192.168.14.0/24と通信できることには違いがないぜ、HAHAHA、的な感じです。

まあ、一般的なアプリケーションの分散配備なら、疎通できることが要件なので、それで良いです。ただ、僕は、eth1とeth2にそれぞれのsubnetに合わせてdhcpサービスしたりしたかったんですよね。

デフォルトのネットワークが必ずeth0に来るのだけは確実っぽかったので、composeの起動時は、デフォルトとeth1に来て欲しいネットワークだけ付けておいて、起動後にdockerコマンドでeth2に付けたいネットワークをアタッチすることで解決しました。

因みに、composeではなくdockerコマンドではどんな感じかとゆーと、dockerが管理してるブリッジネットワークの名前をソートして最初に見つかるものを、デフォルトネットワークとしてアタッチするとゆー、これまた微妙な振る舞いになっています。ネットワークを複数使う場合は、起動時にデフォルトネットワークを明示的に指定してあげるのが安全そうです。ルーティングのデフォルトの向き先がどのインタフェースかってこともあるし、こっちの方が気を付ける必要大きいですね。


おわりに

明示的にインタフェースを指定して操作するようなことに、現状のdockerは向いていません。お約束を守れば、IPレベルのルーティングは大丈夫なので、普通は問題にならないと思います。


追記

docker好きな人の中には、構築・運用な人もいると思うので......

jupyterのnotebookを「実行できる手順書」とする「Literate Computing for Reproducible Infrastructure」についてのコミュニティをはじめました。

https://www.facebook.com/groups/LiterateComputing/

に、参加申請を頂ければ、順次承認させて頂きます。これまで作成された資料の一覧や、今後の発表予定などの情報に加え、チュートリアルや情報交換のイベントもやっていきたいと思いますので、是非ご参加ください。よろしくお願いします。