Docker运行RabbitMQ出现driver failed programming external connectivity on endpoint myrabbit xxx iptables

报错信息

Error response from daemon: driver failed programming external connectivity on endpoint myrabbit (a5a7959336f5852c323b167c272f59c0f014f7b17c68f391838a366e6f0427c1): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 15672 -j DNAT --to-destination 172.17.0.2:15672 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).

问题描述

当我们停止或删除上一个rabbitmq容器的时候,重新跑一下,突然出现了报错

docker run -d --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq

出现报错

[root ~]# docker run -d --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq
eb418c5116eb1814b99f583ba7ac7f3aa8b5d8f31ae7fbc399dc175f9029ab70
docker: Error response from daemon: driver failed programming external connectivity on endpoint myrabbit (a5a7959336f5852c323b167c272f59c0f014f7b17c68f391838a366e6f0427c1):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 15672 -j DNAT --to-destination 172.17.0.2:15672 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

这时候我用以下命令查看了

docker ps //查看运行中容器

里面居然什么都没有

这时候输入

docker ps -a //查看容器运行的历史记录

发现里面有历史记录,于是我用命令把历史记录都情况了

docker rm -f $(docker ps -aq) //删除所有容器历史记录

到这里我以为成功了,又执行了一把run命令

docker run -d --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq

发现还是报错,还是原来的错误!!!

在这里插入图片描述

我又试了把RabbitMQ的镜像给删除了重新装一遍,结果一运行run还是原来的报错。。。

问题解决

直接重启docker!

停止docker服务

systemctl stop docker.socket

重新运行docker服务

systemctl start docker

然后重新运行run命令

docker run -d --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq

这时候你会发现,居然运行成功了。。

在这里插入图片描述

参考了大佬的回答,意思就是容器和物理机的通信是通过内核转发实现的,具体体现为iptables里添加的nat规则。之前没有安装iptables直接搭docker也会在iptables生成关于docker的nat规则,因为系统自带了iptables,只不过没有以服务的方式启动。 重新安装iptables会覆盖掉之前的规则,导致docker运行报错。只需要重启一下docker就会重新生成iptables规则了。

你可能感兴趣的:(报错问题解决,Docker学习笔记,RabbitMQ学习笔记,rabbitmq,docker,分布式)