1. 程式人生 > >centos7下安裝docker(12.3容器之間的連通性)

centos7下安裝docker(12.3容器之間的連通性)

daemon 2.3 es2017 命令 selinux bridge 之前 -- 9.png

我們接著盜圖,如下:

技術分享

在這張圖上,可以看到,如果兩個容器使用同一個bridge,那麽兩個容器之間是互相能通的

技術分享

技術分享

技術分享

可以看到兩個容器在同一個bridge下是可以互相ping通的

技術分享

當兩個容器在不同的bridge的時候,容器之間是不能ping通的,(但是不同bridge的容器為什麽能ping通不同bridge的網關呢?)和拓撲圖是一樣的

如何讓兩個不同的網段之間能夠ping通呢?

1.增加路由

如果host上對每個網絡都有一個路由,同時操作系統上打開了ip forwarding,host就成了一個路由,掛在不同的網橋上的網絡就能夠互相ping通

我們可以看一下host上是否滿足這個條件

ip r查看路由表

技術分享

我們可以看到這些網段的路由表都定義好了,那我們再看一下ip forwarding

/proc/sys/net/ipv4/ip_forward,這裏面本來是0,我們將他改成1

技術分享

技術分享

我們開啟路由轉發後不同bridge之間是否能通信呢?

技術分享

可以看到ping向其他bridge的ip還是不能通,但是ping到網關是能通的

技術分享

2.為什麽已經開啟了路由轉發,還是不能互相通信啊?是不是因為防火墻?但是我的firewalld 和selinux都已經全部關閉了啊

但是linux內核還有個iptables,我們看一下iptables規則

技術分享

可以看到bridge被iptables給DROP掉了,從命名規則 DOCKER-ISOLATION可知:docker 在設計上就是要隔離不同的network

那是不是我們更改一下iptables的規則就可以實現不同bridge容器間的通信呢,答案是肯定的(由於本人iptables特別不好,所以這裏就不討論了)

3.我們還可以通過docker另外的增加網卡的辦法來解決:

使用docker network connect給容器增加一塊新的網卡

技術分享

可以看到我們通過docker network connect 這個命令給容器添加網卡eth1,並讓這個網卡使用另外的bridge,現在不同bridge之間的容器建可以進行通信

容器間的通信方式其實有三種:

1.IP通信:

上面我們討論的相同bridge的容器間的通信與不同的bridge之間的通過docker network connect增加網卡使容器間通信,都屬於基於IP方式的通信

2.docker dns server:

我們在部署應用之前可能無法確定IP,部署之後在指定IP可能比較麻煩,docker 自帶的DNS 服務可以解決這個問題

docker 從1.10版本開始,docker daemon實現了一個內嵌的DNS server,使容器可以直接通過容器名進行通信,

方法也很簡單,只要在運行容器的時候通過--name指定容器名,就可以了

技術分享

技術分享

運行了兩個容器名字為name1和name2,為什麽我用name2去pingname1時,不能ping通呢?

因為,這個DNS server通信的方式只適用於user-defined的網絡

技術分享

技術分享

試驗結果為:確實是需要user-defined的網絡,才能實現dns server的通信方式

技術分享

但是不同bridge之間的容器通過DNS的通信方式還是不能實現

3.joined通信方式

joined容器非常特別,它可以使兩個或兩個以上的容器共享一個網絡棧,共享網卡和配置信息,joined容器可以使容器之間可以通過127.0.0.1直接進行通信

技術分享

技術分享

通過--nemwork=container:name5的方式將一個新建的容器加入另外一個容器後,兩個容器間就有了相同的mac和ip,他們共享了相同的網絡棧

技術分享

name5可以直接通過127.0.0.1直接訪問新建httpd容器的http服務

joined通信方式非常適合一下場景:

1.不同容器的程序希望通過loopback高效快速通信,比如web server與app server

2.希望監控其他容器的流量,比如運行在獨立的容器中的網絡監控程序

centos7下安裝docker(12.3容器之間的連通性)