通信場景
本章我們繼續(xù)講解docker網(wǎng)絡(luò)驅(qū)動脱盲,在學(xué)習(xí)docker網(wǎng)絡(luò)驅(qū)動之前我們先思考下面幾個docker容器之間常見的通信場景:
1炕置、同一dockerd守護進程內(nèi)容器和容器之間如何通信
2硫戈、同一dockerd守護進程容器和主機其它服務(wù)進程之間如何通信
3、不同dockerd守護進程容器和容器之間如何通信
4、不同dockerd守護進程容器之間如何通信
回顧我們前面章節(jié)的myhelloworld例子,myhelloworld可以正常通過容器名稱訪問到myredis卿啡,這正是docker網(wǎng)絡(luò)驅(qū)動發(fā)揮的作用。在講解compose章節(jié)時我們似乎并沒有手動配置過網(wǎng)絡(luò)菱父,而是compose幫我們配置好了颈娜。本章著重講解網(wǎng)絡(luò)驅(qū)動,接下來我們自己手動來管理和配置網(wǎng)絡(luò)驅(qū)動浙宜。
網(wǎng)絡(luò)模式
docker可以通過創(chuàng)建虛擬網(wǎng)卡官辽,通過虛擬網(wǎng)卡轉(zhuǎn)發(fā)到宿主機網(wǎng)卡和外部進行通信。除此之外粟瞬,也可以不創(chuàng)建自己的虛擬網(wǎng)卡而是直接和宿主機共用網(wǎng)卡直接占用宿主機IP和端口的方式和外部進行通信同仆。docker的網(wǎng)絡(luò)驅(qū)動是可插拔的,默認(rèn)情況下存在以下幾種網(wǎng)絡(luò)模式:
1亩钟、橋接網(wǎng)絡(luò)模式(bridge):這是docker默認(rèn)的網(wǎng)絡(luò)驅(qū)動程序乓梨,如果在創(chuàng)建驅(qū)動程序時未指定驅(qū)動程序類型,默認(rèn)便是bridge模式清酥。當(dāng)你的應(yīng)用程序是在同一個主機部署獨立容器時,推薦使用橋接網(wǎng)絡(luò)模式蕴侣。連接到同一橋接網(wǎng)絡(luò)的容器可以互相通信焰轻,對不同橋接網(wǎng)絡(luò)的容器則無法直接相互通信。
2昆雀、覆蓋網(wǎng)絡(luò)模式(overlay):覆蓋網(wǎng)絡(luò)模式可以將不同的Dockerd守護進程連接在一起辱志,該網(wǎng)絡(luò)模式支持集群容器之間相互通信,以及集群和某個單機版獨立容器直接相互通信狞膘,或不同Dockerd守護進程的獨立容器之間進行通信揩懒。該網(wǎng)絡(luò)模式使用場景比較廣泛,通常集群部署時會使用該模式挽封。
3已球、主機網(wǎng)絡(luò)模式(host):如果某個容器需要訪問主機的某個服務(wù),那么需要配置主機網(wǎng)絡(luò)模式,該模式直接占用主機的網(wǎng)絡(luò)端口和網(wǎng)卡資源智亮。也就是說docker網(wǎng)絡(luò)并非隔離而是直接和宿主機共享資源忆某,就好像應(yīng)用是直接在宿主機上運行一樣。但是其它(例如存儲阔蛉,進程命名空間和用戶命名空間)相對宿主機隔離的弃舒。該模式僅適用于Docker 17.06及更高版本的swarm服務(wù)。
4状原、MAC網(wǎng)絡(luò)模式(macvlan):Macvlan網(wǎng)絡(luò)允許您為容器分配MAC地址聋呢,使其顯示為網(wǎng)絡(luò)上的物理設(shè)備。Docker守護程序通過其MAC地址將流量路由到容器颠区。macvlan?使用場景在于如果希望直接連接到物理網(wǎng)絡(luò)時削锰,使用驅(qū)動程序有時是最佳選擇,而不是通過Docker宿主機的網(wǎng)絡(luò)堆棧進行路由瓦呼。
5喂窟、禁用網(wǎng)絡(luò)模式(none):?禁用容器所有網(wǎng)絡(luò)。通常與自定義網(wǎng)絡(luò)驅(qū)動程序一起使用央串。none不適用于群組服務(wù)磨澡。
6、其它模式(網(wǎng)絡(luò)插件):可以使用Docker安裝和使用第三方網(wǎng)絡(luò)插件质和。這些插件可從?Docker Hub或第三方供應(yīng)商處獲得稳摄。有關(guān)安裝和使用給定網(wǎng)絡(luò)插件的信息,請參閱供應(yīng)商的文檔饲宿。
使用場景
下面我們總結(jié)下不同場景建議使用的網(wǎng)絡(luò)模式:
1厦酬、當(dāng)您需要多個容器在同一個Docker宿主機上進行通信時,使用自定義的橋接網(wǎng)絡(luò)模式(bridge)是最佳選擇瘫想。
2仗阅、當(dāng)容器網(wǎng)絡(luò)堆棧不應(yīng)與Docker主機隔離但又希望隔離容器的其他方面(cgroup,unix file system)時,使用主機網(wǎng)絡(luò)模式(host)是最佳選擇国夜。
3减噪、當(dāng)您需要在不同Docker守護進程上運行的容器進行通信時,或者當(dāng)多個應(yīng)用程序使用swarm服務(wù)協(xié)同工作時车吹,覆蓋網(wǎng)絡(luò)模式(overlay)是最佳選擇筹裕。
4、當(dāng)您從VM設(shè)置遷移或需要容器看起來像網(wǎng)絡(luò)上的物理主機時窄驹,Macvlan網(wǎng)絡(luò)是最佳的朝卒,這樣每個主機都具有唯一的MAC地址。
5乐埠、另外如果以上模式都不能滿足您的需求是抗斤,可以查找第三方網(wǎng)絡(luò)插件進行集成囚企。
?
使用方式
下面我們操練下網(wǎng)絡(luò)相關(guān)的命令,在沒有說明情況下豪治,默認(rèn)我們在node3節(jié)點上執(zhí)行洞拨。
在練習(xí)之前我們先在節(jié)點3安裝好docker ce且配置好daemon.json加速配置
1、查看網(wǎng)絡(luò)列表
docker network ls
當(dāng)我們安裝好docker之后默認(rèn)就已經(jīng)創(chuàng)建好了3個不同網(wǎng)絡(luò)模式驅(qū)動负拟。當(dāng)我們直接執(zhí)行docker run xxxx沒有通過-network指定網(wǎng)絡(luò)驅(qū)動時烦衣,默認(rèn)使用的是bridge。這種方式不建議在生產(chǎn)級使用掩浙,一般我們都會使用自定義網(wǎng)絡(luò)花吟。自定義網(wǎng)橋的優(yōu)勢在于:
a、自定義網(wǎng)橋可以將某些容器加入到同一個網(wǎng)橋厨姚,這些容器在該網(wǎng)橋內(nèi)部互相暴露所有端口衅澈。對外只會暴露指定映射出來的端口。
b谬墙、自定義網(wǎng)橋可以在容器之間提供DNS(通過容器名稱相互解析)解析今布,而默認(rèn)網(wǎng)橋只能通過ip地址相互訪問,如果想在默認(rèn)網(wǎng)橋上支持類型的功能需要使用--link選項
c拭抬、可以動態(tài)將運行中的容器與自定義網(wǎng)絡(luò)連接或斷開部默,不需要重啟。如果使用默認(rèn)網(wǎng)橋造虎,則需要停止容器傅蹂,再通過不同選項重新創(chuàng)建容器。
d算凿、可以針對自定義網(wǎng)橋進行個性化配置份蝴,而不會影響其它使用該網(wǎng)橋的容器。
?
2氓轰、查看bridge網(wǎng)橋詳細(xì)信息
docker network inspect bridge
//查看有哪些容器使用該網(wǎng)橋
docker network inspect bridge | grep Containers -A 10
3婚夫、創(chuàng)建自定義橋接模式網(wǎng)絡(luò)my-bridge
docker?network?create?my-bridge
或
docker network create -d bridge my-bridge?
?
將前面演示的myhelloworld拉取到本地,然后使用自定義驅(qū)動my-bridge啟動:
node1:
docker login registry.laizhiy.cn
docker tag?myhelloworld:latest?registry.laizhiy.cn/myhelloworld:latest
docker push?registry.laizhiy.cn/myhelloworld:latest
node3:
docker login registry.laizhiy.cn
docker pull?registry.laizhiy.cn/myhelloworld:latest
docker ps
docker 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容器已經(jīng)加入到我們自定義的網(wǎng)絡(luò)驅(qū)動my-bridge请敦。
?
?
此時我們訪問:http://node3:8100/visitor
我們繼續(xù)在node3部署redis容器,然后測試使用默認(rèn)bridge網(wǎng)絡(luò)和加入到自定義網(wǎng)絡(luò)my-bridge時myhelloworld連接myredis的情況储玫。
docker run -d --rm --name myredis redis
docker network inspect bridge | grep Containers -A 10
?
現(xiàn)在myhelloworld通過--network 連接到my-bridge網(wǎng)橋,myredis連接到默認(rèn)的bridge網(wǎng)橋萤皂,它們連接的是不同的網(wǎng)絡(luò)驅(qū)動(myhelloworld )撒穷,我們訪問
http://node3:8100/visitor
結(jié)果如下:
?
可以看到,不同的網(wǎng)絡(luò)網(wǎng)橋無法通信●晌酰現(xiàn)在停止myredis容器端礼,通過--network方式使用my-bridge網(wǎng)橋再次啟動容器禽笑,此時使用的和myhelloworld是同一個橋接模式的網(wǎng)橋:
docker stop myredis
docker run -d --rm --name myredis --network my-bridge redis
//myredis已經(jīng)不存在默認(rèn)bridge網(wǎng)橋列表
docker network inspect bridge | grep Containers -A 10
?
//確認(rèn)自定義網(wǎng)橋my-bridge包含myredis和myhelloworld容器
docker network inspect my-bridge | grep Containers -A 10
?
我們訪問
http://node3:8100/visitor
結(jié)果如下
?
可以看到,myhelloworld連上了myredis了蛤奥。
通過自定義方式佳镜,可以自由斷開或重新連接網(wǎng)絡(luò)驅(qū)動,命令如下:
docker network disconnect my-bridge myredis
docker network connect my-bridge myredis
可以通過訪問
http://node3:8100/visitor
進行測試斷開和連上的情況凡桥。
如果要刪除某個網(wǎng)絡(luò)驅(qū)動可以執(zhí)行命令:
docker network rm my-bridge
刪除之前需要停止該網(wǎng)絡(luò)關(guān)聯(lián)的所有容器蟀伸。
4、創(chuàng)建自定義主機模式網(wǎng)絡(luò)
docker network create -d host my-host
注意缅刽,一個宿主機只能有一個host網(wǎng)絡(luò)模式實例啊掏,不能創(chuàng)建多個。下面我們來演示一下主機模式網(wǎng)絡(luò)的使用衰猛。演示思路如下:
a迟蜜、停止node3部署的myredis容器
docker stop myredis
b、在node3上直接部署redis到宿主機上啡省,具體部署方法自行百度
?
c娜睛、配置/etc/hosts,添加如下內(nèi)容(因為myhelloworld配置文件配置的redis主機是myredis卦睹,所以要配置本地dns解析):
127.0.0.1 myredis
d畦戒、測試通過docker橋接模式網(wǎng)絡(luò)是否可以訪問到宿主機上的服務(wù)
目前myhelloworld使用的仍然是my-bridge橋接網(wǎng)絡(luò),所以我們直接瀏覽器訪問:
http://node3:8100/visitor
?
可以看到使用橋接模式是訪問不了宿主機redis的
e分预、測試主機模式是否可以訪問宿主機服務(wù)兢交,停掉myhelloworld,通過--network指定網(wǎng)絡(luò)驅(qū)動為host(主機模式)重新啟動myhelloworld
docker stop myhelloworld
docker run -d --rm \
--name myhelloworld \
--network?host?-p?8100:8100?\
registry.laizhiy.cn/myhelloworld
?//筆者為了方便笼痹,直接關(guān)閉防火墻配喳,生產(chǎn)建議通過開放8100端口方式
systemctl stop firewalld
此時我們訪問:
http://node3:8100/visitor
?
可以看到只有使用主機網(wǎng)絡(luò)模式才可以訪問宿主服務(wù)。
//確認(rèn)myhelloworld的確是使用host(主機模式)網(wǎng)絡(luò)驅(qū)動
docker network inspect host | grep Container -A 10
?
5凳干、創(chuàng)建自定義覆蓋模式網(wǎng)絡(luò)
docker network create -d overlay my-overlay
docker network ls
執(zhí)行該命令前我們需要先初始化集群管理者(哪臺機子執(zhí)行init晴裹,哪臺就會成為集群管理者):
docker swarm init
關(guān)于覆蓋網(wǎng)絡(luò)的更多使用我們后面講解集群swarm時再講解。
6救赐、創(chuàng)建自定義MAC模式網(wǎng)絡(luò)
docker network create -d macvlan my-macvlan
7涧团、創(chuàng)建禁用模式網(wǎng)絡(luò)
docker network create -d null my-none
注意,一個宿主機只能有一個null網(wǎng)絡(luò)模式實例经磅,不能創(chuàng)建多個泌绣。
關(guān)于docker網(wǎng)絡(luò)驅(qū)動相關(guān)的知識我們暫時就講解到這里,更多關(guān)于docker網(wǎng)絡(luò)配置建議可以參考官方文檔或網(wǎng)絡(luò)資料進行學(xué)習(xí)预厌。
-------------------- 正文結(jié)束 ------------------------
歡迎微信掃碼關(guān)注個人公眾號阿迈,更多資源分享給您。您的支持是我分享的最大動力轧叽。