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

lb3vh1jj  于 2023-03-22  发布在  Docker
关注(0)|答案(4)|浏览(750)

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

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构建版本:

docker build --tag="pbellamk/mariadb" .

Docker运行:

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

我已经检查了centos:systemd镜像,但这也没有帮助。如何使用systemctl/service命令启动包含服务的容器?

bgibtngc

bgibtngc1#

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

bqjvbblv

bqjvbblv2#

Docker是围绕每个容器一个服务/进程的想法设计的。虽然它绝对支持在一个容器中运行多个进程,并且不会阻止你这样做,但你最终会遇到容器中的多个服务不能完全Map到Docker或外部工具所期望的地方。比如移动到服务的扩展,或者跨主机使用Docker swarm只支持每个容器一个服务的概念。
Docker Compose允许您将多个容器组合到一个定义中,这意味着您可以使用更多的标准,预构建的容器(httpdmariadb),而不是构建自己的容器。组合定义相当容易地Map到Docker Swarm服务。还可以查看KubernetesMarathon/Mesos,以将容器组作为服务进行管理。

Docker中的进程管理

在容器中可以使用run systemd,但它需要--privileged访问主机和/sys/fs/cgroup卷,因此可能不适合大多数用例。
s6-overlay项目使用s6提供了一个更加docker友好的进程管理系统。
actually need ssh access放入容器中是相当罕见的,但如果这是一个硬性要求,那么您将无法构建自己的容器并使用进程管理器。

uubf1zoe

uubf1zoe3#

你可以完全避免在docker容器中运行systemd守护进程。你甚至可以避免编写一个特殊的start.sh脚本-这是使用docker-systemctl-replacement脚本的另一个好处。
dockersystemctl.py可以解析普通的 *.service文件,以了解如何启动和停止服务。您可以将其注册为镜像的CMD,在这种情况下,它将查找所有启用systemctl的服务-这些服务将以正确的顺序启动和停止。
当前的测试套件包括LAMP堆栈的测试用例,包括centos,因此它应该在您的设置中运行良好。

8fq7wneg

8fq7wneg4#

我发现这个项目:
https://web.archive.org/web/20200909225615/https://github.com/defn/docker-systemd
这是https://github.com/solita/docker-systemd的一个分支,最近更新的分支之一是https://github.com/asg1612/docker-systemd
它可以用来创建一个基于Ubuntu镜像的镜像,但是使用systemd和多用户模式。
我的用例是其自述文件中提到的第一个用例。我使用它来测试作为systemd服务安装的应用程序的安装程序脚本。安装程序创建systemd服务,然后启用并启动它。我需要对安装程序进行CI测试。测试应该创建安装程序,在ubuntu上安装应用程序,并从外部连接到服务。
如果没有systemd,安装程序会失败,并且使用vagrant编写测试会更加困难。因此,docker中有systemd的有效用例。

相关问题