构建基于 Amazon Linux 2/2023系统的Apache2+PHP 7.4/8 环境的容器Dockerfile文件

2024-07 更新了Amazon Linux 2023操作系统Apache+PHP8的模版

一、背景

1、启动脚本问题

构建容器用于AWS ECS服务和AWS EKS服务的时候,由于容器服务的启动endpoint只能是唯一的启动进程,而且必须处于前台,因此会面临无法同时启动php-fpm和httpd的问题。为了解决这个问题,可增加一个启动服务脚本,然后让容器调用这个单一脚本。

启动脚本src目录下的run_apache.sh内容如下:

mkdir -p /var/run/apache2
mkdir -p /var/lock/apache2
/usr/sbin/php-fpm -D
/usr/sbin/httpd -D FOREGROUND

2、镜像安装包过多体积过大问题

此外,在构建容器中,还经常遇到体积过大,影响服务发布速度等问题。可通过优化分成解决。以上配置中,将安装软件的所有命令写在同一行,可实现一个文件层,由此可显著减少容器的体积。此外,在安装软件时候,执行 yum update -y 可将补丁升级到最新,减少安全风险。

如下配置文件可参考构建容器镜像用于AWS ECS服务和AWS EKS服务。中国区和海外区测试通过。

二、在Amazon Linux 2上构建PHP 7.4容器镜像构建

兼容CentOS7的Amazon Linux 2系统,因为CentOS 7自带的PHP是5.x版本过于低,因此采用Amazon Linux 2提供的amazon-linux-extra软件包内的7.x版本来构建环境。

下文构建Apache + PHP7.4环境的配置,以下为Dockerfile主文件内容:

FROM public.ecr.aws/amazonlinux/amazonlinux:2

# Install apache/php
RUN yum install -y which curl httpd mysql htop net-tools gd procps-ng iputils bind-utils vim nc awscli \
	&& amazon-linux-extras install -y php7.4 \
	&& yum install -y php-gd php-pecl-imagick php-mbstring php-xml php-xmlrpc && yum update -y \
	&& yum clean all

# Install configuration file
ADD src/httpd.conf /etc/httpd/conf/
ADD src/run_apache.sh /root/

# Configure apache
RUN chown -R apache:apache /var/www && chmod +x /root/run_apache.sh
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

# starting script for php-fpm and httpd
CMD ["/bin/bash", "-c", "/root/run_apache.sh"]

由此即可发起构建。

三、在Amazon Linux 2023上构建PHP 8.1容器镜像构建

兼容CentOS9的Amazon Linux 2023系统,其默认的PHP版本已经来到了8.x,因此就不需要在额外找高版本的PHP8软件包了。

如下构建Apache + PHP8.1环境的配置,以下为Dockerfile主文件内容:

FROM public.ecr.aws/amazonlinux/amazonlinux:2023

# Install dependencies
RUN yum install -y \
    httpd \
    php \
 && ln -s /usr/sbin/httpd /usr/sbin/apache2

# Install app
ADD src/run_apache.sh /root/
RUN echo "<?php phpinfo(); ?>" > /var/www/html/index.php \
 && mkdir /run/php-fpm/ \
 && chown -R apache:apache /var/www \
 && chmod +x /root/run_apache.sh

# Configure apache
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

# starting script for php-fpm and httpd
CMD ["/bin/bash", "-c", "/root/run_apache.sh"]

由此即可发起构建。

四、发起镜像构建

由此可按照这篇文章构建容器镜像,然后上传到AWS ECR,即可用于ECS和EKS容器服务。