はじめに
投稿が遅れてしまい、7日目担当の@ryo-endoさんに抜かれてしまった、@mnagakuです。
自分で仕事を増やして、この体たらく。不甲斐ない。
いっそ、@ryo-endoさんの記事のフォローアップを書いて、時間の流れに逆らってみようとか思いましたが、そんなことやってる場合じゃないなと思ったので、予定通り、表題の話を書きます。
魔改造したJupyterでイベント会場のWiFi環境を爆誕させる話で紹介しているmnagaku/wifiでは、OSSのソフトウェアルータVyOSをコンテナ化して使っています。この周辺で、いろいろ動かなかったよとゆー体験談を書きます。
dockerのネットワーク回りは、当たり前ですが、dockerが想定するユースケースを満たすように作られていて、生のLinuxに可能な限り近付けるとゆー風には作られていません。この辺、過剰品質に行かないで、事前にゴールを決めて作ってるように見えるので、上手いことやってるなーと思わんこともないのですが、僕みたいな変態がいらんことやって、「こいつ動くぞ」「こうなることを予想して」みたいにならないのは、感動が足りないなとも思います。
因みに、dockerのバージョンは、17.09.0-ceです。
コンテナ化されたVyOSをフル機能で使えない
firewallやQoSの設定を入れると、エラーが出ます。
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」についてのコミュニティをはじめました。
に、参加申請を頂ければ、順次承認させて頂きます。これまで作成された資料の一覧や、今後の発表予定などの情報に加え、チュートリアルや情報交換のイベントもやっていきたいと思いますので、是非ご参加ください。よろしくお願いします。