這邊嘗試用情境來說明Docker使用者的網路需求,最常需要的就是我們要讓容器跟外界,尤其很多需求是容器之間要可以互相溝通,不過預設是無法這樣做的,本篇的最重要目標就是:讓容器互通
一般來說,Docker 預設的網路設定為bridge,會建議使用docker network指令進行container網路的管理,後面就知道如果docker不用這個指令執行,會有什麼問題發生。
這邊分析一下,如果docker network create intra之後,HOST的網卡會如何呈現:
以上呈現的就是host使用ifconfig,跟docker network ls,可以看到網卡會跟network物件的名稱有相關,另外ifconfig跟docker network inspect出的網路資訊也會相同
另外host ip route也可以觀察看看
後面都會使用已經安裝好常用網路工具的image: tedyang/ubuntu:1120912來進行操作,指令分別為:
docker run --rm -it --network=kind --name=ubuntu_1 tedyang/ubuntu:1120912
docker run --rm -it --network=intra --name=ubuntu_2 tedyang/ubuntu:1120912
容器對Host ping:pass
容器對外部 ping:pass
原因分析:Host並沒有開防火牆,ip route也有納入容器所使用的網段跟gw資訊,所以容器不能互通可能是Docker預設的模式。
經由官方文件檢視,是docker會修改iptables的設定,讓container 達成isolation
官方說明:https://docs.docker.com/network/packet-filtering-firewalls/
解法:增加網卡
docker network connect kind 7e8
作法就是增加對方的網卡,下ifconfig可以看到,已經增加一張同網段的網卡
測試結果:
ubuntu_1->ubuntu_2:x(因為這個container我沒有加對方的網卡,所以不通)
ubuntu_2->ubuntu_1:PASS
有些文章會用--link的方式讓容器互通,但官方已經說明未來不會支援這個語法了,所以建議還是使用官方建議的客製設定network的方式讓容器彼此互通。
官方說明將會移除--link的語法:
https://docs.docker.com/network/links/
參考:
https://docs.docker.com/engine/tutorials/networkingcontainers/