Docker高級篇-網絡驅動

通信場景

本章我們繼續(xù)講解docker網絡驅動,在學習docker網絡驅動之前我們先思考下面幾個docker容器之間常見的通信場景:

1、同一dockerd守護進程內容器和容器之間如何通信

2、同一dockerd守護進程容器和主機其它服務進程之間如何通信

3、不同dockerd守護進程容器和容器之間如何通信

4、不同dockerd守護進程容器之間如何通信

回顧我們前面章節(jié)的myhelloworld例子,myhelloworld可以正常通過容器名稱訪問到myredis,這正是docker網絡驅動發(fā)揮的作用。在講解compose章節(jié)時我們似乎并沒有手動配置過網絡,而是compose幫我們配置好了。本章著重講解網絡驅動,接下來我們自己手動來管理和配置網絡驅動。


網絡模式

docker可以通過創(chuàng)建虛擬網卡,通過虛擬網卡轉發(fā)到宿主機網卡和外部進行通信。除此之外,也可以不創(chuàng)建自己的虛擬網卡而是直接和宿主機共用網卡直接占用宿主機IP和端口的方式和外部進行通信。docker網絡驅動是可插拔的,默認情況下存在以下幾種網絡模式:

1、橋接網絡模式(bridge:這是docker默認的網絡驅動程序,如果在創(chuàng)建驅動程序時未指定驅動程序類型,默認便是bridge模式。當你的應用程序是在同一個主機部署獨立容器時,推薦使用橋接網絡模式。連接到同一橋接網絡的容器可以互相通信,對不同橋接網絡的容器則無法直接相互通信。

2、覆蓋網絡模式(overlay:覆蓋網絡模式可以將不同的Dockerd守護進程連接在一起,該網絡模式支持集群容器之間相互通信,以及集群和某個單機版獨立容器直接相互通信,或不同Dockerd守護進程的獨立容器之間進行通信。該網絡模式使用場景比較廣泛,通常集群部署時會使用該模式。

3、主機網絡模式(host:如果某個容器需要訪問主機的某個服務,那么需要配置主機網絡模式,該模式直接占用主機的網絡端口和網卡資源。也就是說docker網絡并非隔離而是直接和宿主機共享資源,就好像應用是直接在宿主機上運行一樣。但是其它(例如存儲,進程命名空間和用戶命名空間)相對宿主機隔離的。該模式僅適用于Docker 17.06及更高版本的swarm服務。

4、MAC網絡模式(macvlan):Macvlan網絡允許您為容器分配MAC地址,使其顯示為網絡上的物理設備。Docker守護程序通過其MAC地址將流量路由到容器。macvlan?使用場景在于如果希望直接連接到物理網絡時,使用驅動程序有時是最佳選擇,而不是通過Docker宿主機的網絡堆棧進行路由。

5、禁用網絡模式(none:?禁用容器所有網絡。通常與自定義網絡驅動程序一起使用。none不適用于群組服務。

6、其它模式(網絡插件):可以使用Docker安裝和使用第三方網絡插件。這些插件可從?Docker Hub或第三方供應商處獲得。有關安裝和使用給定網絡插件的信息,請參閱供應商的文檔。


使用場景

下面我們總結下不同場景建議使用的網絡模式:

1、當您需要多個容器在同一個Docker宿主機上進行通信時,使用自定義的橋接網絡模式(bridge是最佳選擇。

2容器網絡堆棧不應與Docker主機隔離但希望隔離容器的其他方面cgroup,unix file system時,使用主機網絡模式(host最佳選擇。

3、當您需要在不同Docker守護進程上運行的容器進行通信時,或者當多個應用程序使用swarm服務協同工作時,覆蓋網絡模式(overlay是最佳選擇。

4、當您從VM設置遷移或需要容器看起來像網絡上的物理主機時,Macvlan網絡是最佳的,這樣每個主機都具有唯一的MAC地址。

5、另外如果以上模式都不能滿足您的需求是,可以查找第三方網絡插件進行集成。

?

使用方式

下面我們操練下網絡相關的命令,在沒有說明情況下,默認我們在node3節(jié)點上執(zhí)行。

在練習之前我們先在節(jié)點3安裝好docker ce且配置好daemon.json加速配置

1、查看網絡列表

docker network ls

當我們安裝好docker之后默認就已經創(chuàng)建好了3個不同網絡模式驅動。當我們直接執(zhí)行docker run xxxx沒有通過-network指定網絡驅動時,默認使用的是bridge。這種方式不建議在生產級使用,一般我們都會使用自定義網絡。自定義網橋的優(yōu)勢在于:

a、自定義網橋可以將某些容器加入到同一個網橋,這些容器在該網橋內部互相暴露所有端口。對外只會暴露指定映射出來的端口。

b、自定義網橋可以在容器之間提供DNS(通過容器名稱相互解析)解析,而默認網橋只能通過ip地址相互訪問,如果想在默認網橋上支持類型的功能需要使用--link選項

c、可以動態(tài)將運行中的容器與自定義網絡連接或斷開,不需要重啟。如果使用默認網橋,則需要停止容器,再通過不同選項重新創(chuàng)建容器。

d、可以針對自定義網橋進行個性化配置,而不會影響其它使用該網橋的容器。

?

2、查看bridge網橋詳細信息

docker network inspect bridge
//查看有哪些容器使用該網橋docker network inspect bridge | grep Containers -A 10


3、創(chuàng)建自定義橋接模式網絡my-bridge

docker?network?create?my-bridgedocker network create -d bridge my-bridge?


?

將前面演示的myhelloworld拉取到本地,然后使用自定義驅動my-bridge啟動:

node1:

docker login registry.laizhiy.cndocker tag?myhelloworld:latest?registry.laizhiy.cn/myhelloworld:latestdocker push?registry.laizhiy.cn/myhelloworld:latest

node3:

docker login registry.laizhiy.cndocker pull?registry.laizhiy.cn/myhelloworld:latestdocker psdocker run -d --rm \--name?myhelloworld?-p?8100:8100?\--network my-bridge \registry.laizhiy.cn/myhelloworld//查看my-bridge容器連接信息docker network inspect my-bridge | grep Container -A 10


可以看到,myhelloworld容器已經加入到我們自定義的網絡驅動my-bridge。

?

?

此時我們訪問:http://node3:8100/visitor


我們繼續(xù)在node3部署redis容器,然后測試使用默認bridge網絡和加入到自定義網絡my-bridgemyhelloworld連接myredis的情況。

docker run -d --rm --name myredis redisdocker network inspect bridge | grep Containers -A 10

?

現在myhelloworld通過--network 連接到my-bridge網橋,myredis連接到默認的bridge網橋,它們連接的是不同的網絡驅動(myhelloworld ),我們訪問

http://node3:8100/visitor

結果如下:

?

可以看到,不同的網絡網橋無法通信?,F在停止myredis容器,通過--network方式使用my-bridge網橋再次啟動容器,此時使用的和myhelloworld是同一個橋接模式的網橋:

docker stop myredisdocker run -d --rm --name myredis --network my-bridge redis//myredis已經不存在默認bridge網橋列表docker network inspect bridge | grep Containers -A 10

?

//確認自定義網橋my-bridge包含myredis和myhelloworld容器docker network inspect my-bridge | grep Containers -A 10

?

我們訪問

http://node3:8100/visitor

結果如下

?

可以看到,myhelloworld連上了myredis了。

通過自定義方式,可以自由斷開或重新連接網絡驅動,命令如下:

docker network disconnect my-bridge myredisdocker network connect my-bridge myredis


可以通過訪問

http://node3:8100/visitor

進行測試斷開和連上的情況。

如果要刪除某個網絡驅動可以執(zhí)行命令:

docker network rm my-bridge

刪除之前需要停止該網絡關聯的所有容器。


4、創(chuàng)建自定義主機模式網絡

docker network create -d host my-host

注意,一個宿主機只能有一個host網絡模式實例,不能創(chuàng)建多個。下面我們來演示一下主機模式網絡的使用。演示思路如下:

a、停止node3部署的myredis容器

docker stop myredis

b、node3上直接部署redis到宿主機上,具體部署方法自行百度

?

c、配置/etc/hosts,添加如下內容(因為myhelloworld配置文件配置的redis主機是myredis,所以要配置本地dns解析):

127.0.0.1 myredis

d、測試通過docker橋接模式網絡是否可以訪問到宿主機上的服務

目前myhelloworld使用的仍然是my-bridge橋接網絡,所以我們直接瀏覽器訪問:

http://node3:8100/visitor

?

可以看到使用橋接模式是訪問不了宿主機redis

e、測試主機模式是否可以訪問宿主機服務,停掉myhelloworld,通過--network指定網絡驅動為host(主機模式)重新啟動myhelloworld

docker stop myhelloworlddocker run -d --rm \--name myhelloworld \--network?host?-p?8100:8100?\ registry.laizhiy.cn/myhelloworld?//筆者為了方便,直接關閉防火墻,生產建議通過開放8100端口方式systemctl stop firewalld

此時我們訪問:

http://node3:8100/visitor

?

可以看到只有使用主機網絡模式才可以訪問宿主服務。

//確認myhelloworld的確是使用host(主機模式)網絡驅動docker network inspect host | grep Container -A 10

?

5、創(chuàng)建自定義覆蓋模式網絡

docker network create -d overlay my-overlaydocker network ls

執(zhí)行該命令前我們需要先初始化集群管理者(哪臺機子執(zhí)行init,哪臺就會成為集群管理者):

docker swarm init

關于覆蓋網絡的更多使用我們后面講解集群swarm時再講解。

6、創(chuàng)建自定義MAC模式網絡

docker network create -d macvlan  my-macvlan

7、創(chuàng)建禁用模式網絡

docker network create -d null my-none

注意,一個宿主機只能有一個null網絡模式實例,不能創(chuàng)建多個。


關于docker網絡驅動相關的知識我們暫時就講解到這里,更多關于docker網絡配置建議可以參考官方文檔或網絡資料進行學習。


-------------------- 正文結束 ------------------------

歡迎微信掃碼關注個人公眾號,更多資源分享給您。您的支持是我分享的最大動力。



?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容