最近公司要使用docker容器,还要使用docker swarm进行MySQL集群化。刚开始在本地的三台虚拟机上尝试,一切正常。在公司服务器进行docker pull image,docker run 创建容器也都没有问题。但在docker swarm init的时候遇到一个很难解决的问题:error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/swarm/init: 和 dockerd[21754]: http: panic serving @: runtime error: index out of range。详细日志如下:

docker swarm如何启动 docker swarm init_docker swarm如何启动

因为百度和谷歌都没有答案,只能靠自己摸索。下面是解决思路:

1:是否是版本问题。尝试了docker-18.06.1-ce.tgz,docker-17.12.1-ce.tgz,docker-18.06.2-ce.tgz,docker-18.06.3-ce.tgz几个版本,都会出现问题,确定不是版本问题。

2:是否是安装方式问题。上面是离线安装方式,又尝试了yum安装方式,还是有问题,确定不是安装方式问题。

3:再次查看详细日志,看看是否能有些头绪,如上图标出来的位置,想着能到GitHub上看下源码,如下:

docker swarm如何启动 docker swarm init_openvswitch_02

根据报错日志找到了上面的1768行:case nl.IFLA_BOND_ARP_ALL_TARGETS,应该是和arp有一定关系。于是查看了arp,把多余的arp删除,服务器reboot。重启后还是有问题。

4:再次陷入失望,那就通过抓包工具tcpdump,来看一下,监听了各个网卡接口,但没有抓取到swarm的请求数据。

5:在失望中再次考虑应该是什么问题导致,难道是硬件问题,这个可能性很小。难道是路由器问题,我本地虚拟机通过同一个路由器是可以成功的。

6:难道是静态ip配置导致,更改本地虚拟机的网络配置为静态ip,没有重现问题。

7:想着想着,想到了谷歌时,一位外国网友在重启机器后遇到的切片错误,他说可能是网络配置问题,但是什么样的配置会导致失败呢?会不会是网卡呢,只能尝试把不用的网卡全都移除,和我本地的网卡一一比对后,只留下下面的网卡,多余的都删除。先通过ethtool -i 查看网卡的driver是什么,比如:

docker swarm如何启动 docker swarm init_openvswitch_03

br0网卡的driver为openvswitch,就使用ovs-vsctl del-br br0删除,其他类似。只留下如下网卡:

docker swarm如何启动 docker swarm init_docker_04

最后服务器reboot。再次docker warm init 成功。