Docker:“服务”命令有效,但“ systemctl”命令无效

时间:2018-07-01 03:04:02

标签: docker

我拉了 centos6 图片并从中制作了一个容器。我受到了打击:

 $ docker run -i -t centos:centos6 /bin/bash

在centos6容器上,我可以毫无问题地使用“ service”命令。但是当我拉出并使用 centos7 图片时:

 $ docker run -i -t centos:centos7 /bin/bash

“服务”和“ systemctl”均不起作用。错误消息是:

 Failed to get D-Bus connection: Operation not permitted

我的问题是:
1.没有“ service”和“ systemctl”命令的人如何发展?
2.如果要在centos7容器上使用例如httpd.service,该怎么办?还是不建议在容器上运行服务?

3 个答案:

答案 0 :(得分:1)

在两个容器中都没有运行过程管理器。 CentOS 6容器中的service命令的工作原理是,它仅运行来自/etc/init.d的脚本,该脚本最终被设计为在后台启动命令并将控制权返回给您。

CentOS 7使用systemd,并且systemd不在容器内运行,因此systemctl可以与之通信。

在任何一种情况下,使用servicesystemctl命令通常是错误的事情:您想要运行一个应用程序,并且想要在前台运行它,这样您的容器继续运行(从Docker的角度来看,已经退出了进入后台的命令,并且如果该容器中的pid为pid 1,则该容器将退出)。

  

没有“ service”和“ systemctl”命令的人如何发展?

通过查阅必要的文档以找出适当的命令行,他们可以直接启动程序。

  

例如,如果我想在centos7容器上使用httpd.service,该怎么办?还是建议在容器上运行服务?

您将使用类似以下内容的方法来启动httpd二进制文件:

CMD ["httpd", "-DFOREGROUND"]

答案 1 :(得分:1)

如果您想坚持使用service / sytemctl命令来启动/停止服务,则可以使用docker-systemctl-replacement脚本在centos7容器中完成。

我有一些部署脚本在实际计算机上使用服务启动/停止命令-并且它们可以在容器上正常工作。无需任何进一步修改。将systemctl.py脚本放入CMD时,它将简单地启动所有启用的服务,就像在真实计算机上的init-process。

答案 2 :(得分:-1)

systemd已包括在内,但默认情况下未在CentOS 7 docker映像中启用。在存储库页面上会提到它,以及启用它的步骤。
https://hub.docker.com/_/centos/