内核版本:3.10.0-123.el7.x86_64。

是它是它就是它,又是一个小冤家.

自从发现了简单安装Docker的方式,想着就不用苦逼的一个一个下载rpm安装了...就可以一边哼着歌一边把原来一天才能干完的活压缩到半天了.也的确有几次是这么爽的,但今天爽歪了。

像往常一样把Docker服务安装好,把需要的镜像从外网传到内网再load,再启动redis,mysql等项目需要的容器。真是一顿操作猛如虎,还带丝般顺滑。可应该怎么也启动不起来,查看日志是说链接不上MySql.去MySql容器中查看mysql服务是正常的,刚才还新建了数据库表的。难道启动容器时忘记添加-p参数或者端口映射错误了?赶紧检查下:

tianlang@tianlang-VirtualBox:~$ docker ps
 CONTAINER ID   IMAGE                             COMMAND                  CREATED        STATUS        PORTS                                                      NAMES
 d4217fc419fd   daocloud.io/library/redis:5.0.4   "docker-entrypoint.s…"   4 months ago   Up 23 hours   0.0.0.0:6379->6379/tcp                                     redis
 5855a5f7ec9a   mysql:8                           "docker-entrypoint.s…"   4 months ago   Up 23 hours   0.0.0.0:13306->3306/tcp                                    mysql8从docker ps信息可以看到容器时做了端口映射了的,端口也是正确的。难道是端口冲突映射时失败了?赶紧再检查下:            
 tianlang@tianlang-VirtualBox:~$ sudo netstat -anp|grep 13306
 tcp        0      0 0.0.0.0:13306           0.0.0.0:*               LISTEN      1785/docker-proxy

从netstat输出信息看端口也的确是docker监听了的。就是这么奇怪,什么看上去都正常但就是不能在宿主机上访问容器中的mysql.只有mysql容器是这样的吗?很遗憾redis也存在同样的问题,就是这么不幸。

看来是docker服务有问题了,尝试了使用rpm包重装,重启iptables,关闭防火墙,关闭selinux等等,一顿折腾,连不通的还是连不通。

博主刚开始也是一通折腾,后来确定是docker创建网桥时遇到了系统Bug,同时天涯踩Bug人啊!可以升级内核解决也可以使用brctl自己创建网桥分配给docker使用。

客户的机器升级内核不太可能了,只能尝试使用brctl创建网桥尝试最后一下子了.

1.关闭docker服务,添加网桥br0:

service docker stop //或者systemctl stop docker
brctl addbr br0

2.为网桥添加IP

ip addr add 172.16.0.1/24 dev br0

3.启用网桥br0

ip link set dev br0 up

4.修改docker默认网桥

在文件/etc/docker/daemon.json中添加:

{"bridge":"br0"}

5.启动docker服务

service docker start

6.重新创建新的容器测试

新创建的容器可以正常使用了.删掉原来的容器重新创建,也都可以正常使用了。要是一开始就先测试下宿主机能不能正常连通docker容器就可以少做些无用功了,草率了!!

博主文章中还记载了调试iptables等方法,这里就不再赘述了!