我有一个基于centos / systemd的docker容器。我用
运行容器 docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>
然后我可以通过以下方式访问容器:
docker exec -ti <containerID> /bin/bash
然后,我可以使用命令systemctl
列出所有已加载的单位。效果很好。
现在我想将映像部署到kubernetes集群中,这也可以正常工作,我可以通过kubectl exec -ti <pod> /bin/bash
访问集群中正在运行的Pod。
如果我现在键入命令systemctl
,我会收到错误消息
无法建立D-Bus连接:不允许操作
如何在吊舱中使用systemd / systemctl?
提示::由于容器内运行的软件,因此需要系统化,因此这里没有管理员选项
答案 0 :(得分:0)
令人遗憾的是,丹尼尔·沃尔什(Redhat)的旧建议仍在徘徊-包括暗示运行“特权容器”以通过与容器外部的守护进程进行基本对话来获得某些系统行为
将其丢弃。把它忘了吧。除非违反其基本设计,否则您无法在真正的集群中得到它。
在大多数情况下,靠近容器时对systemd的要求不是很严格。容器有很多服务管理器或init守护程序实现。例如,您可以尝试使用docker-systemctl-replacement脚本。
答案 1 :(得分:0)
启动systemd的命令必须在容器的脚本中。我使用/usr/sbin/init
或/usr/lib/systemd/systemd --systemd --unit=basic.target
。另外,您需要使用tmpfs启动systemd以便/ run来存储运行时信息。编写脚本并不容易,Tableau就是一个很好的例子。
此外,我建议不要不使用--privileged,因为这会带来安全风险,并且您可能会不小心更改或关闭容器中进行更改的主机。