安裝Docker時會自動創建3個網絡,可以使用docker network ls命令列出這些網絡。
Docker有以下4種網絡模式:
Host模式:使用--net=host指定。
Container模式:使用--net=container:NAME_or_ID指定。
None模式:使用--net=none指定。
Bridge模式:使用--net=bridge指定,默認設置。
1、Host模式
Docker底層使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡等。
一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、Iptables規則等都與其他的Network Namespace隔離。
一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Root Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。出于安全考慮不推薦使用這種網絡模式。
我們在192.168.100.131/24的機器上用Host模式啟動一個含有WEB應用的Docker容器,監聽TCP 80端口。當我們在容器中執行任何類似ifconfig命令查看網絡環境時,看到的都是宿主機上的信息。
而外界訪問容器中的應用,則直接使用192.168.100.131:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。
但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
2、Container模式
這個模式可以指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。
新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。
同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
使用--net=container:container_id/container_name,多個容器使用共同的網絡看到的ip是一樣的。
3、None模式
在這種模式下,Docker容器擁有自己的Network Namespace,但是并不為Docker容器進行任何網絡配置。
也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
4、Bridge模式(默認模式)
bridge模式是Docker默認的網絡設置,屬于一種NAT網絡模型,Docker daemon在啟動的時候就會建立一個docker0網橋(通過-b參數可以指定),每個容器使用bridge模式啟動時,Docker都會為容器創建一對虛擬網絡接口(veth pair)設備,這對接口一端在容器的Network Namespace,另一端在docker0,這樣就實現了容器與宿主機之間的通信。
在bridge模式下,Docker容器與外部網絡通信都是通過iptables規則控制的,這也是Docker網絡性能低下的一個重要原因。
使用iptables -vnL -t nat可以查看NAT表,在Chain Docker中可以看到容器橋接的規則。