爲了便於docker容器跟非宿主機的網絡通信,對比了幾中實現方式的區別:linux
實現方式docker |
描述服務器 |
實現依賴網絡 |
優勢ssh |
缺點性能 |
NATui |
端口映射,對外訪問使用宿主機IPspa |
不須要依賴任何插件.net |
直接同宿主機鏈接,網絡性能較好插件 |
只能單機部署,不能同時存在多個相似壞境 |
weave |
使用weave爲docker設置IP |
|
Docker自身功能 |
性能折損大 |
Overlay |
Docker 1.9版本自帶 |
通常須要一個全局的K-V store(sdn controller、etcd、consul)來保存控制信息 |
部署極其方便 |
性能折損較大 |
路由 |
Docker插件calico/fannel實現 |
安裝網絡插件外,不依賴於其餘網絡設備,能夠創建獨立的網絡環境 |
性能好,每一個容器可設置獨立於辦公網絡的IP |
每一個容器都須要一條路由記錄,當容器太多時,對於路由是必定的壓力 |
Linux bridge |
將docker網絡橋接到宿主機的網絡 |
不須要依賴任何插件
|
配置、查找問題簡單 |
IP資源消耗大,須要依賴辦公網現有的網絡設備 |
鑑於以上,選擇linux bridge 實現網絡直接的通信.,此方式借鑑於PPTV的網絡模式,使得docker容器共享宿主機網段網絡,最好是建立一個網段專門適用於docker容器,不然就有點浪費IP資源。
Linux bridge網絡拓撲結構以下:
大概的寫一下幾個主要的命令,以及我操做時遇到的問題和當時的解決方法:
建立docker network:
docker network create --gateway=10.X.X.X --subnet=10.X.X.0/24 -o com.docker.network.bridge.name=br0 --aux-address "DefaultGatewayIPv4=10.X.X.2" dockernet
gateway 建議設置成宿主機的IP,其中br0爲Linux橋接網絡,DefaultGatewayIPv4爲你要設置網段的網關。
1.設置完成後檢查網絡是否鏈接OK,通常沒法鏈接的狀況有:Linux橋接網絡設置失敗.
以下爲Linux網關丟失,
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.x.0.0 0.0.0.0 255.255.0.0 U 1005 0 0 br0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
網關丟失時手動添加網關:route add default gw 10.X.X.2
2.網絡鏈接成功後,再啓動容器時指定網絡:再啓動docker容器來看看
docker run -itd --net=dockernet --ip=10.x.x.x ssh
通常啓動警告:WARNING IPv4 forwarding is disabled. Networking will not work
解決辦法:
# vi /etc/sysctl.conf
添加以下代碼:
net.ipv4.ip_forward=1
重啓network服務
# /etc/init.d/network restart
查看是否修改爲功
# sysctl net.ipv4.ip_forward
若是返回爲「net.ipv4.ip_forward = 1」則表示成功了
3.再次啓動docker容器看看,發現容器仍是不能跟外部機器訪問,只能在同網段內訪問
此時須要查看宿主機的網絡是否開啓了網絡的混雜模式,通常服務器都默認關閉混雜模式的,這個坑找了很久