在OpenVZ VPS上安装Docker

14

我有一个OpenVZ VPS,操作系统是CentOS 6,我尝试安装Docker,但是Docker启动错误。

Starting cgconfig service: Error: cannot mount cpuset to /cgroup/cpuset: Invalid argument
/sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup mounting failed
Failed to parse /etc/cgconfig.conf or /etc/cgconfig.d      [FAILED]
Starting docker:                                           [  OK  ]

看起来 cgroups 模块没有加载。可能没有安装?!不过 docker 仍然可以在没有 cgroups 支持的情况下工作。尝试安装并启用 cgroupssudo yum install libcgroupsudo service cgconfig start。现在您应该能够访问 cgroups 路径:sudo ls -l /cgroup。重新启动 docker 服务,看看是否正常工作。 - Boynux
2个回答

30

更新于2016年12月。我尝试避免重复@Alien Life Form的回答,但增加了更多细节。

简短回答:

大多数情况下,OpenVZ托管将使用不兼容Docker的过时内核的OpenVZ 6。

Docker仅支持基于3.x内核的OpenVZ 7(请参见https://openvz.org/Docker_inside_CT_vz7)或具有版本号为042stab105.4或更高的内核的OpenVZ 6(请参见https://openvz.org/Docker_inside_CT)。

详细回答:

Docker需要Linux内核的两个功能才能运行:控制组和命名空间。因此您需要具备这些功能的内核。

使用OpenVZ时,您无法控制自己的内核,只有托管公司可以。大多数托管公司将不会合作并更新内核,因此如果内核不兼容,则通常没有办法。

OpenVZ 7基于支持Docker的3.10内核,但我还没有看到过OpenVZ 7托管 - KVM似乎是新低成本提供商进入市场的最受欢迎的虚拟化。

OpenVZ 6在较旧的提供商中更为常见,并且基于通常与Docker不兼容的2.6内核。但是,OpenVZ内核不是正常的2.6内核,而是从3.x内核中倒退了一些功能。因此,根据官方OpenVZ wiki(请参见@Alien Life Form答案),实际上内核042stab105.4及更高版本支持Docker需要的功能。

以下文本仅适用于OpenVZ版本6。

如果uname -a显示内核版本为 042stab105.4 或更新版本,则可以对 Docker 进行一些调整以挂载所需的特殊文件系统。
如果内核版本较早,且公司愿意合作,他们不能安装主线内核,因为它与 OpenVZ 不兼容。他们必须从 https://openvz.org/Download/kernel 下载带有 OpenVZ 补丁的专用内核。最好下载最新的稳定版本(目前是 042stab120.11),但至少要下载 042stab105.4 版本。相比之下,我见过的所有 OpenVZ 主机都使用类似于 2.6.32-042stab075.2 的内核版本,这不仅与 Docker 不兼容,而且还存在漏洞。因此,你可以尝试使用漏洞论点来迫使支持方升级 :)
另一个显而易见但并非总是适用的解决方案是放弃 OpenVZ,转向使用其他虚拟化技术,例如 Xen 或 KVM。然而,可能情况是 CentOS 6 主线内核没有必要的功能,因此 CentOS 6 只有在运行非原始补丁内核时才与 Docker 兼容。因此,你可以考虑转向 CentOS 7。

1
显然,docker 1.10是最后一个与这个2.6.32内核兼容的版本。 随后的docker版本会出现如下错误: 您的Linux内核版本2.6.32-042stab123.2不支持运行docker。请将您的内核升级到3.10.0或更高版本。 - Mike Schroll
非常感谢您提供详细的答案!它对我帮助很大。 - Dmitriy

1

旧的线程-然而,这个解决方案可以在这个链接中找到,将CentOS6视为debian wheezy:https://openvz.org/Docker_inside_CT

基本上,在/etc/init.d/docker中执行以下操作:

prestart() {
# ALF   service cgconfig status > /dev/null
# ALF
# ALF    if [[ $? != 0 ]]; then
# ALF        service cgconfig start
# ALF    fi
mount -t tmpfs tmpfs /sys/fs/cgroup
mkdir /sys/fs/cgroup/freezer,devices
mount -t cgroup cgroup /sys/fs/cgroup/freezer,devices -o freezer,devices
mkdir /sys/fs/cgroup/cpu,cpuacct,cpuset
mount -t cgroup cgroup /sys/fs/cgroup/cpu,cpuacct,cpuset/ -o cpu,cpuacct,cpuset

}

我的 /etc/init.d/docker 没有 prestart() 函数。我猜我可以在任何地方添加这个函数,但它是什么时候被调用的,以及从哪里调用的呢? - srayner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接