Docker:“;服务“;命令起作用,但是;systemctl";命令不';行不通

Docker:“;服务“;命令起作用,但是;systemctl";命令不';行不通,docker,Docker,我拉了一张centos6的图片,用它做了一个容器。我是通过以下方式获得成功的: $ docker run -i -t centos:centos6 /bin/bash 在centos6容器上,我可以毫无问题地使用“service”命令。但是当我拉并使用centos7图像时: $ docker run -i -t centos:centos7 /bin/bash “服务”和“系统控制”都不起作用。错误消息是: Failed to get D-Bus connection: Operati

我拉了一张centos6的图片,用它做了一个容器。我是通过以下方式获得成功的:

 $ docker run -i -t centos:centos6 /bin/bash
在centos6容器上,我可以毫无问题地使用“service”命令。但是当我拉并使用centos7图像时:

 $ docker run -i -t centos:centos7 /bin/bash
“服务”和“系统控制”都不起作用。错误消息是:

 Failed to get D-Bus connection: Operation not permitted
我的问题是:
1.没有“服务”和“系统CTL”命令,人们如何发展
2.例如,如果我想在centos7容器上使用httpd.service,我应该怎么做?或者不建议在容器上运行服务

两个容器中都没有运行的流程主管。CentOS 6容器中的
service
命令之所以有效,是因为它只运行
/etc/init.d
中的一个脚本,该脚本经过设计最终在后台启动一个命令并将控制权返回给您

CentOS 7使用systemd,并且systemd没有在您的容器中运行,因此没有任何东西可供
systemctl
交谈

在这两种情况下,使用
service
systemctl
命令通常是错误的:您希望运行单个应用程序,并且希望在前台运行它,以便容器继续运行(从Docker的角度来看,进入后台的命令已退出,如果该命令是容器中的pid 1,则容器将退出)

没有“服务”和“系统CTL”命令,人们如何发展

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

例如,如果我想在centos7容器上使用httpd.service,我应该怎么做?或者建议在容器上运行服务

您可以使用如下方式启动
httpd
二进制文件:

CMD ["httpd", "-DFOREGROUND"]

systemd包含在CentOS 7 docker映像中,但默认情况下未启用。存储库页面上会提到它以及启用它的步骤。

如果您想坚持使用service/sytemctl命令来启动/停止服务,那么您可以在centos7容器中使用脚本来执行此操作


我有一些部署脚本在实际机器上使用了服务启动/停止命令,它们与容器配合良好。没有任何进一步的修改。当将systemctl.py脚本放入CMD时,它将简单地启动所有启用的服务,有点像实际机器上的init进程。

我们之间的区别是什么en CMD[“httpd”、“-DFOREGROUND”]和“systemctl启动httpd.service”?
systemctl
依赖于
systemd
运行,这意味着您的容器必须在特权模式下运行,并运行一个作为进程管理器的重量级守护程序,在容器内运行消息总线,提供一个系统级记录器,并管理多个内核级(在容器外共享)参数和…;最后,一旦你深入研究,systemd最终运行相同的
httpd
命令。@lechat
httpd-DFOREGROUND
直接运行一个程序,就像运行
ls
echo hello world
systemctl启动httpd一样。服务需要与运行
systemd
进程以使任何事情发生……但在几乎所有情况下,您都不希望在容器内启用systemd(或任何其他进程管理器)。是的,在容器内运行systemd实际上违背了容器的目的。但若有人倾向于运行它,则这是他们的选择。