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  ]
4

2 回答 2

30

2016 年 12 月更新。我尽量不复制 @Alien Life Form 的答案,但添加更多细节。

简短的回答

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

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

长答案

Docker 需要 Linux 内核的两个特性才能运行:控制组和命名空间。所以你需要一个具有这些特性的内核。

使用 OpenVZ,您无法控制内核,只有托管公司可以。大多数托管公司不会协作和更新内核,因此如果内核变得不兼容,您通常会很倒霉。

OpenVZ 7 基于3.10开箱即用支持 Docker 的内核,但是我还没有看到 OpenVZ 7 托管 - KVM 似乎是最流行的虚拟化,新的低成本供应商进入市场。

OpenVZ 6 在较老的供应商中更为常见,并且基于2.6通常与 Docker 不兼容的内核。然而,OpenVZ 内核不是普通的2.6内核,但很少有从3.x内核向后移植的特性。所以事实上内核042stab105.4和更高版本根据官方 OpenVZ wiki 支持 Docker 所需的功能(请参阅@Alien Life Form 答案)。

以下文字仅适用于 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。

于 2016-03-11T23:04:52.783 回答
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

}
于 2016-10-12T07:38:55.990 回答