在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)
下面显示了我如何在插件上实现它的上述过程