/docker-php-nginx-dev

Docker PHP 7.4 FPM + Nginx to developer enviroment

Primary LanguageDockerfile

PHP 7.4 FPM + NGINX Dev Enviroment

Image composition and versions below:

  • PHP FPM 7.4
  • XDebug 3.0.2
  • NGINX 1.20.1-r3
  • Composer 2.1.3
  • Git 2.32.0-r0
  • Redis PHP Extension 5.3.4
  • MongoDB PHP Extension 1.10.0alpha1

CLI

docker run -d --name project-app -v "$PWD":/var/www/html -p 80:80 -p 443:443 dersonsena/php-nginx-dev

Docker Compose

Minimal to use

The snipet below show the minimal setup:

version: '3.5'
services:
  app:
    container_name: project-app
    image: dersonsena/php-nginx-dev
    volumes:
      - ./:/var/www/html
    ports:
      - '80:80'
      - '443:443'
    networks:
      - project-network

networks:
  project-network:
    driver: bridge

PHP

You can customize some php ini params. The possibles variables and their default values are shown below:

version: '3.5'
services:
  app:
    container_name: project-app
    image: dersonsena/php-nginx-dev
    volumes:
      - ./:/var/www/html
    ports:
      - '80:80'
      - '443:443'
    environment:
      - PHP_DATE_TIMEZONE=America/Sao_Paulo
      - PHP_DISPLAY_ERRORS=On
      - PHP_MEMORY_LIMIT=256M
      - PHP_MAX_EXECUTION_TIME=60
      - PHP_POST_MAX_SIZE=50M
      - PHP_UPLOAD_MAX_FILESIZE=50M
    networks:
      - project-network

networks:
  project-network:
    driver: bridge

If you want to use a custom php.ini file, just create one in your project, such as .docker/php/php.ini, and map volume like below:

...
volumes:
  - ./:/var/www/html
  - ./.docker/php:/usr/local/etc/php
...

TIP: to make your life easier you can use the original php.ini file placed in root level of this repository.

(BETA) You can change the PHP version (see PHP Supported Versions). Just set the arg PHP_VERSION. The default version is 7.4.20:

...
build:
  args:
    PHP_VERSION: 8.0.7
...

Installed PHP Extensions

$ php -m

[PHP Modules]
bcmath
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
hash
iconv
imagick
intl
json
ldap
libxml
mbstring
mcrypt
mongodb
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
readline
redis
Reflection
session
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
tokenizer
xdebug
xml
xmlreader
xmlwriter
xsl
yaml
zip
zlib

[Zend Modules]
Xdebug

XDebug

You can customize some xdebug params. The possibles variables and their default values are shown below:

version: '3.5'
services:
  app:
    container_name: project-app
    image: dersonsena/php-nginx-dev
    volumes:
      - ./:/var/www/html
    ports:
      - '80:80'
      - '443:443'
    environment:
      - XDEBUG_MODE=develop,debug,coverage
      - XDEBUG_START_WITH_REQUEST=yes
      - XDEBUG_DISCOVER_CLIENT_HOST=true
      - XDEBUG_CLIENT_HOST=host.docker.internal
      - XDEBUG_CLIENT_PORT=9000
      - XDEBUG_MAX_NESTING_LEVEL=1500
      - XDEBUG_IDE_KEY=PHPSTORM
      - XDEBUG_LOG=/tmp/xdebug.log
    networks:
      - project-network

networks:
  project-network:
    driver: bridge

Just on MacOs environment, use this configurations to use xdebug:

...
environment:
  - XDEBUG_START_WITH_REQUEST=yes
  - XDEBUG_DISCOVER_CLIENT_HOST=false
  - XDEBUG_CLIENT_PORT=<your-ide-port-here>
...

TIP: if you are using PHPUnit + XDebug to generate coverage, remove the debug value and add coverage in the XDEBUG_MODE env:

...
environment:
  - XDEBUG_MODE=develop,coverage
...

or you can use the follow command in CLI:

docker exec -it -e XDEBUG_MODE=coverage "your-container-name" ./vendor/bin/phpunit

NGINX

Change Document Root

You can change the nginx document root. If the project's document is public_html, for example, you can do:

...
environment:
  - NGINX_DOCUMENT_ROOT=/var/www/html/public_html
...

SSL Certificate

This docker image already have a SSL certificate, but if you want to use a custom SSL certificates to NGINX web server, just create the files in folder in your project, such as .docker/nginx/:

  • Private Key: .docker/nginx/certificate.key
  • Certificate: .docker/nginx/certificate.crt

and place your certificate and key files there. After this, just map volumes as below:

version: '3.5'
services:
  app:
    container_name: project-app
    image: dersonsena/php-nginx-dev
    volumes:
      - ./:/var/www/html
      - ./.docker/nginx/certs:/etc/nginx/certs
    ports:
      - '80:80'
      - '443:443'
    networks:
      - project-network

networks:
  project-network:
    driver: bridge