Docker基礎教程(4)-網絡模式詳解

什麼叫作docker網絡

什麼是Docker網絡呢?總的來講,網絡中的容器們能夠相互通訊,網絡外的又訪問不了這些容器。具體來講,在一個網絡中,它是一個容器的集合,在這個概念裏面的一個容器,它會經過容器的IP直接去通訊,又能保證在這個集合外的一些容器不可以經過這個容器IP去通訊,能作到網絡隔離。網絡這個概念是由網絡的驅動去建立、管理的。網絡的驅動又分爲全局的和本地的,全局的意思是這個網絡能夠跨主機,不必說個人兩個容器非要在一個主機上才能經過這個網絡去通訊,我能夠在不一樣主機上仍是經過容器的IP相互通訊linux

Docker基礎網絡模式

bridge網絡模式

bridge網絡是docker的默認網絡模式,在Docker守護進程啓動時,docker會建立一個叫作docker0的虛擬網橋,咱們使用ifconfig便可發現該網橋docker

[root@hyb 00]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:e4:f5:21:0f  txqueuelen 0  (Ethernet)
        RX packets 13283505  bytes 7512128044 (6.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9775175  bytes 4471271028 (4.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
複製代碼

能夠看到該網橋的ip爲172.17.0.1(linux 默認宿主機的虛擬網橋ip,mac,windows下有所不一樣),當你每建立一個容器後,都會鏈接到這個虛擬網橋中,能夠理解成一種網絡代理,因此你在項目中獲取ip的時候,若是直接獲取ip可能獲取到的就是172.17.0.1,記得要繞過代理獲取真實的ipwindows

再建立一個docker容器後,docker0的ip爲默認的網關,並在主機上建立一對網卡,一個叫作eth0放在容器內做爲容器的默認網卡,一個叫vethXXX相似的名字放在主機中,而且加入到docker0網橋之中,而後給該容器分配一個對應的ip 通常選擇172.17.0.0/16的ip分配給各個容器bash

那麼docker的端口映射是怎麼實現的呢,首先咱們要了解一下iptables,iptables是防火牆的一部分,也能夠作轉發和拒絕的策略,有興趣的同窗能夠單獨去了解,docker的端口映射就是用iptables來實現,咱們能夠運行命令iptables -t nat -vnL查看,運行後在最下方能夠找到一段微信

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination              
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9797 to:172.17.0.2:873
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2222 to:172.17.0.2:22
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:50000 to:172.17.0.3:50000
16721  700K DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.3:8080
複製代碼

從上面的代碼中能夠看到 咱們外網請求的tcp,dpt協議的請求,都被對應的轉發到172.17.0.0/16中的對應子網中,這樣就是實現了端口的轉發網絡

none 網絡模式

使用none模式,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息,只有lo 網絡接口。須要咱們本身爲Docker容器添加網卡、配置IP等。  不參與網絡通訊,運行於此類容器中的進程僅能訪問本地迴環接口;僅適用於進程無須網絡通訊的場景中,例如:備份、進程診斷及各類離線任務等tcp

host網絡模式

host模式是容器與Docker主機共享同一網絡命名空間(namespace),Docker主機的網絡協議棧、路由表、iptables規則、網卡、IP、端口等等都是共享的。容器跟宿主機都在同一網絡視圖下。這個模式很好的解決了容器與外界通訊地址轉換的問題,能夠直接使用宿主機的IP進行通訊,那麼這裏的網絡流量和壓力走的都是宿主機的網卡,性能會比較高。不過這個有風險,由於容器跟宿主機是共享一套網絡機制,沒有隔離。那麼會引發網絡資源與宿主機的競爭和衝突關係。規模小的場景,能夠使用這種模式。主機網絡驅動程序僅適用於Linux主機,不支持Windows及Mac平臺。性能

container 網絡模式

這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊ui

感謝閱讀spa

有興趣能夠關注個人我的微信公衆號,會按期推送關於Java的技術文章,並且目前不恰飯都是乾貨哈哈哈哈

小阿宅Java
相關文章
相關標籤/搜索