我拉了 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,该怎么办?还是不建议在容器上运行服务?
答案 0 :(得分:1)
在两个容器中都没有运行过程管理器。 CentOS 6容器中的service
命令的工作原理是,它仅运行来自/etc/init.d
的脚本,该脚本最终被设计为在后台启动命令并将控制权返回给您。
CentOS 7使用systemd,并且systemd不在容器内运行,因此systemctl
可以与之通信。
在任何一种情况下,使用service
或systemctl
命令通常是错误的事情:您想要运行一个应用程序,并且想要在前台运行它,这样您的容器继续运行(从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/