docker利用namespaces和cgroups實現了應用隔離和資源控制,那么網絡層優勢如何實現的呢?是直接使用宿主機的網卡設備,還是獨立創造出自己的網絡設備?以及容器如何與外界通信,下面我們通過簡單的說明以及示例,討論下單機模式下docker的網絡模式。
docker單機模式下,主要有四種網絡模式,可以在創建容器的時候通過--network參數指定,這四種網絡模式如下:
1、--network=bridge:網橋模式,這是docker默認的網絡模式,這種模式下,容器創建的時候,會生成一個獨立的網卡設備eth0,但是這個網卡設備無法直接同外部通信,需要通過網絡設備對veth,將容器內的eth0與docker0網橋連通,然后docker0與宿主機的eth0通過轉發綁定端口映射,實現容器內部同外部的通信。
容器創建語法:docker run -d --name container_name --network bridge -p xxx:xxx image_name,由於是默認的,所以不指定--network參數默認就是這種模式
示意圖如下:
2、--network=container:這種模式,docker在創建容器的時候會指定使用已經存在的容器的網卡設備作為新建容器的網卡設備。這中模式需要注意,由於是多個容器共用同一個eth0,所以需要注意端口沖突問題。
容器創建語法:docker run -d --name container_name --network container:已經存在的容器名稱 -p xxx:xxx image_name
示意圖如下:
3、--network=host:這種模式,創建容器的時候,不會新建網卡設備,而是使用宿主機的網卡設備eth0,在這種模式下,容器直接使用宿主機的IP,同樣要注意端口的沖突問題。
容器創建語法:docker run -d --name container_name --network host -p xxx:xxx image_name
示意圖如下:
4、--network=none:這種模式下,容器無法與外界通信,只能使用容器內部的回環(127.0.0.1)在容器內部通信。
容器創建語法:docker run -d --name container_name --network none image_name
示意圖如下:
以上是單機模式下docker的網絡模式,在實際使用中,為了高可用,都是在集群模式下,相關的網絡模式將在后面繼續討論。不足之處,歡迎指正。