Docker Lamp Centos7:'/ bin / sh -c systemctl start httpd.service'返回非零代码:1

时间:2015-08-23 03:17:54

标签: centos docker lamp devops

我开始使用docker来自动化envorinments,然后我正在尝试构建一个简单的LAMP,以便Dockerfile如下:

FROM centos:7

ENV container=docker

RUN yum -y swap -- remove systemd-container systemd-container-libs -- install systemd systemd-libs

RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

RUN yum -y update && yum clean all
RUN yum -y install firewalld httpd mariadb-server mariadb php php-mysql php-gd php-pear php-xml php-bcmath php-mbstring php-mcrypt php-php-gettext

#Enable services
RUN systemctl enable httpd.service
RUN systemctl enable mariadb.service

#start services
RUN systemctl start httpd.service
RUN systemctl start mariadb.service

#Open firewall ports
RUN firewall-cmd --permanent --add-service=http
RUN firewall-cmd --permanent --add-service=https
RUN firewall-cmd --reload


EXPOSE 80
CMD ["/usr/sbin/init"]

所以当我构建图像时

docker build -t myimage .

然后当我运行代码时出现以下错误:

The command '/bin/sh -c systemctl start httpd.service' returned a non-zero code: 1

当我进入交互模式(在RUN systemctl start httpd.service之后跳转命令并重建图像)时:

docker run -t -i myimage /bin/bash

尝试手动启动服务httpd后,我收到以下错误:

Failed to get D-Bus connection: No connection to service manager.

所以,我不知道我做错了什么?

2 个答案:

答案 0 :(得分:2)

首先,欢迎来到Docker! :-)大量的Docker教程和文档是围绕Ubuntu容器编写的,但我也喜欢Centos。

好的,这里有几件事要讨论:

  1. 你正在与a known issue基于systemd的Docker容器竞争,他们似乎需要额外的权限才能运行,即使这样,也需要大量的额外配置才能让它们正常运行。红帽团队是experimenting with some fixes (mentioned in comments),但不知道该在哪里。

    如果你想尝试让它运转起来,these are the best instructions I've found,但我在过去几周里曾多次使用过这种情况,但还没有让它发挥作用。

  2. 人们可能会说“真正的问题”是Docker容器不应该被认为是“迷你虚拟机”。 Docker是designed to run one "root" process per container,容器系统可以很容易地将多个容器组合在一起 - 它们在磁盘上很小,内存使用很少,并且易于联网。

    这是一个blog post from Docker which gives some background on thisDockerizing applicationsWorking with containers上还有“Docker Fundamentals”文档。

    所以可以说,继续尝试在这里创建的设置的最佳方式(尽管在开始时听起来可能更复杂)是将“堆栈”分解为所需的服务,然后使用工具例如docker-composeintroductiondocumentation)可根据需要创建单用途Docker容器。

    在上面的例子中,您有两个服务,一个Web服务器和一个数据库服务器。因此,两个Docker容器应该可以很好地工作,通过数据库网络连接连接在一起。以下是一些例子:

    如果您为每个Docker容器运行一个服务,则不需要使用systemd来管理它们,因为Docker守护程序管理的每个容器类似于Unix进程。当进程终止时,Docker容器就会死掉,这很重要,因为Docker服务器监视容器并可以自动重启它们,或者通知你。

答案 1 :(得分:0)

这看起来更像是我的docker-systemctl-replacement适合的完美示例。它可以很容易地解释“systemctl start httpd.service”而没有活动的SystemD。我已经为一些数据库服务做了同样的事情,但没有特别针对mariadb.service - 可能你可以尝试一下。