Sign inSign up

devilbox/php-fpm

By devilbox

•Updated over 3 years ago

Devilbox PHP-FPM images (5.2 | 5.3 | 5.4 | 5.6 | 7.0 | 7.1 | 7.2 | 7.3 | 7.4 | 8.0 | 8.1 | 8.2)

Image
34

5M+

devilbox/php-fpm repository overview

⁠PHP-FPM Docker images

Release lint build nightly License

Discord Discourse

PHP-FPMReference Implementation
Streamlined PHP-FPM⁠ imagesThe Devilbox⁠

Available Architectures: amd64, arm64

This repository will provide you fully functional PHP-FPM Docker images in different flavours, versions and packed with different types of integrated PHP modules. It also solves the problem of syncronizing file permissions⁠ of mounted volumes between the host and the container.

:information_source: For details see Documentation: Syncronize File Permissions⁠

This repository also allows you to quickly generate and build your own custom PHP-FPM Docker image with whatever PHP extension your desire for whatever PHP version you want and for any platform you're on (amd64 or arm64). Jump to #Build your own image⁠.

⁠ Docker Tags

:information_source: For details see Documentation: Docker Tags⁠
:information_source: For details see Documentation: Supported Architectures⁠

⁠ PHP Versions

The following PHP versions are provided by this repository.

  • PHP 5.2, PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6
  • PHP 7.0, PHP 7.1, PHP 7.2, PHP 7.3, PHP 7.4
  • PHP 8.0, PHP 8.1, PHP 8.2

Note: Unreleased PHP versions are built from custom base images.

:information_source: For details see Documentation: PHP Versions⁠
:information_source: For details see Documentation: Base Images⁠

⁠ Flavours

The provided Docker images heavily rely on inheritance to guarantee smallest possible image size. Each of them provide a working PHP-FPM server and you must decide what version works best for you. Look at the sketch below to get an overview about the two provided flavours and each of their different types.

        [PHP]            # Base FROM image (Official PHP-FPM image)
          ^              #
          |              #
          |              #
        [base]           # Streamlined base images with host user mapping
          ^              # environment variables and custom configs.
          |              #
          |              #
        [mods]           # Installs additional PHP modules
          ^              # via pecl, git and other means
          |              #
          |              #
        [prod]           # Devilbox flavour for production
          ^              # (locales, postifx, socat and injectables)
          |              # (custom *.ini files)
          |              #
        [slim]           # Devilbox flavour with only required
          ^              # cli tools to have a functional intranet.
          |              #
          |              #
        [work]           # Devilbox flavour for local development
                         # (includes backup and development tools)
                         # (sudo, custom bash and tool configs)

:information_source: For details see Documentation: Flavours⁠
:information_source: For details see Documentation: Base Images⁠

⁠ Available PHP extensions

Click below listed extensions for details:

amqp⁠ apc⁠ apcu⁠ bcmath⁠ blackfire⁠ bz2⁠ calendar⁠ ctype⁠ curl⁠ date⁠ dba⁠ dom⁠ enchant⁠ ereg⁠ exif⁠ FFI⁠ fileinfo⁠ filter⁠ ftp⁠ gd⁠ gettext⁠ gmp⁠ hash⁠ iconv⁠ igbinary⁠ imagick⁠ imap⁠ interbase⁠ intl⁠ ioncube⁠ json⁠ ldap⁠ libxml⁠ lz4⁠ lzf⁠ mbstring⁠ mcrypt⁠ memcache⁠ memcached⁠ mhash⁠ mongo⁠ mongodb⁠ msgpack⁠ mysql⁠ mysqli⁠ mysqlnd⁠ OAuth⁠ oci8⁠ OPcache⁠ openssl⁠ pcntl⁠ pcre⁠ PDO⁠ pdo_dblib⁠ PDO_Firebird⁠ pdo_mysql⁠ PDO_OCI⁠ pdo_pgsql⁠ pdo_sqlite⁠ pdo_sqlsrv⁠ pgsql⁠ phalcon⁠ Phar⁠ posix⁠ pspell⁠ psr⁠ random⁠ rdkafka⁠ readline⁠ recode⁠ redis⁠ Reflection⁠ session⁠ shmop⁠ SimpleXML⁠ snmp⁠ soap⁠ sockets⁠ sodium⁠ solr⁠ SPL⁠ sqlite⁠ sqlite3⁠ sqlsrv⁠ ssh2⁠ swoole⁠ sysvmsg⁠ sysvsem⁠ sysvshm⁠ tidy⁠ tokenizer⁠ uploadprogress⁠ uuid⁠ vips⁠ wddx⁠ Xdebug⁠ xlswriter⁠ xml⁠ xmlreader⁠ xmlrpc⁠ xmlwriter⁠ xsl⁠ yaml⁠ zip⁠ zlib⁠ zstd⁠

