天天看點

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

上一節我們學習了 Weave 網絡内部如何通信,今天讨論 Weave 如何與外界通信。

weave 是一個私有的 VxLAN 網絡,預設與外部網絡隔離。外部網絡如何才能通路到 weave 中的容器呢?

答案是:

首先将主機加入到 weave 網絡。

然後把主機當作通路 weave 網絡的網關。

要将主機加入到 weave,執行 <code>weave expose</code>。

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

這個 IP <code>10.32.0.3</code> 會被配置到 host1 的 weave 網橋上。

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

這是個精妙的設計,讓我們再看看下面 host1 的網絡結構:

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

weave 網橋位于 root namespace,它負責将容器接入 weave 網絡。給 weave 配置同一 subnet 的 IP 其本質就是将 host1 接入 weave 網絡。 host1 現在已經可以直接與同一 weave 網絡中的容器通信了,無論容器是否位于 host1。

在 host1 中 ping 同一主機的 bbox1:

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

ping host2 上的 bbox3:

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

接下來要讓其他非 weave 主機通路到 bbox1 和 bbox3,隻需将網關指向 host1。例如在 192.168.56.101 上添加如下路由:

ip route add 10.32.0.0/12 via 192.168.56.104

能夠 ping 到 weave 中的容器了。

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)

通過上面的配置我們實作了外網到 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 網絡方案。

Weave 如何與外網通信?- 每天5分鐘玩轉 Docker 容器技術(66)