network周りでハマった話2016.06.16TweetPocketjunchang1031エンジニアDockerこんにちは。Composeな構成を、VPNなどネットワーク的な制約が幾つかある環境に構築しました。その際にいくつかハマり、学びがあったので記事にしたいと思います。Composeが隠蔽しているネットワークの作成docker_gwbridgeの利用するネットワークよくよく公式ドキュメントを読むと、普通に書いてあることがほとんどですが、きちんと読まず適宜ググりながら作業してしまったため、色々な情報に振り回され結果解決に時間がかかってしまいました。それぞれ少し補足していきます。v1.9から、Dockerが通常使うネットワークのセグメントとは別に、ユーザー独自のネットワークを定義できるようになりました。日頃Dockerを触っている方はほとんどご存知だと思いますし、私も存在は知っていました。私が構築するシステムでは特に独自ネットワークは必要ないと思い、あまり詳しく追っていませんでした。(これは大きな間違いでした。後ほど触れます)で、subnetを指定しない時どうなるか。結論を言ってしまうと、Dockerがデフォルトで使用するネットワークとは別の、Docker側で用意されているネットワーク領域のうち一つが自動で適用されます。Dockerが使用するネットワークであるdocker0(デフォルト172.17.0.0/16)が、私の環境では内部LANと競合するのはわかっていたので、予め別のネットワークを割り当てていました。自分が予期しないところで作成していたbridgeネットワークがこのルールに適用されたため、sshが突如繋がらなくなるなど予期しない挙動に苦しまされました。ちなみに、公式ドキュメントにはこの旨しっかりと記載があります。network.せっかくなのでDockerのコードちょっとだけ見ました。)この辺が使われているようです。Compose、便利ですよね。cluster内でのコンテナの立ち上げを、非常に簡単に行うことができます。便利、簡単ゆえにですが、裏側でのネットワークの作成を開発環境等では意識しておらず、前述の環境下でハマりました。Swarmクラスタ上にコンテナの立ち上げを行う際には、以下のネットワークが必要になります。manager、nodeを横断して一つ作られる名前は指定なしの場合。Dockerのクラスタを組む、イコール独自ネットワークを作るということに他ならないのです。自動作成されるこれらのネットワークは、存在しない場合は自動で作成されます。便利なのですが、逆にこのネットワークが問題になった時にとてもわかりにくいです。(知ってしまえば簡単ですが)docker_gwbridgeの利用するネットワークdocker_gwbridgeはbridgeネットワークなので、ホスト側の設定として反映されます。存在しない場合デフォルトで作成され、かつ使用するネットワークがDockerに自動で決められるため、環境によっては前述のとおり非常に困ることになります。言ってしまえば、今回私が苦しんだ原因の9割がこの動きのせいでした・・docker_gwbridgeのsubnet指定ところで、docker_gwbridgeは自動で作られてしまうし、subnetはどうやって指定すれば良いのでしょうか。これはドキュメントにも載っておらず、最後の悩みとなりました。する前に事前に作っておけとのこと。コメントでは--optsとありましたがtypoだと思われます。networkの仕組みはまだ流動的なようなので、一旦これで良しとしました。結論なんだかんだで、公式ドキュメントにしっかりと目を通すことが大事です。stackoverfl○wやQ○itaに頼りすぎると痛い目を見ます。