CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

安装Ovirt后导致无法连接Docker容器问题

说明

因为备份GitLab代码仓库,安装了oVirt4.3,之后发现原来的Docker服务无法访问了。简单测试Docker服务本身是可用的。在张同学的协助下,初步断定是oVirt安装了路由发生了变化引起的。

诊断

Docker内部是通过iptables进行转发的,查看iptable情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@goldsyear ~]# iptables -t nat -nvL --line-number
Chain PREROUTING (policy ACCEPT 357 packets, 75406 bytes)
num pkts bytes target prot opt in out source destination
1 58 3506 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 37 packets, 3113 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 339 packets, 21026 bytes)
num pkts bytes target prot opt in out source destination
1 35 2100 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 339 packets, 21026 bytes)
num pkts bytes target prot opt in out source destination
1 16 973 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
2 0 0 MASQUERADE all -- * !br-e78d6dd2902d 192.168.49.0/24 0.0.0.0/0
3 0 0 MASQUERADE tcp -- * * 172.17.0.4 172.17.0.4 tcp dpt:3306
4 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:3306
5 0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:6379
6 0 0 MASQUERADE tcp -- * * 172.17.0.4 172.17.0.4 tcp dpt:3000
7 0 0 MASQUERADE tcp -- * * 172.17.0.4 172.17.0.4 tcp dpt:22
8 0 0 MASQUERADE tcp -- * * 172.17.0.5 172.17.0.5 tcp dpt:8096

Chain DOCKER (2 references)
num pkts bytes target prot opt in out source destination
1 31 1860 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 0 0 RETURN all -- br-e78d6dd2902d * 0.0.0.0/0 0.0.0.0/0
3 26 1568 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3307 to:172.17.0.2:3306
4 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3308 to:172.17.0.3:6379
5 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:13000 to:172.17.0.4:3000
6 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10022 to:172.17.0.4:22
7 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32400 to:172.17.0.5:8096

初步判断是的了一条`192.168.49.0的路由

1
0     0 MASQUERADE  all  --  *      !br-e78d6dd2902d  192.168.49.0/24      0.0.0.0/0 

然后尝试删除对应的路由,但发现只有删除PREROUTING的路由,Docker才能正常访问

1
iptables -t nat -D PREROUTING 1

统一处理

  • 检查ip转发
    1
    sysctl net.ipv4.ip_forward
    如果为1,不需要修改
  • 清理路由
    1
    iptables -t nat -F
  • 增加对应网关路由
    1
    iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    如果还有其他网卡,也可一起增加
    1
    iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -o br-80d019e60f1b -j MASQUERADE

遗留问题

  • 如果重启Docker服务还是会增加该路由,需要重新手动删除。自己对网络不是太熟悉,Docker官网提供了份Docker and iptables 的说明文档,后续继续研究。

  • 可能关联的问题,虽然重新配置了镜像加速,但拉取ElasticSearch的镜像很慢。

欢迎关注我的其它发布渠道