0

您如何systemdDocker 托管插件中运行?使用普通容器,我可以运行centos/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

但是,当我尝试制作托管插件时,cgroups 存在一些问题

我试过把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 的交互方式有关https://github.com/moby/moby/issues/36861

4

2 回答 2

0

这就是我在https://github.com/trajano/docker-volume-plugins/tree/master/centos-mounted-volume-plugin上的做法

要做的关键是保留/run/docker/plugins之前systemd的开始并擦除/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)

下面显示了上面关于我如何在我的插件上实现它的过程

于 2018-04-22T15:33:32.050 回答
-1

您可以在没有 systemd 的 centos 容器中运行 httpd - 至少使用docker-systemctl-replacement脚本进行测试。

于 2018-04-18T20:46:51.097 回答