Running PHP FPM in Docker

Use cases

In Red Hat Enterprise Linux we support a variety of different versions of PHP. Sometimes users find they need to run a legacy application, requiring an older version of PHP, on a newer version of RHEL. Developers may want to develop an application on their Fedora Workstation and deploy it on a RHEL server or ensure it will be compatible with all available PHP versions in enterprise distributions.PHP logo

This example can be easily adapted for all PHP versions available as RPM packages in distribution repository (5.3.3 in RHEL-6, 5.4.16 in RHEL-7, 5.4.16 and 5.5.6 in RHSCL-1.2).

Here is the sample Dockerfile I use to run PHP 5.3 FPM in an CentOS-6 container:

FROM centos:6
RUN yum -y update && yum clean all
RUN yum -y install php-fpm php-mbstring php-mysql php-gd && yum clean all
RUN sed -e 's/127.0.0.1:9000/9000/' 
        -e '/allowed_clients/d' 
        -e '/catch_workers_output/s/^;//' 
        -e '/error_log/d' 
        -i /etc/php-fpm.d/www.conf
RUN mkdir -p /var/www/html
EXPOSE 9003
ENTRYPOINT /usr/sbin/php-fpm --nodaemonize

Description of this container content.

Base image

This example use FROM centos:6, but Red Hat Enterprise Linux 7 users can change with FROM rhel6 and use official RHEL docker image.

Installation

The “yum install” command  is used to install php-fpm (the FastCGI Process Manager) and some extensions from the official distribution repository. This should be adapted to suite the needs of the target application.

Application directory

The container must have access to the application directory on the host computer to execute them. This example use the /var/www/html directory, and should probably be adapted.

Changes applied to the pool configuration

FPM provides a default pool (www), its configuration must be slightly updated to be usable in a container:

  • listen = 9000 to listen on all interfaces (use the IPv4 catch-all address instead of the local loopback)
  • remove listen.allowed_clients to allow connection from outside the container
  • remove error_log to use global error recording (through the SAPI error logger) instead of a pool specific file, which won’t be easily readable from outside the container.
  • enable catch_workers_ouput to catch the pool error in the main server

Creation of the container

From the directory where the Dockerfile is stored, fpm53 is the chosen name of this image:

docker build -t fpm53 .

Running the container

We need to map:

  • the scripts directory /var/www/html as the path sent by the fastcgi client (Apache HTTP Server or Nginx) should match the one served by the fastcgi server.
  • the listening port (9000 in the container) to a free host port (9003 in this example, as 9000 is probably used by another FPM instance)

Example:

# docker run -v /var/www/html:/var/www/html -p 127.0.0.1:9003:9000 fpm53
[11-Dec-2014 15:20:47] NOTICE: fpm is running, pid 1
[11-Dec-2014 15:20:47] NOTICE: ready to handle connections

Conclusion

Even if I’m a fervent supporter of Software Collections, when missing, we have a very simple way to get an operational PHP version 5.3.3 on a recent distribution (tested on Fedora 20) with the benefit of using maintained packages from official repository.


Join the Red Hat Developer Program (it’s free) and get access to related cheat sheets, books, and product downloads.

 

Take advantage of your Red Hat Developers membership and download RHEL today at no cost.

Share

Leave a Reply