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

新手上路,请多包涵

在我的 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 --tag="pbellamk/mariadb" .

码头工人运行:

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

我检查了 centos:systemd 图像,但这也无济于事。如何使用 systemctl/service 命令启动服务启动容器。

原文由 Premchand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

原文由 Dima Spivak 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

Docker Compose 允许您将多个容器组合成一个定义,这意味着您可以使用更多标准的预构建容器( httpdmariadb ),而不是构建自己的容器。 Compose 定义很容易映射到 Docker Swarm 服务。还可以查看 KubernetesMarathon / Mesos 以将容器组作为服务进行管理。

Docker 中的进程管理

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

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

实际上需要对容器进行 ssh 访问 是相当罕见的,但如果这是一个硬性要求,那么您将被困在构建自己的容器和使用流程管理器中。

原文由 Matt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题