通信場景
本章我們繼續(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-bridge或docker 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-bridge時myhelloworld連接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網絡配置建議可以參考官方文檔或網絡資料進行學習。
-------------------- 正文結束 ------------------------
歡迎微信掃碼關注個人公眾號,更多資源分享給您。您的支持是我分享的最大動力。