轉載http://blog.sina.cn/dpool/blog/s/blog_4da051a60102wf8o.html
Docker網絡基礎
目前docker的網絡基礎模型主要是通過以下幾種技術實現:- network namespaces
- 提供網絡相關資源隔離 - linux network bridge
- 連接多個不同網段 - veth pair
- 兩個虛擬網卡組成的數據通道 - iptables
- 提供NAT功能及相關容器網絡安全限制
Docker網絡模式
Docker默認的網絡模式是bridge模式,其他三種模式分別是host、container、none,具體的介紹可以參看:Docker: 4種網絡模式以及bridge模式下容器的通信
docker服務默認會在啓動時候創建一個
docker0
的 虛擬網橋,實際上是 Linux 的一個
bridge,可以理解爲一個軟件交換機。它會在掛載到它的網口之間進行轉發。同時,Docker 隨機分配一個本地未佔用的私有網段中的一個地址給
docker0
接口。此後啓動的容器內的網口也會自動分配一個同一網段(172.17.0.0/16)的地址。當創建一個 Docker 容器的時候,同時會創建了一對 veth pair
接口(當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。這對接口一端在容器內,即eth0
;另一端在本地並被掛載到docker0
veth2dff631
)。
容器eth0網卡從docker0網橋所在的IP網段中選取一個未使用的IP,容器的IP在容器重啓的時候會改變。docker0的IP爲所有容器的默認網關。容器與外界通信爲NAT。
docker暴露端口
NOTEdocker可以通過以下兩種端口映射配置方法來暴露端口提供服務:
在docker啓動後,由於容器的ip是私有ip,這些 ip 是基於本地系統的,
並且容器的端口非本地主機是訪問不到的。
除此之外,docker容器的 ip 在每次啓動的時候都會改變。
爲了解決這些問題,Docker通過端口綁定主機系統的接口,
允許非本地客戶端訪問容器內部運行的服務。
- 自動端口映射:
--expose
或
通過在dockerfile中使用
EXPOSE xxx
,來記錄需要暴露的端口; 或者在啓動容器執行docker run時候,使用
--expose=xxx
。 這個參數配置僅僅只是記錄,並不會真正將端口映射到宿主機上,還需要在運行時加上
-P
參數, Docker會自動爲用戶創建端口映射規則,並且幫助避免端口映射的衝突。
使用
-P
自動暴露端口時,外部的端口值會在49000-49900這個端口池中隨機挑選一個。- 指定綁定端口:
-p
在啓動容器執行docker run時候,使用-p
參數顯式,
將一個或者一組端口從容器裏綁定到宿主機上,而不僅僅是提供一個端口。
-p ip:hostPort:containerPort
-p ip::containerPort
-
-p containerPort
可以忽略ip或者hostPort,但是必須要指定需要暴露的containerPort。
另外,所有這些發佈的規則都默認爲tcp,如果是udp需要顯示指定,比如
-p 1234:1234/udp
。兩種配置方法的區別可以參考:Docker網絡原則入門