用Cetnos7 apache和php构build一个Docker容器。

我将在这之前说,我对docker世界非常陌生,尽pipe阅读文档,但对于一些事情我还是有点困惑。

我想用centos7 apache和php构build一个容器。 我不想使用已经存在的图像,想要构build自定义容器。 我有以下文件夹结构

在这里输入图像说明

我的rw / docker / webserver / Dockerfile:

FROM centos:7 ENV container docker RUN (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" ] CMD ["/usr/sbin/init"] RUN yum -y install httpd RUN systemctl start httpd RUN systemctl enable httpd RUN yum update -y && yum install -y libpng-dev curl libcurl4-openssl-dev RUN docker-php-ext-install pdo pdo_mysql gd curl RUN a2enmod rewrite 

我的docker-compose.yml

  version: '2' services: webserver: build: ./docker/webserver ports: - "80:80" - "443:443" volumes: - /**PATH**/rw/services:/var/www/html links: - db db: image: mysql:5.7 ports: - "3306:3306" volumes: - ./db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=**** - MYSQL_DATABASE=**** 

当docker试图启动httpd时,错误ERROR: Service 'webserver' failed to build: The command '/bin/sh -c systemctl start httpd' returned a non-zero code: 1

Q1。 为什么安装失败?
Q2。 是这样做的正确方法? 如果我的docker文件为centos和apache + php是分开的。 如果是的话,这是如何工作?

Q1。 我认为systemctl可能不提供与CentOS泊坞窗图像。

事实上,docker服务并不意味着作为守护进程来运行,而是在前台。 看看Apache的原始http-foreground shell脚本 ,以更好地理解这个概念。

Q2。 这不是正确的方式恕我直言。

运行Apache是入口点或命令脚本的工作。

所以不是RUN your-command-to-run-apache ,而是CMD your-command-to-run-apache

再一次, Apache官方存储库可以给你一些线索。

在我看来,这些types的Dockerfiles看起来太老了,因为他们试图在容器中映射外部docker守护进程。 这是一个解决方法,因为systemd守护进程不能在容器中单独运行。

相反,我正在使用docker-systemctl-replacement脚本。 docker systemctl.py可以parsing正常的* .service文件来知道如何启动和停止服务。 您可以将其注册为映像的CMD,在这种情况下,它将查找所有启用systemctl的服务 – 这些服务将以正确的顺序启动和停止。

甚至还有一些LAMP堆栈的testing用例,所以它应该在你的情况下非常顺利地工作。 systemctl.py脚本与systemd systemctl兼容,只要简单地覆盖映像中的/ usr / bin / systemctl即可,所有非docker安装说明都适用于docker build。