上一節我們學習了 Weave 網絡内部如何通信,今天讨論 Weave 如何與外界通信。
weave 是一個私有的 VxLAN 網絡,預設與外部網絡隔離。外部網絡如何才能通路到 weave 中的容器呢?
答案是:
首先将主機加入到 weave 網絡。
然後把主機當作通路 weave 網絡的網關。
要将主機加入到 weave,執行 <code>weave expose</code>。

這個 IP <code>10.32.0.3</code> 會被配置到 host1 的 weave 網橋上。
這是個精妙的設計,讓我們再看看下面 host1 的網絡結構:
weave 網橋位于 root namespace,它負責将容器接入 weave 網絡。給 weave 配置同一 subnet 的 IP 其本質就是将 host1 接入 weave 網絡。 host1 現在已經可以直接與同一 weave 網絡中的容器通信了,無論容器是否位于 host1。
在 host1 中 ping 同一主機的 bbox1:
ping host2 上的 bbox3:
接下來要讓其他非 weave 主機通路到 bbox1 和 bbox3,隻需将網關指向 host1。例如在 192.168.56.101 上添加如下路由:
ip route add 10.32.0.0/12 via 192.168.56.104
能夠 ping 到 weave 中的容器了。
通過上面的配置我們實作了外網到 weave 這個方向的通信,反方向呢?
其實答案很簡單:因為容器本身就挂在預設的 bridge 網絡上,docker0 已經實作了 NAT,是以容器無需額外配置就能通路外網。
10.32.0.0/12 是 weave 網絡使用的預設 subnet,如果此位址空間與現有 IP 沖突,可以通過 <code>--ipalloc-range</code> 配置設定特定的 subnet。
weave launch --ipalloc-range 10.2.0.0/16
不過請確定所有 host 都使用相同的 subnet。
Weave 網絡方案我們就讨論到這裡,下一節學習 Calico 網絡方案。