1

我开始使用docker自动化环境,然后我试图构建一个简单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.

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

4

2 回答 2

2

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

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

  1. 你遇到了一个基于 Docker 容器的已知问题systemd它们似乎需要额外的权限才能运行,即使这样,也需要大量额外的配置才能让它们工作。Red Hat 团队正在尝试一些修复(在评论中提到),但不确定在哪里。

    如果你想尝试让它工作,这些是我找到的最好的说明,但在过去的几周里我已经玩了几次,但还没有让它工作。

  2. 人们可能会说这里的“真正问题”是 Docker 容器不应该被认为是“迷你虚拟机”。Docker旨在为每个容器运行一个“根”进程,并且容器系统使得将多个容器组合在一起变得很容易——它们在磁盘上很小,内存使用量很小,并且易于连接在一起。

    这是Docker 的一篇博客文章,其中提供了一些关于此的背景信息。还有关于Dockerizing applicationsWorking with containers的“Docker Fundamentals”文档。

    因此,可以说继续您尝试在此处创建的设置的最佳方法(尽管一开始听起来可能更复杂)是将您的“堆栈”分解为您需要的服务,然后使用类似的工具docker-compose介绍,文档) 以根据需要创建单一用途的 Docker 容器。

    在上述情况下,您有两个服务,一个 Web 服务器和一个数据库服务器。因此,两个 Docker 容器应该可以正常工作,通过数据库网络连接在一起。这里有些例子:

    如果您为每个 Docker 容器运行一个服务,则不需要使用它systemd来管理它们,因为 Docker 守护进程管理每个容器,就像它是一个 Unix 进程一样。当进程死亡时,Docker 容器也会死亡,这很重要,因为 Docker 服务器会监控容器并可以自动重新启动它们,或者通知您。

于 2015-09-18T02:44:53.273 回答
0

这看起来更像是我的 docker-systemctl-replacement适合的完美示例。它可以很容易地解释“systemctl start httpd.service”,而无需激活 SystemD。我对一些数据库服务做了同样的事情,但不是特别是 mariadb.service——你可以试试看。

于 2017-03-23T14:58:48.290 回答