我开始使用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.
所以,我不知道我做错了什么?
答案 0 :(得分:2)
首先,欢迎来到Docker! :-)大量的Docker教程和文档是围绕Ubuntu容器编写的,但我也喜欢Centos。
好的,这里有几件事要讨论:
你正在与a known issue基于systemd
的Docker容器竞争,他们似乎需要额外的权限才能运行,即使这样,也需要大量的额外配置才能让它们正常运行。红帽团队是experimenting with some fixes (mentioned in comments),但不知道该在哪里。
如果你想尝试让它运转起来,these are the best instructions I've found,但我在过去几周里曾多次使用过这种情况,但还没有让它发挥作用。
人们可能会说“真正的问题”是Docker容器不应该被认为是“迷你虚拟机”。 Docker是designed to run one "root" process per container,容器系统可以很容易地将多个容器组合在一起 - 它们在磁盘上很小,内存使用很少,并且易于联网。
这是一个blog post from Docker which gives some background on this。 Dockerizing applications和Working with containers上还有“Docker Fundamentals”文档。
所以可以说,继续尝试在这里创建的设置的最佳方式(尽管在开始时听起来可能更复杂)是将“堆栈”分解为所需的服务,然后使用工具例如docker-compose
(introduction,documentation)可根据需要创建单用途Docker容器。
在上面的例子中,您有两个服务,一个Web服务器和一个数据库服务器。因此,两个Docker容器应该可以很好地工作,通过数据库网络连接连接在一起。以下是一些例子:
如果您为每个Docker容器运行一个服务,则不需要使用systemd
来管理它们,因为Docker守护程序管理的每个容器类似于Unix进程。当进程终止时,Docker容器就会死掉,这很重要,因为Docker服务器监视容器并可以自动重启它们,或者通知你。
答案 1 :(得分:0)
这看起来更像是我的docker-systemctl-replacement适合的完美示例。它可以很容易地解释“systemctl start httpd.service”而没有活动的SystemD。我已经为一些数据库服务做了同样的事情,但没有特别针对mariadb.service - 可能你可以尝试一下。