测试基础 安装 docker 后 Error response from daemon

高明 · 2023年05月24日 · 2535 次阅读

问题描述
安装 docker 之后,无法运行镜像

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

原因分析:
这个错误表示 Docker 在为容器 grafana 添加 iptables 规则时失败了。iptables 中没有 DOCKER 这条链,导致 DNAT 规则添加失败。
这通常是因为 Docker 需要 iptables 的 nat 表和一定的 iptables 规则来实现容器间和主机间的网络互通。但是这些内容在安装 Docker 时并没有自动配置。
解决方法是我们需要手动为 iptables 配置必要的规则,让 Docker 可以正常操作 iptables。。

解决方案:
1、添加 docker nat 表规则
bash
sudo iptables -t nat -N DOCKER

这会添加一个 iptables nat 表中名为 DOCKER 的链。

  1. 允许本地回环流量

bash
sudo iptables -t nat -A DOCKER -d 127.0.0.0/8 -j RETURN

3、允许进入 Docker 网桥的流量 (默认为 docker0)
bash
sudo iptables -t nat -A DOCKER ! -i docker0 -p tcp -j REDIRECT --to-port 3000

4、允许从 Docker 网桥出去的流量
bash
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

eth0 为你的网卡接口,需要根据实际情况替换。

  1. 添加规则到 INPUT、FORWARD 和 OUTPUT 链

bash
sudo iptables -I INPUT -p icmp -j ACCEPT
sudo iptables -I FORWARD -p icmp -j ACCEPT
sudo iptables -I FORWARD -i docker0 -o docker0 -j ACCEPT

6、保存 iptables 规则
bash
sudo sh -c "iptables-save > /etc/iptables.rules"

重启 Docker 服务
bash
sudo systemctl restart docker

完成上述步骤后,Docker 就可以正常操作 iptables 了。现在再启动容器,就不会出现类似的错误。
这是 Docker 在 Linux 系统上网络实现的基础,我们需要确保 docker0 网桥和 iptables 规则都设置正确。如果在安装和使用 Docker 过程中出现网络相关问题,很有可能就是 iptables 规则没有正确配置。
所以,理解 Docker 的网络原理和 iptables 规则的作用,可以更好地运维和排障 Docker。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册