【问题标题】:Running systemd in a Docker managed plugin在 Docker 托管插件中运行 systemd
【发布时间】:2018-09-27 09:26:07
【问题描述】:

如何在Docker managed plugin 中运行systemd?使用普通容器,我可以运行 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

【问题讨论】:

    标签: docker plugins containerd


    【解决方案1】:

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

    【讨论】:

    • 我使用 httpd 作为 systemd 服务的示例。我正在编写自己的服务。
    • 我将它与相当多的服务脚本一起使用 - 来自已知应用程序和正在开发的应用程序。
    • 除了我问的问题是关于 Docker 托管插件的上下文。不是典型的容器。
    • 好吧,那么您可能需要解释一下“docker 托管插件”的含义,因为您的示例仍然非常适合在容器中运行的可执行文件。 ;)
    【解决方案2】:

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

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

    mkdir -p /dockerplugins
    if [ -e /run/docker/plugins ]
    then
      mount --bind /run/docker/plugins /dockerplugins
    fi
    

    另一件事是 Docker 管理的插件添加了一个隐式的 /sys/fs/cgroup AFTER 在配置中定义的挂载,因此创建只读挂载将不起作用,除非它在启动 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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2019-01-29
      • 2019-01-01
      • 1970-01-01
      相关资源
      最近更新 更多