2021-07-05 02:39:22 +08:00
|
|
|
# Docker PHP-FPM 8.0 & Nginx 1.20 on Alpine Linux
|
2021-09-25 13:41:10 +08:00
|
|
|
Example PHP-FPM 8.0 & Nginx 1.20 container image for Docker, build on [Alpine Linux](https://www.alpinelinux.org/).
|
2016-02-16 01:20:56 +08:00
|
|
|
|
2019-01-26 22:49:54 +08:00
|
|
|
Repository: https://github.com/TrafeX/docker-php-nginx
|
|
|
|
|
2016-02-24 21:02:57 +08:00
|
|
|
|
2019-01-26 20:54:53 +08:00
|
|
|
* Built on the lightweight and secure Alpine Linux distribution
|
2021-04-21 06:01:29 +08:00
|
|
|
* Very small Docker image size (+/-40MB)
|
2021-04-14 04:43:03 +08:00
|
|
|
* Uses PHP 8.0 for better performance, lower CPU usage & memory footprint
|
2019-01-26 20:54:53 +08:00
|
|
|
* Optimized for 100 concurrent users
|
2021-09-25 13:41:10 +08:00
|
|
|
* Optimized to only use resources when there's traffic (by using PHP-FPM's `on-demand` process manager)
|
|
|
|
* The services Nginx, PHP-FPM and supervisord run under a non-privileged user (nobody) to make it more secure
|
2019-01-26 20:54:53 +08:00
|
|
|
* The logs of all the services are redirected to the output of the Docker container (visible with `docker logs -f <container name>`)
|
2019-11-05 21:27:30 +08:00
|
|
|
* Follows the KISS principle (Keep It Simple, Stupid) to make it easy to understand and adjust the image to your needs
|
2019-01-26 20:54:53 +08:00
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
[![Docker Pulls](https://img.shields.io/docker/pulls/trafex/php-nginx.svg)](https://hub.docker.com/r/trafex/php-nginx/)
|
2021-07-05 02:39:22 +08:00
|
|
|
![nginx 1.18.0](https://img.shields.io/badge/nginx-1.20-brightgreen.svg)
|
2021-04-14 04:43:03 +08:00
|
|
|
![php 8.0](https://img.shields.io/badge/php-8.0-brightgreen.svg)
|
2019-02-03 14:40:58 +08:00
|
|
|
![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)
|
2016-02-24 21:02:57 +08:00
|
|
|
|
2021-09-25 13:41:10 +08:00
|
|
|
## Goal of this project
|
|
|
|
The goal of this container image is to provide an example for running Nginx and PHP-FPM in a container which follows
|
|
|
|
the best practices and is easy to understand and modify to your needs.
|
2019-01-26 20:54:53 +08:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Start the Docker container:
|
2016-02-16 01:20:56 +08:00
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
docker run -p 80:8080 trafex/php-nginx
|
2016-02-18 16:23:59 +08:00
|
|
|
|
2016-02-24 18:08:50 +08:00
|
|
|
See the PHP info on http://localhost, or the static html page on http://localhost/test.html
|
2019-07-21 14:20:03 +08:00
|
|
|
|
|
|
|
Or mount your own code to be served by PHP-FPM & Nginx
|
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
docker run -p 80:8080 -v ~/my-codebase:/var/www/html trafex/php-nginx
|
2019-11-06 15:49:51 +08:00
|
|
|
|
2021-09-25 13:41:10 +08:00
|
|
|
### Docker Hub repository name change
|
|
|
|
Since we switched to PHP8 the repository name [trafex/alpine-nginx-php7](https://hub.docker.com/r/trafex/alpine-nginx-php7) didn't make sense anymore.
|
|
|
|
Because you can't change the name of the repository on Docker Hub I created a new one.
|
|
|
|
|
|
|
|
From now on this image can be pulled from Docker Hub under the name [trafex/php-nginx](https://hub.docker.com/r/trafex/php-nginx).
|
|
|
|
|
2019-11-06 15:49:51 +08:00
|
|
|
## Configuration
|
|
|
|
In [config/](config/) you'll find the default configuration files for Nginx, PHP and PHP-FPM.
|
|
|
|
If you want to extend or customize that you can do so by mounting a configuration file in the correct folder;
|
|
|
|
|
|
|
|
Nginx configuration:
|
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
docker run -v "`pwd`/nginx-server.conf:/etc/nginx/conf.d/server.conf" trafex/php-nginx
|
2019-11-06 15:49:51 +08:00
|
|
|
|
|
|
|
PHP configuration:
|
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
docker run -v "`pwd`/php-setting.ini:/etc/php7/conf.d/settings.ini" trafex/php-nginx
|
2019-11-06 15:49:51 +08:00
|
|
|
|
|
|
|
PHP-FPM configuration:
|
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
docker run -v "`pwd`/php-fpm-settings.conf:/etc/php7/php-fpm.d/server.conf" trafex/php-nginx
|
2019-11-06 15:49:51 +08:00
|
|
|
|
2020-06-17 00:17:37 +08:00
|
|
|
_Note; Because `-v` requires an absolute path I've added `pwd` in the example to return the absolute path to the current directory_
|
2020-02-09 15:32:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
## Adding composer
|
|
|
|
|
2020-06-02 19:01:37 +08:00
|
|
|
If you need [Composer](https://getcomposer.org/) in your project, here's an easy way to add it.
|
2020-02-09 15:32:07 +08:00
|
|
|
|
2021-04-21 06:01:29 +08:00
|
|
|
```Dockerfile
|
|
|
|
FROM trafex/php-nginx:latest
|
2020-02-09 15:32:07 +08:00
|
|
|
|
|
|
|
# Install composer from the official image
|
|
|
|
COPY --from=composer /usr/bin/composer /usr/bin/composer
|
|
|
|
|
|
|
|
# Run composer install to install the dependencies
|
|
|
|
RUN composer install --optimize-autoloader --no-interaction --no-progress
|
|
|
|
```
|
2020-06-02 19:01:37 +08:00
|
|
|
|
|
|
|
### Building with composer
|
|
|
|
|
|
|
|
If you are building an image with source code in it and dependencies managed by composer then the definition can be improved.
|
|
|
|
The dependencies should be retrieved by the composer but the composer itself (`/usr/bin/composer`) is not necessary to be included in the image.
|
|
|
|
|
|
|
|
```Dockerfile
|
|
|
|
FROM composer AS composer
|
|
|
|
|
|
|
|
# copying the source directory and install the dependencies with composer
|
|
|
|
COPY <your_directory>/ /app
|
|
|
|
|
|
|
|
# run composer install to install the dependencies
|
|
|
|
RUN composer install \
|
|
|
|
--optimize-autoloader \
|
|
|
|
--no-interaction \
|
|
|
|
--no-progress
|
|
|
|
|
|
|
|
# continue stage build with the desired image and copy the source including the
|
|
|
|
# dependencies downloaded by composer
|
2021-04-21 06:01:29 +08:00
|
|
|
FROM trafex/php-nginx
|
2020-06-02 19:01:37 +08:00
|
|
|
COPY --chown=nginx --from=composer /app /var/www/html
|
2020-08-18 14:32:40 +08:00
|
|
|
```
|