使用docker conatiner中的systemctl启动服务

Pre*_*and 10 containers docker

在我的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"]
Run Code Online (Sandbox Code Playgroud)

我的start.sh文件:

service mariadb start
Run Code Online (Sandbox Code Playgroud)

Docker构建:

docker build --tag="pbellamk/mariadb" .
Run Code Online (Sandbox Code Playgroud)

Docker运行:

docker run -it -d --privileged=true pbellamk/mariadb bash
Run Code Online (Sandbox Code Playgroud)

我检查了centos:systemd图像,这也没有用.如何使用systemctl/service命令启动的服务启动容器.

Dim*_*vak 11

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

  • 嗨 Dima,当您使用 /sbin/init 运行容器时,即 docker run -it -d --privileged=true pbellamk/mariadb /sbin/init,一旦我进入容器的外壳,我就可以运行 systemctl 命令. 但是,当容器启动时,我仍然无法自动启动 mariadb 服务。我必须登录到 shell 并手动启动。在我的运行命令中使用 /sbib/init 仍然会覆盖 Dockerfile 中的 CMD 对吗?那么如何在 Dockefile 中的 CMD 下运行 commnads 以在我启动容器时自动运行? (6认同)

Mat*_*att 6

Docker是围绕每个容器一个服务/进程的想法设计的。尽管它绝对支持在容器中运行多个进程,并且绝不会阻止您这样做,但是您最终会遇到容器中的多个服务无法完全映射到Docker或外部工具期望的区域。转向服务扩展或跨主机使用Docker群之类的事情仅支持每个容器提供一项服务的概念。

Docker Compose允许您将多个容器组合成一个定义,这意味着您可以使用更多的标准,预构建容器(httpdmariadb),而无需构建自己的容器。Compose定义相当容易地映射到Docker Swarm服务。另请参阅KubernetesMarathon / Mesos,以管理一组容器即服务。

Docker中的流程管理

可以在容器中运行systemd,但是它需要--privileged访问主机和已/sys/fs/cgroup安装的卷,因此对于大多数用例而言可能不是最合适的。

s6-overlay项目使用s6提供了对docker更友好的流程管理系统。

实际上确实需要对容器进行ssh访问,这种情况很少见,但是如果这很困难,那么您将被困在构建自己的容器和使用流程管理器中。


Gui*_*eim 6

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

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

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