我想要运行一个能够systemctl
在其主机上运行命令的 docker 容器。
下列的这问题我没有找到适合我的解决方案。
我对 docker 基础镜像没有硬性限制,因此对 ubuntu-16.04 主机使用 ubuntu-16.04 docker 镜像、对 ubuntu-18.04 主机使用 ubuntu-18.04 docker 镜像是完全可以接受的。
答案1
经过一番调查,我能够运行一个具有运行systemctl
命令能力的docker容器。
在 ubuntu:16.04 主机上运行时,以下内容有效:
-
sudo docker run --privileged -v /run/systemd/system:/run/systemd/system -v /bin/systemctl:/bin/systemctl -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -it ubuntu:16.04 systemctl
-
sudo docker run --privileged -v /run/systemd/system:/run/systemd/system -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -it ubuntu:16.04 systemctl
-
在 ubuntu:18.04 主机上:
sudo docker run --privileged -v /run/systemd/system:/run/systemd/system -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -it ubuntu:18.04 systemctl
由于
systemctl
没有附带此图片
答案2
感谢 ofirule
在 debian:10 上尝试了您的解决方案,您的解决方案有效地允许运行,systemctl
但它不允许它查看/控制主机的 systemd 进程。要使其正常工作,/sys/fs/cgroup
还必须将目录安装为卷:
docker run -it --rm -v /bin/systemctl:/bin/systemctl -v /run/systemd/system:/run/systemd/system -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -v /sys/fs/cgroup:/sys/fs/cgroup debian:10 systemctl --no-pager status
通过它我可以控制主机的 systemd 服务,甚至可以通过 systemd 进行关机/重启。
这似乎是 Debian 10 特有的,Ubuntu 18.04 不需要。其他 Debian/Ubuntu 版本可能需要也可能不需要它。
答案3
不允许评论。但这对我的 Ubuntu 18.04 设置有效:
sudo docker run --privileged \
-v /run/systemd/system:/run/systemd/system \
-v /lib/:/lib/ \
-v /usr/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/ \
-v /bin/systemctl:/bin/systemctl \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket \
-it ubuntu:18.04 /bin/sh -c "systemctl restart openvpn.service; systemctl status openvpn.service"
如果命令抱怨error while loading shared libraries: libip4tc.so.0:
->运行locate libip4tc.so.0
以找出该文件的位置并将该文件夹作为卷安装。