方法一:
参考:https://blog.youkuaiyun.com/qq_14853889/article/details/79678406
通过分析异常信息,发现是因为在进行原地址到目标地址转换的时候没有在docker主机的iptables规则中找到nat表规则,只有filter表规则。
在filter表上面增加nat表配置规则信息,需要说明的是docker容器的网段是172.17.0.0/16,另外需要注意filter表中也要有docker链的相关配置。
到这时候我们才开始准备解决题目的问题:
打开IPtables 文件 加入如下配置: 注意:并不是覆盖而是加入;在原有的*nat 和*fileter下面 加入这边的一些配置规则;分别在原有的规则最后加就可以;可以把我下面列出来的规则直接复制过去
; 关于这个配置 ;也可参见微博:docker 启动报错
*nat
:PREROUTING ACCEPT [27:11935]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [598:57368]
:POSTROUTING ACCEPT [591:57092]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
# Generated by iptables-save v1.4.21 on Sun Sep 20 17:35:31 2015
*filter
:INPUT ACCEPT [139291:461018923]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [127386:5251162]
:DOCKER - [0:0]
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
完成后重启一下 iptables ; docker 再run 镜像的时候 便不会报错
方法二:
[root@git local]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1
9c9af45a7a7cb2d8e5f34b9dc653c38127e7baba4aed8580985a156946d896b4
Error response from daemon: Cannot start container 9c9af45a7a7cb2d8e5f34b9dc653c38127e7baba4aed8580985a156946d896b4:
iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 800 -j DNAT --to-destination 172.17.0.6:5000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)
解决办法:重建docker0网络恢复
依次执行下面的命令:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0 (网桥操作)
docker -d
service docker restart