如何在 docker 容器内运行 systemctl 命令?

如何在 docker 容器内运行 systemctl 命令?

我想要运行一个能够systemctl在其主机上运行命令的 docker 容器。

下列的问题我没有找到适合我的解决方案。

我对 docker 基础镜像没有硬性限制,因此对 ubuntu-16.04 主机使用 ubuntu-16.04 docker 镜像、对 ubuntu-18.04 主机使用 ubuntu-18.04 docker 镜像是完全可以接受的。

答案1

经过一番调查,我能够运行一个具有运行systemctl命令能力的docker容器。

  1. 在 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
      
  2. 在 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以找出该文件的位置并将该文件夹作为卷安装。

相关内容