为了便于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容器看看,发现容器仍是不能跟外部机器访问,只能在同网段内访问
此时须要查看宿主机的网络是否开启了网络的混杂模式,通常服务器都默认关闭混杂模式的,这个坑找了很久