在Docker托管插件中运行systemd

在Docker托管插件中运行systemd,docker,plugins,containerd,Docker,Plugins,Containerd,如何在一个数据库中运行systemd?通过一个普通的容器,我可以使用他们的示例Dockerfile运行Apache服务器 FROM centos/systemd RUN yum -y install httpd; yum clean all; systemctl enable httpd.service EXPOSE 80 CMD ["/usr/sbin/init"] 并按如下方式运行它 docker build --rm --no-cache -t httpd . docker run --

如何在一个数据库中运行
systemd
?通过一个普通的容器,我可以使用他们的示例Dockerfile运行Apache服务器

FROM centos/systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]
并按如下方式运行它

docker build --rm --no-cache -t httpd .
docker run --privileged --name httpd -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 -d  httpd
然而,当我尝试创建托管插件时,cgroup存在一些问题

我试着输入
config.json

    {
        "destination": "/sys/fs/cgroup",
        "source": "/sys/fs/cgroup",
        "type": "bind",
        "options": [
            "bind",
            "ro",
            "private"
        ]
    }

    {
        "destination": "/sys/fs/cgroup",
        "source": "/sys/fs/cgroup",
        "type": "bind",
        "options": [
            "bind",
            "ro",
            "rprivate"
        ]
    }

    {
        "destination": "/sys/fs/cgroup",
        "source": "/sys/fs/cgroup",
        "type": "bind",
        "options": [
            "rbind",
            "ro",
            "rprivate"
        ]
    }
我还尝试了以下操作,这会损坏主机的cgroup,可能需要重新启动才能恢复

    {
        "destination": "/sys/fs/cgroup/systemd",
        "source": "/sys/fs/cgroup/systemd",
        "type": "bind",
        "options": [
            "bind",
            "ro",
            "private"
        ]
    }

    {
        "destination": "/sys/fs/cgroup",
        "source": "/sys/fs/cgroup",
        "type": "bind",
        "options": [
            "bind",
            "ro",
            "private"
        ]
    }

这似乎与opencontainer和moby的交互方式有关

您可以在centos容器中运行httpd,而无需systemd-至少可以使用脚本进行测试。

这就是我在我的

要做的关键事情是在
systemd
启动之前保留
/run/docker/plugins
,并擦除
/run
文件夹。然后确保在新文件夹中创建套接字

mkdir -p /dockerplugins
if [ -e /run/docker/plugins ]
then
  mount --bind /run/docker/plugins /dockerplugins
fi
另一件事是Docker管理的插件在config中定义的挂载之后添加一个隐式的
/sys/fs/cgroup
,因此创建只读挂载将无法工作,除非它在启动systemd之前反弹

mount --rbind /hostcgroup /sys/fs/cgroup
在config.json中定义的挂载为

{
        "destination": "/hostcgroup",
        "source": "/sys/fs/cgroup",
        "type": "bind",
        "options": [
            "bind",
            "ro",
            "private"
        ]
}
创建套接字需要自定义,因为插件帮助程序写入
/run/docker/plugins

l, err := sockets.NewUnixSocket("/dockerplugins/osmounted.sock", 0)
if err != nil {
    log.Fatal(err)
}
h.Serve(l)
下面显示了我如何在插件上实现它的上述过程


我使用httpd作为systemd服务的示例。我正在写我自己的服务。我正在使用它与相当多的服务脚本-从已知的应用程序和正在开发的。除了我问的问题是一个Docker托管插件的上下文。不是一个典型的容器。那么,您可能必须解释“docker托管插件”的含义,因为您的示例仍然与容器中运行的可执行文件非常匹配