使用docker conatiner中的systemctl启动服务

时间:2017-10-17 23:16:55

标签: docker containers

在我的Dockerfile中,我正在尝试安装多个服务,并希望在启动容器时自动启动它们。 其中一个服务是mysql,当我启动容器时,我没有看到mysql服务启动。当我尝试手动启动时,我收到错误: Failed to get D-Bus connection: Operation not permitted

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运行:

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

我查看了centos:systemd图片,但这也没有帮助。如何使用systemctl / service命令启动服务启动容器。

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

Docker的设计理念是每个容器的单个服务/流程。虽然它肯定支持在容器中运行多个进程,但绝不会阻止您这样做,但最终会遇到容器中的多个服务并不完全映射到Docker或外部工具所期望的区域。诸如转向服务扩展或跨主机使用Docker swarm之类的事情仅支持每个容器一个服务的概念。

Docker Compose允许您将多个容器组合成单个定义,这意味着您可以使用更多标准的预构建容器(httpdmariadb),而不是构建自己的容器。撰写定义可以非常轻松地映射到Docker Swarm服务。另请查看KubernetesMarathon / Mesos以管理容器组作为服务。

Docker中的进程管理

容器中run systemd可能会--privileged,但需要s6-overlay访问主机并安装/sys/fs/cgroup卷,因此可能不适合大多数用例。

s6项目使用actually need ssh access提供了更加友好的码头管理系统。

https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/system-icons/进入容器的情况相当罕见,但如果这是一项艰难的要求,那么您将无法构建自己的容器并使用流程管理器。

答案 2 :(得分:1)

您可以避免在docker容器中完全运行systemd守护程序。您甚至可以避免编写特殊的start.sh脚本 - 这是使用docker-systemctl-replacement脚本时的另一个好处。

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

目前的测试套件包括LAMP堆栈的测试用例,包括centos,所以它应该在你的设置中运行正常。

答案 3 :(得分:0)

我找到了这个项目:

https://github.com/defn/docker-systemd

可用于基于普通ubuntu图像创建图像,但具有系统和多用户模式。

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

没有systemd的安装程序将失败,并且要用流浪汉编写测试要困难得多。因此,在docker中有systemd的有效用例。