最近在一个新的服务器上装服务,没有安装iptables
,后来安装了iptables
之后,忽然发现我的docker
不能运行了。
运行时报出了以下错误:
启动docker服务报错
Error response from daemon: No such container: yn-userservice-30000
26126ca87430b74c3987817492cc890e72c36e2fec10d807e362a12f22365160
/usr/bin/docker-current: Error response from daemon: driver failed programming external
connectivity on endpoint yn-userservice-30000 (5d083ef51f932ac24936713ab3bc1cece9d47feabf4a916cf5da12a4fb2a122a):
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 30000 -j DNAT --to-
destination 172.17.0.2:30000 ! -i docker0: iptables: No chain/target/match by that name.
分享一下
大风车儿大神的回答:
容器和物理机的通信是通过内核转发实现的,具体体现为iptables里添加的nat规则。之前没有安装iptables直接搭docker也会在iptables生成关于docker的nat规则,因为系统自带了iptables,只不过没有以服务的方式启动。 重新安装iptables会覆盖掉之前的规则,导致docker运行报错。只需要重启一下docker就会重新生成iptables规则了。
解决办法:
1、停止docker服务
输入如下命令停止docker服务
systemctl stop docker 或者service docker stop
停止成功的话,再输入docker ps 就会提示出下边的话:
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
2、保存 iptables
输入如下命令:
iptables-save > /etc/sysconfig/iptables
3、启动docker服务
保存了iptables后,可以重新启动docker了。输入如下命令:
systemctl start docker 或者service docker start
4、将docker设置为开机启动
设置过这个就不需要再设置了
systemctl enable docker
5、启动容器
最后启动容器,发现不再报错了。
docker start 容器名字