【问题标题】:Install Docker on OpenVZ VPS在 OpenVZ VPS 上安装 Docker
【发布时间】:2015-12-26 16:02:04
【问题描述】:

我有一个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 支持的情况下仍然可以工作。尝试安装并启用cgroups': sudo yum install libcgroup` 和sudo service cgconfig start。现在您应该可以访问cgroups 路径:sudo ls -l /cgroup。重启docker服务,看看是否正常。

标签: docker centos openvz


【解决方案1】:

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

OpenVZ 6 在较旧的提供程序中更为常见,并且基于通常与 Docker 不兼容的2.6 内核。然而,OpenVZ 内核不是普通的2.6 内核,但很少有从3.x 内核向后移植的功能。所以实际上内核042stab105.4 和更高版本支持 Docker 根据官方 OpenVZ wiki 需要的功能(请参阅@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。

【讨论】:

  • 显然 docker 1.10 是与这个 2.6.32 内核一起工作的最后一个版本。后续的 docker 版本会出现如下错误:运行 docker 不支持您的 Linux 内核版本 2.6.32-042stab123.2。请将您的内核升级到 3.10.0 或更高版本。
  • 感谢您的详细解答!这对我帮助很大。
【解决方案2】:

旧线程 - 但是,可以通过将 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() 函数。我想我可以在任何地方添加这个函数,但它是什么时候调用的,从哪里调用的?
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 2011-12-04
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多