:information_source: For details see Documentation: PHP Modules⁠
:information_source: For details see Contributor Documentation: PHP Module definition⁠

⁠ Environment Variables

The provided Docker images offer environment variables to alter their startup behaviour.

:information_source: For details see Documentation: Environment Variables⁠ or click on the variable name directly.

VariableShort description
DEBUG_ENTRYPOINT⁠Control docker log verbosity
NEW_UID⁠Syncronize user-id file system permissions
NEW_GID⁠Syncronize group-id file system permissions
TIMEZONE⁠Set timezone
DOCKER_LOGS⁠Make PHP log to file or docker logs
ENABLE_MODULES⁠Enable specific PHP extensions
DISABLE_MODULES⁠Disable specific PHP extensions
ENABLE_MAIL⁠Control email-catch all (to not accidentally send out emails)
FORWARD_PORTS_TO_LOCALHOST⁠Make remote ports available locally inside the container
MYSQL_BACKUP_USER⁠Set MySQL username (for backups)
MYSQL_BACKUP_PASS⁠Set MySQL password (for backups)
MYSQL_BACKUP_HOST⁠Set MySQL hostname (for backups)

⁠ Volumes

The provided Docker images offer different volumes to be mounted.

:information_source: For details see Documentation: Volumes⁠ or click on the volume name directly.

VolumeShort description
/etc/php-custom.d/⁠Add custom PHP *.ini files
/etc/php-fpm-custom.d/⁠Add custom PHP-FPM *.conf files
/startup.1.d/⁠Add custom startup *.sh files
/startup.2.d/⁠Add custom startup *.sh files
/var/log/php/⁠Find PHP log files
/var/mail/⁠Find sent emails
/etc/supervisor/custom.d/⁠Add custom supervisord *.conf files
/etc/bashrc-devilbox.d/⁠Add custom bashrc files
/shared/backups/⁠Find MySQL backups
/ca/⁠Add custom Certificate Authority

⁠ Ports

Have a look at the following table to see all offered exposed ports for each Docker image flavour.

FlavourPortDescription
base
mods
prod
slim
work
9000PHP-FPM listening port

⁠ PHP Default Configuration

Each PHP version is using the same sane default php.ini values, making it pain-free to switch versions and not having to worry about different php.ini settings. Note: Flavours alway inherit the settings from its parent flavour if they have no own configuration.

FlavourApplied php.ini files
basephp.ini⁠ and php-fpm.conf⁠
modsinherits from base
prodinherits from base
slimphp.ini⁠ and php-fpm.conf⁠
workinherits from slim

⁠ Integrated Development Environment

If you plan to use the PHP-FPM image for development, hence being able to execute common commands inside the container itself, you should go with the work Image.

The work Docker image has many common tools already installed which on one hand increases its image size, but on the other hand removes the necessity to install those tools locally.

You want to use tools such as angular-cli, codeception, composer, deployer, eslint, git, grunt-cli, gulp, laravel-installer, node, npm, nvm, phalcon-devtools, phpcs, phpunit, pm2, symfony-cli, tig, vue, webpack-cli, wp-cli, yarn, yq, zsh as well as many others, simply do it directly inside the container. As all Docker images are auto-built every night by GitHub Actions it is assured that you are always at the latest version of your favorite dev tool.

:information_source: For details see Documentation: Available Tools⁠

⁠What else is available

Apart from the provided tools, you will also be able to use the container similar as you would do with your host system. Just a few things to mention here:

  • Mount custom bash configuration files so your config persists between restarts
  • Use password-less sudo to become root and do whatever you need to do

