Docker使用overlay网络遇到的问题
一般我们使用Overlay网络都是涉及到多台主机中的Docker容器通信问题。
Docker Overlay 一切准备就绪后,使用docker-compose 启动容器。
在一个业务服务的容器日志里面发现无法连接的Zookeeper,错误是:
1 | java.net.NoRouteToHostException: No route to host |
在容器中尝试ping 10.0.0.3 容器,发现不通:
1 | PING zookeeper (10.0.0.3) 56(84) bytes of data. |
刚开始查询了一些资料后,以为是防火墙(CentOS7)问题,于是查看了防火墙状态:
1 | firewall-cmd --state |
结果防火墙压根没开:
1 | not running |
由于之前没有详细查看docker overlay网络的使用限制,一直以为只要docker的版本保持在1.9.1+就可以了。后来又查了下,发现还有一个限制:内核版本大于等于3.16。于是赶紧查看了下内核版本:
1 | # uname -r |
果然内核版本低了,于是开始升级内核。
导入elrepo的key,然后安装elrepo的yum源:
1 | sudo rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
列出可用的内核相关包:
1 | yum --disablerepo="*" --enablerepo="elrepo-kernel" list available |
lt为长期维护版本,mt为稳定版本,可以看到最新的稳定版本为:
1 | 5.2.10-1.el7.elrepo |
开始升级内核(以后可以直接执行这句):
1 | sudo yum -y --enablerepo=elrepo-kernel install kernel-ml.x86_64 kernel-ml-devel.x86_64 |
升级完后需要重启一下:
1 | reboot |
再次查看内核:
1 | uname -r |
WTF,为什么还是老的?原来是启动的时候还是默认选择了老的内核,这里需要重新设置一下启动时的默认内核:
首先查看当前都有哪些启动项:
1 | cat /boot/grub2/grub.cfg |grep menuentry |
设置默认选项(需要升级为root用户):
1 | grub2-set-default 'CentOS Linux (5.2.10-1.el7.elrepo.x86_64) 7 (Core)' |
再次重启,重启后查看内核:
1 | uname -r |
OK,内核成功升级,再次启动Docker试试(别忘了启动服务发现,我这里是ETCD):
ETCD启动:
1 | ./etcd --name docker-node3 --initial-advertise-peer-urls http://10.208.10.17:2380 --listen-peer-urls http://10.208.10.17:2380 --listen-client-urls http://10.208.10.17:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.208.10.17:2379 --initial-cluster-token etcd-cluster --initial-cluster docker-node1=http://10.208.10.14:2380,docker-node2=http://10.208.10.16:2380,docker-node3=http://10.208.10.17:2380 --initial-cluster-state new & |
Docker 启动:
1 | sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://10.208.10.14:2379 --cluster-advertise=10.208.10.14:2375 & |
当所有主机都完成上述操作时,发现容器间总算可以互通了。
其他问题:
1 | error locating sandbox id c43437e6300a0c6ea20d2d9f95bbe318e557d1eedfa585ab5218345eeef32a36: sandbox c43437e6300a0c6ea20d2d9f95bbe318e557d1eedfa585ab5218345eeef32a36 not found |
1 | could not get network sandbox (oper true): failed get network namespace "" |
最好删除之前创建的network和container,否则可能出现其他问题。
不同主机上的容器间使用hostname或者container name通信好像有问题,可以使用docker swarm来解决。
参考资料:
https://www.centos.bz/2017/08/upgrade-centos-7-6-kernel-to-4-12-4/
Docker使用overlay网络遇到的问题