Running PHP FPM in Docker
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.
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.
This example use FROM centos:6, but Red Hat Enterprise Linux 7 users can change with FROM rhel6 and use official RHEL docker image.
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.
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)
# 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
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.