为了便于docker容器跟非宿主机的网络通讯,对比了几中实现方式的区别:
实现方式 | 描述 | 实现依赖 | 优点 | 缺点 |
NAT | 端口映射,对外访问使用宿主机IP | 不需要依赖任何插件 | 直接同宿主机连接,网络性能较好 | 只能单机部署,不能同时存在多个类似坏境 |
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 实现网络直接的通讯.,此方式借鉴于,使得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" dockernetgateway 建议设置成宿主机的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容器看看,发现容器还是不能跟外部机器访问,只能在同网段内访问
此时需要查看宿主机的网络是否开启了网络的混杂模式,一般服务器都默认关闭混杂模式的,这个坑找了好久