解决虚拟机Debian 8/9 安装docker错误

发现问题

最近需要在虚拟机上跑一个程序, 基于docker的, 实习公司只提供了Debian 8/9 的虚拟机镜像, 所以需要安装docker。

安装的时候出现错误:

1
2
3
4
5
INFO[2019-06-30T14:16:01.754253188+08:00] Loading containers: start.
INFO[2019-06-30T14:16:01.797813479+08:00] stopping event stream following graceful shutdown error="<nil>" module=libcontainerd namespace=moby
Error starting daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables --wait -t nat -N DOCKER: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
(exit status 3)

发现可能与NAT、iptables有关, 直接从错误信息中, 可以看出原因是can't initialize iptables table 'nat'

但在网上找了很多, 发现也有很多人遇到这样的问题, 并没解决, 然后使用官网上的其他安装方法, 不论哪种安装方法都会有这种问题。

之后尝试运行 dockerd , 发现 docker-ce 实际上是已经安装好了的, 但是在启动的时候出现了同样的问题, 有什么东西禁止了docker启动。

解决问题

找到一位资深人士, 在他的帮助下, 找到了问题, 并解决(非常感谢)。

确定问题应该是iptables被虚拟机禁用了, 而Debian每次加载模块是根据/etc/modprob.d/目录下的配置文件。

我们可以看下nf-blacklist.conf文件

1
2
3
4
5
6
7
alias iptable_nat none

blacklist iptable_nat
blacklist nf_nat
blacklist nf_conntrack_ipv4
blacklist nf_defrag_ipv4
blacklist nf_conntrack

这下一下子就发现问题所在, iptable_nat被禁用了, 删掉跟iptable_nat有关的语句就好了。更方便一点的话, 其实可以直接将nf-blacklist.conf改个名字。

最后运行

1
docker run hello-world

确定docker安装成功!

继续学习

iptables

iptables是我们在实际生产环境中大量的使用的工具, 它能对进出主机的数据进行过滤以及转发等等。

iptables用于在Linux内核中设置、维护和检查IP包的过滤规则(rules)表。可以定义几个不同的规则表(table), 同时每个表包含许多内置链(chain), 也可能包含用户定义的链。

每个链则是一系列可以匹配一组数据包的规则, 就是说“如果数据包头符合这样的条件, 就这样处理这个数据包”。

简而言之, iptables是一个用于IPv4数据包过滤和NAT的管理工具。

参考:

iptables(8) - Linux man page

iptable nat

iptables利用nat表, 能够实现NAT功能, 将内网地址与外网地址进行转换, 完成内外网之间的通信。