⁠ Examples

⁠Provide PHP-FPM port to host
$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -t devilbox/php-fpm:7.2-prod
⁠Alter PHP-FPM and system timezone
$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -e TIMEZONE=Europe/Berlin \
    -t devilbox/php-fpm:7.2-prod
⁠Load custom PHP configuration

config/ is a local directory that will hold the PHP *.ini files you want to load into the Docker container.

# Create config directory to be mounted with dummy configuration
$ mkdir config
# Xdebug 2
$ echo "xdebug.enable = 1" > config/xdebug.ini
# Xdebug 3
$ echo "xdebug.mode = debug" > config/xdebug.ini

# Run container and mount it
$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -v config:/etc/php-custom.d \
    -t devilbox/php-fpm:7.2-prod
⁠MySQL connect via 127.0.0.1 (via port-forward)

Forward MySQL Port from 172.168.0.30 (or any other IP address/hostname) and Port 3306 to the PHP docker on 127.0.0.1:3306. By this, your PHP files inside the docker can use 127.0.0.1 to connect to a MySQL database.

$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -e FORWARD_PORTS_TO_LOCALHOST='3306:172.168.0.30:3306' \
    -t devilbox/php-fpm:7.2-prod
⁠MySQL and Redis connect via 127.0.0.1 (via port-forward)

Forward MySQL Port from 172.168.0.30:3306 and Redis port from redis:6379 to the PHP docker on 127.0.0.1:3306 and 127.0.0.1:6379. By this, your PHP files inside the docker can use 127.0.0.1 to connect to a MySQL or Redis database.

$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -e FORWARD_PORTS_TO_LOCALHOST='3306:172.168.0.30:3306, 6379:redis:6379' \
    -t devilbox/php-fpm:7.2-prod
⁠Launch Postfix for mail-catching

Once you set $ENABLE_MAIL=2, all mails sent via any of your PHP applications no matter to which domain, are catched locally into the devilbox account. You can also mount the mail directory locally to hook in with mutt and read those mails.

$ docker run -d \
    -p 127.0.0.1:9000:9000 \
    -v /tmp/mail:/var/mail \
    -e ENABLE_MAIL=2 \
    -t devilbox/php-fpm:7.2-prod
⁠Webserver and PHP-FPM

~/my-host-www will be the directory that serves the php files (your document root). Make sure to mount it into both, php and the webserver.

# Start PHP-FPM container
$ docker run -d \
    -v ~/my-host-www:/var/www/default/htdocs \
    --name php \
    -t devilbox/php-fpm:7.2-prod

# Start webserver and link with PHP-FPM
$ docker run -d \
    -p 80:80 \
    -v ~/my-host-www:/var/www/default/htdocs \
    -e PHP_FPM_ENABLE=1 \
    -e PHP_FPM_SERVER_ADDR=php \
    -e PHP_FPM_SERVER_PORT=9000 \
    --link php \
    -t devilbox/nginx-mainline
⁠Create MySQL Backups

Note: This will only work with work Docker images.

The MySQL server could be another Docker container linked to the PHP-FPM container. Let's assume the PHP-FPM container is able to access the MySQL container by the hostname mysql.

# Start container
$ docker run -d \
    -e MYSQL_BACKUP_USER=root \
    -e MYSQL_BACKUP_PASS=somepass \
    -e MYSQL_BACKUP_HOST=mysql \
    -v ~/backups:/shared/backups \
    --name php \
    -t devilbox/php-fpm:7.2-work

# Run database dump
$ docker exec -it php mysqldump-secure
⁠Docker Compose reference implementation

If you want a fully functional Docker Compose setup, which allows to switch PHP versions easily, comes with web servers, database servers and much more, then head over to the Devilbox⁠ rerefence implementation :

Reference Implementation

⁠ License

MIT License⁠

Copyright (c) 2017 cytopia⁠

Tag summary

Content type

Image

Digest

sha256:ac27bf1b8…

Size

414.5 MB

Last updated

over 3 years ago

docker pull devilbox/php-fpm:5.5-work-0.151