docker 的 網絡模式
docker 自帶 3 種 網絡模式:分別是bridge網絡,host網絡,none網絡,可以使用 docker network ls 命令查看。
1.none網絡
none模式可以在容器創建時通過--network=none來指定。這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。
使用none模式,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
這種網絡模式下容器只有lo回環網絡,沒有其他網卡。這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。

2.host網絡
通過命令--network=host指定。
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
使用host模式的容器可以直接使用宿主機的IP地址與外界通信,容器內部的服務端口也可以使用宿主機的端口,不需要進行NAT,host最大的優勢就是網絡性能比較好,但是docker host上已經使用的端口就不能再用了,網絡的隔離性不好。
3.bridge網絡
容器的默認網絡模式,docker在安裝時會創建一個名為docker0的Linux bridge,在不指定--network的情況下,創建的容器都會默認掛到docker0上面。
當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。
從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新創建的容器中,並命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網絡設備加入到docker0網橋中。可以通過brctl show命令查看。
bridge模式是docker的默認網絡模式,不寫--net參數,就是bridge模式。使用docker run -p時,docker實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。
創建多個容器,都不指定 net 情況下 , docker network inspect bridge, 查看 bridge 網絡情況。
查看 主機網橋情況 ,brctl show, 在 docker0 網橋下有3個接口,對應前面容器的各自的虛擬網卡。創建一個容器之后一個新的網絡接口被掛載到了docker0上,這個就是容器創建時創建的虛擬網卡。bridge模式為容器創建獨立的網絡棧,保證容器內的進程使用獨立的網絡環境,使容器之間,容器和docker host之間實現網絡隔離。
這里可以看出 docker0 網橋 上對應有3個容器掛靠的虛擬網卡, 此 3 個容器之間可以互相通信,因為在同一個網橋下。
思考?? 不同網橋下的容器間 能通信嗎?
1. 先手動建立一個 bridge 模式的新 網橋, docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 new_bridge
2. docker network ls 可以查看 docker 下現在的網絡模式(新加的那個)
3. docker run -name test1 -ti --net=new_bridge 鏡像名 (用新網橋的一個容器 test1)
4. docker run -name test2 -ti --net=bridge 鏡像名 (用 docker 默認網橋的一個容器test2)
5. 進入到其中一個容器 ,ip a 查看網卡,ping 另一個容器IP
6. 進另一個容器,同上。 兩個容器IP段不一樣。 不同網橋,會創建不同網段的虛擬網卡給容器 。
7. 不同網橋下的容器間 不能ping通, 在於docker 設計時候就隔離了不同網橋
8. docker network connect new_bridge test2 // 為 test2 容器添加一塊 new_bridge的 虛擬網卡,這樣test2 上會 創建一個新的虛擬網卡,網段就是 新網橋設置的。
9. 如此就能互相ping通。
4.container模式
創建容器時使用--network=container:NAME_or_ID這個模式在創建新的容器的時候指定容器的網絡和一個已經存在的容器共享一個Network Namespace,
這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。
5.user-defined模式
用戶自定義模式主要可選的有三種網絡驅動:bridge、overlay、macvlan。bridge驅動用於創建類似於前面提到的bridge網絡;overlay和macvlan驅動用於創建跨主機的網絡。
前面自定義的網絡模式 new_bridge 就是新網絡模式。另外兩個后面在驗證。
docker的端口映射
docker的端口映射,能保證在外部網絡 訪問 同一設備上不同容器時候 不會因為端口問題產生沖突。
docker 可將容器對外提供服務的端口映射到 host 的某個端口,外網通過該端口訪問容器。容器啟動時通過-p
參數映射端口:
可以使用-p
參數顯式將一個或者一組端口從容器里綁定到宿主機上,而不僅僅是提供一個端口。注意這里是小寫的p,不是大寫。
因為該配置依賴於宿主機器,所以Dockerfile里沒有對應的指令,這是運行時才可用的配置。-p
參數有幾種不同的格式:
ip:hostPort:containerPort| ip::containerPort | hostPort:containerPort | containerPort