如下內容參考:https://docs.docker.com/network/#network-drivershtml
Docker容器和服務如此強大的緣由之一是您能夠將它們鏈接在一塊兒,或者將它們鏈接到非Docker工做負載。Docker容器和服務甚至不須要知道它們部署在Docker上,或者它們的對等體是否也是Docker工做負載。不管您的Docker主機是運行Linux,Windows仍是二者兼而有之,您均可以使用Docker以與平臺無關的方式管理它們。docker
Docker的網絡子系統是可插拔的,使用驅動程序。默認狀況下存在多個驅動程序,並提供核心網絡功能:網絡
bridge
:默認網絡驅動程序。若是未指定驅動程序,則這是您要建立的網絡類型。當您的應用程序在須要通訊的獨立容器中運行時,一般會使用橋接網絡。見 橋接網絡。session
host
:對於獨立容器,移除了容器和Docker主機之間的網絡隔離,並直接使用主機的網絡。host
僅適用於Docker 17.06及更高版本上的羣集服務。請參閱 使用主機網絡。dom
overlay
:overlay網絡將多個Docker守護程序鏈接在一塊兒,並使羣集服務可以相互通訊。您還可使用overlay網絡來促進羣集服務和獨立容器之間的通訊,或者在不一樣Docker守護程序上的兩個獨立容器之間進行通訊。此策略無需在這些容器之間執行OS級別的路由。請參閱overlay網絡。ide
macvlan
:Macvlan網絡容許您爲容器分配MAC地址,使其顯示爲網絡上的物理設備。Docker守護程序經過其MAC地址將流量路由到容器。macvlan
在處理指望直接鏈接到物理網絡的傳統應用程序時,使用驅動程序有時是最佳選擇,而不是經過Docker主機的網絡堆棧進行路由。見 Macvlan網絡。ui
none
:對於此容器,禁用全部網絡。一般與自定義網絡驅動程序一塊兒使用。none
不適用於羣組服務。請參閱 禁用容器網絡。spa
網絡插件:您可使用Docker安裝和使用第三方網絡插件。這些插件可從 Docker Store 或第三方供應商處得到。有關安裝和使用給定網絡插件的信息,請參閱供應商的文檔。插件
只有在使用Docker EE並使用通用控制平面(UCP)管理Docker服務時,才能實現如下兩個功能:3d
該HTTP路由網格 可讓你分享多個服務之間的相同的網絡IP地址和端口。根據客戶端的請求,UCP使用主機名和端口的組合將流量路由到適當的服務。
會話粘性容許您在HTTP標頭中指定信息,UCP用於將後續請求路由到同一服務任務,適用於須要有狀態會話的應用程序。
如今您已瞭解Docker網絡的基礎知識,請使用如下教程加深理解:
在單機docker環境下,網絡模式主要有4種。
Bridge模式是Docker默認的網絡設置,此模式會爲每個容器分配Network Namespace、設置IP等,並將並將一個主機上的Docker容器鏈接到一個虛擬網橋上。
當Docker server啓動時,會在宿主機上建立一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理交換機相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中。
接下來就要爲容器分配IP了,Docker會從RFC1918所定義的私有IP網段中,選擇一個和宿主機不一樣的IP地址和子網分配給docker0,鏈接到docker0的容器就從這個子網中選擇一個未佔用的IP使用。如通常Docker會使用172.17.0.0/16這個網段,並將172.17.0.1/16分配給docker0網橋。
從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查看。
例子:
a、建立一個bridge:test-bs
b、建立2個container鏈接到test-bs
c、查看test-bs
[root@localhost mnt]# docker network inspect test-bs
[
{
"Name": "test-bs",
"Id": "ddad9fadb9d2defb77fc104afe38864bda800f24badbcc3200cd811fd491d31e",
"Created": "2018-11-18T20:51:35.991550414+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"01229f1d1846d95c28c24e4495c2b341536e4b0eb03e85edb2e0a8a4e9fb2761": {
"Name": "bs3",
"EndpointID": "2c3a2fecda6097f5478fa46b97f59e11b02d7d1ed38235d93d0f5cc03a225af4",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"da62f9854b9577dca817d73695388e1e4c5aaf695da87deb0bd5189e6a660582": {
"Name": "bs4",
"EndpointID": "3b692c438994636144eb3646338bc748935e5967b538185bcac9cfadf28a763c",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
從上面能夠看到,test-bs下面有2個容器,bs3和bs4,ip地址分別爲172.18.0.2/16和172.18.0.3/16。
若是啓動容器的時候使用host模式,那麼這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。
建立一個容器,host模式:
docker run -itd --name bs5 -h bs5 --net=host busybox
進入容器後,查看網絡:
發現網絡環境和宿主機如出一轍。
使用none模式,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。須要咱們本身爲Docker容器添加網卡、配置IP等。
建立一個none模式的容器:
從上圖能夠看出,none模式不會配置任何網絡,須要本身配置。
container模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。
原理圖以下:
建立一個container模式的容器:
進入容器查看,發現新建的容器和容器bs4如出一轍!
Docker主要經過netfilter/iptables實現網絡通訊。
一、 容器訪問網絡的原理主要依賴docker0(宿主機)和veth pair(容器)以及防火牆的SNAT和DNAT來實現和外部網絡的交流。
二、容器要出外網,經過veth pair設備先進入到宿主機,而後在宿主機中經過SNAT,將源IP替換爲Docker0的出口ip路由出去。
三、外界要訪問容器,先會到達容器的eth0,而後容器會根據要訪問的目標地址進行DNAT,經過宿主機上的路由進行轉發到內部容器,返回給外界。
容器經過將服務的實際端口在宿主機上進行端口映射,外部客戶端經過鏈接宿主機的映射端口來訪問容器內的服務。