5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerAdvent Calendar 2017

Day 6

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

Posted at

はじめに

投稿が遅れてしまい、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」についてのコミュニティをはじめました。

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

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?