在docker容器内使用systemctl启动服务

在docker容器内使用systemctl启动服务,docker,containers,Docker,Containers,在Dockerfile中,我试图安装多个服务,并希望在启动容器时自动启动它们。 其中一个服务是mysql,当我启动容器时,我没有看到mysql服务启动。当我尝试手动启动时,会出现以下错误: 无法获得D总线连接:不允许操作 Dockerfile: FROM centos:7 RUN yum -y install mariadb mariadb-server COPY start.sh start.sh CMD ["/bin/bash", "start.sh"] 我的start.sh文件:

在Dockerfile中,我试图安装多个服务,并希望在启动容器时自动启动它们。 其中一个服务是mysql,当我启动容器时,我没有看到mysql服务启动。当我尝试手动启动时,会出现以下错误:
无法获得D总线连接:不允许操作

Dockerfile:

FROM centos:7

RUN yum -y install mariadb mariadb-server

COPY start.sh start.sh

CMD ["/bin/bash", "start.sh"]
我的start.sh文件:

service mariadb start
Docker build:

docker build --tag="pbellamk/mariadb" .
Docker run:

docker run -it -d --privileged=true pbellamk/mariadb bash

我已经检查了
centos:systemd
图像,这也没用。如何在使用systemctl/service命令启动服务的情况下启动容器。

当您使用
bash
作为命令运行
docker时,init系统(例如SystemD)不会启动(启动脚本也不会启动,因为您传递的命令会覆盖Dockerfile中的
CMD
)。尝试更改用于
/sbin/init
的命令,使用
-d
在守护程序模式下启动容器,然后使用
docker exec-it sh
在shell中四处查看

Docker的设计理念是每个容器都有一个单一的服务/进程。尽管它肯定支持在一个容器中运行多个进程,并且不会阻止您这样做,但您最终会遇到这样的情况:容器中的多个服务与Docker或外部工具所期望的并不完全一致。移动到服务的扩展,或者跨主机使用Docker swarm等都只支持每个容器一个服务的概念

允许您将多个容器组合到单个定义中,这意味着您可以使用更多的标准预构建容器(,),而不是构建自己的容器。组合定义相当容易映射到服务。另请查看和/或了解如何将容器组作为服务进行管理

Docker中的流程管理 可以在容器中安装,但它需要访问主机和装载的
/sys/fs/cgroup
卷,因此可能不适合大多数用例

该项目提供了一个更为docker友好的流程管理系统


很少有人会将您放入容器中,但如果这是一个困难的要求,那么您将无法构建自己的容器并使用流程管理器。

您可以完全避免在docker容器中运行systemd daemon。您甚至可以避免编写特殊的start.sh脚本—这是使用该脚本的另一个好处

docker systemctl.py可以解析正常的*.service文件,以了解如何启动和停止服务。您可以将其注册为映像的CMD,在这种情况下,它将查找所有启用systemctl的服务—这些服务将以正确的顺序启动和停止

当前的测试套件包括包括centos在内的LAMP堆栈的测试用例,因此它在您的设置中应该可以正常运行。

我发现这个项目:

它可以用来创建一个基于股票ubuntu图像的图像,但是使用systemd和多用户模式

我的用例是自述文件中提到的第一个用例。我使用它来测试作为systemd服务安装的应用程序的安装程序脚本。安装程序创建一个systemd服务,然后启用并启动它。我需要对安装程序进行CI测试。测试应该创建安装程序,在ubuntu上安装应用程序,并从外部连接到服务


如果没有systemd,安装程序将失败,使用vagrant编写测试将困难得多。因此,docker中存在systemd的有效用例。

您需要使用systemd的具体原因是什么?使用一个较小的docker init系统或将每个容器分成一个服务可能会更容易。如果不使用systemd,如何启动服务?我的集装箱几乎需要5-6个服务,需要升级。例如,其中一个是mariadb。因此,我不能为每个服务都有单独的容器。如何在上面的Dockerfile中创建一个较小的docker init?您能否举例说明如何在启动时启动包含3个服务(mariadb、httpd、sshd)的容器?您是否有幸在容器中运行systemd?:)很高兴能提供帮助。如果您不介意的话,请向上投票或将其标记为已回答,以便让其他有相同问题的人在将来更容易找到解决方案。嗨,Dima,当您使用/sbin/init运行容器时,即docker run-it-d--privileged=true pbellamk/mariadb/sbin/init,一旦进入容器的外壳,我就能够运行systemctl命令。但是,当容器启动时,我仍然无法自动启动mariadb服务。我必须登录到shell并手动启动。在run命令中使用/sbib/init仍然会覆盖Dockerfile中的CMD,对吗?那么,当我启动容器时,如何在dockfile中的CMD下运行commnads以自动运行呢?