mirror of
https://github.com/jkaninda/laravel-php-fpm.git
synced 2025-12-06 17:09:39 +01:00
Compare commits
33 Commits
b90f1c3c32
...
f244eb704c
| Author | SHA1 | Date | |
|---|---|---|---|
| f244eb704c | |||
| 8731e698bc | |||
| 5d2b1f2a49 | |||
| d4f8c74eb2 | |||
| 1733a634a3 | |||
|
|
8b009d1b3c | ||
| b3850050fc | |||
| 23bd4ca852 | |||
| 8539386b7a | |||
| cc5d71f1e7 | |||
| 10007c3d37 | |||
| 5c95007a33 | |||
| 7c1e92f932 | |||
| 393179c22a | |||
| 34970e57b8 | |||
| 673a481044 | |||
| 5dea6fe79a | |||
| b87513e560 | |||
| c4ce43d531 | |||
| 5f69345fd0 | |||
| f409343ecd | |||
| 1045c2eb9a | |||
| d1b60c02f9 | |||
| 3537726725 | |||
| b6858c9097 | |||
| acfb10dbb9 | |||
| a066c2f8ec | |||
| 4f86a4127c | |||
| e0ca7da470 | |||
| 7b49ffb01f | |||
| 370238fa33 | |||
| fdd46315d7 | |||
| 56d9701ff6 |
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Jonas Kaninda
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
368
README.md
368
README.md
@@ -1,3 +1,8 @@
|
||||
### 🐳 **Docker Image: Laravel PHP-FPM**
|
||||
|
||||
A **ready-to-use container** designed for running PHP-based applications, including Laravel microservices.
|
||||
This Docker image comes with **PHP-FPM**, offering a robust foundation for your projects with built-in support for essential extensions and configurations.
|
||||
|
||||
[](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/build.yml)
|
||||
[](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/tests.yml)
|
||||

|
||||
@@ -9,116 +14,76 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
# Laravel PHP-FPM Docker image
|
||||
#### **Features**
|
||||
- **PHP Application Support**: Optimized to run Laravel or any PHP-based applications.
|
||||
- **Integrated Extensions**:
|
||||
- **Database**: MySQL and PostgreSQL.
|
||||
- **Caching**: Redis and Memcached.
|
||||
- **Messaging**: Kafka for event-driven architecture.
|
||||
- **Task Scheduling**: Laravel Scheduler and Cron jobs support.
|
||||
- **Custom Configuration**: Pre-configured with sensible defaults, allowing seamless customization.
|
||||
- **Event Handling**: Support for advanced event-driven processes.
|
||||
- **Optimized for Microservices**: Built with modern PHP microservices in mind.
|
||||
|
||||
> 🐳 Full Docker image for a PHP-FPM container created to run Laravel or any php based applications.
|
||||
This image is ideal for developers looking for a streamlined, high-performance solution to deploy PHP applications with essential tools already integrated.
|
||||
|
||||
> PHP Microservices ready Docker container image.
|
||||
|
||||
## Links:
|
||||
- [Docker Hub](https://hub.docker.com/r/jkaninda/laravel-php-fpm)
|
||||
- [Github](https://github.com/jkaninda/laravel-php-fpm)
|
||||
---
|
||||
|
||||
## **Supported PHP Versions**
|
||||
- 8.4
|
||||
- 8.3
|
||||
- 8.2
|
||||
- 8.1
|
||||
- 8.0
|
||||
- 7.4
|
||||
- 7.2
|
||||
|
||||
## PHP Version:
|
||||
- 8.4
|
||||
- 8.3
|
||||
- 8.2
|
||||
- 8.1
|
||||
- 8.0
|
||||
- 7.4
|
||||
- 7.2
|
||||
## Specifications:
|
||||
---
|
||||
|
||||
* Composer
|
||||
* OpenSSL PHP Extension
|
||||
* XML PHP Extension
|
||||
* PDO PHP Extension
|
||||
* PDO Mysql
|
||||
* PDO Pgsql
|
||||
* Rdkafka PHP Extension
|
||||
* Redis PHP Extension
|
||||
* Mbstring PHP Extension
|
||||
* PCNTL PHP Extension
|
||||
* ZIP PHP Extension
|
||||
* GD PHP Extension
|
||||
* BCMath PHP Extension
|
||||
* Memcached
|
||||
* Opcache
|
||||
* Laravel Cron Job
|
||||
* Laravel Schedule
|
||||
* Laravel Envoy
|
||||
* Supervisord
|
||||
* Node
|
||||
* NPM
|
||||
## **Specifications**
|
||||
|
||||
## Simple docker-compose usage:
|
||||
### **PHP Extensions**
|
||||
- Composer
|
||||
- OpenSSL
|
||||
- XML
|
||||
- PDO (MySQL and PostgreSQL)
|
||||
- Rdkafka
|
||||
- Redis
|
||||
- Mbstring
|
||||
- PCNTL
|
||||
- ZIP
|
||||
- GD
|
||||
- BCMath
|
||||
- Memcached
|
||||
- Opcache
|
||||
|
||||
```yml
|
||||
version: '3'
|
||||
### **Additional Features**
|
||||
- Laravel Cron Jobs
|
||||
- Laravel Scheduler
|
||||
- Supervisord
|
||||
- Node.js and NPM
|
||||
|
||||
---
|
||||
|
||||
## **Getting Started**
|
||||
|
||||
### **Simple Docker-Compose Example**
|
||||
```yaml
|
||||
services:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm:latest
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
user: www-data #Use www-data user for production usage
|
||||
volumes:
|
||||
#Project root
|
||||
- ./src:/var/www/html
|
||||
networks:
|
||||
- default #if you're using networks between containers
|
||||
|
||||
```
|
||||
## Docker:
|
||||
### Run
|
||||
```sh
|
||||
docker compose up -d
|
||||
```
|
||||
### Create Laravel project
|
||||
```sh
|
||||
docker compose exec php-fpm composer create-project --prefer-dist laravel/laravel .
|
||||
```
|
||||
### Artisan generate key
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan key:generate
|
||||
```
|
||||
### Storage link
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan storage:link
|
||||
```
|
||||
### Fix permissions
|
||||
```sh
|
||||
docker compose exec php-fpm chmod -R 777 storage bootstrap/cache
|
||||
```
|
||||
### Laravel migration
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan migrate
|
||||
```
|
||||
###
|
||||
```sh
|
||||
docker exec -it php-fpm bash
|
||||
|
||||
```
|
||||
|
||||
## Configurations
|
||||
|
||||
- Supervisor config folder: /etc/supervisor/conf.d/
|
||||
- PHP ini config foler /usr/local/etc/php/conf.d/
|
||||
|
||||
## Example Laravel-php-fpm with nginx:
|
||||
### docker-compose.yml
|
||||
```yml
|
||||
services:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
#Project root
|
||||
- ./:/var/www/html
|
||||
networks:
|
||||
- default #if you're using networks between containers
|
||||
#Nginx server
|
||||
nginx-server:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm:latest
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
user: www-data # For production
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
networks:
|
||||
- default
|
||||
nginx-server:
|
||||
image: jkaninda/nginx-fpm:alpine
|
||||
container_name: nginx-server
|
||||
restart: unless-stopped
|
||||
@@ -132,64 +97,64 @@ services:
|
||||
- PHP_FPM_HOST=php-fpm:9000
|
||||
networks:
|
||||
- default
|
||||
|
||||
```
|
||||
## Simple Nginx config file content
|
||||
### default.conf
|
||||
|
||||
```conf
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
index index.php index.html;
|
||||
error_log /var/log/nginx/error.log;
|
||||
access_log /var/log/nginx/access.log;
|
||||
##Public directory
|
||||
root /var/www/html/public;
|
||||
location ~ \.php$ {
|
||||
try_files $uri =404;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
## PHP FPM ( php-fpm:9000 ) or [servicename:9000]
|
||||
fastcgi_pass php-fpm:9000;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
|
||||
}
|
||||
client_max_body_size 15M;
|
||||
server_tokens off;
|
||||
|
||||
# Hide PHP headers
|
||||
fastcgi_hide_header X-Powered-By;
|
||||
fastcgi_hide_header X-CF-Powered-By;
|
||||
fastcgi_hide_header X-Runtime;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
gzip_static on;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Advanced Laravel-php-fpm with nginx:
|
||||
### docker-compose.yml
|
||||
```yml
|
||||
### **Basic Commands**
|
||||
- **Start Containers**
|
||||
```sh
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
- **Create a Laravel Project**
|
||||
```sh
|
||||
docker compose exec php-fpm composer create-project --prefer-dist laravel/laravel .
|
||||
```
|
||||
|
||||
- **Generate Application Key**
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan key:generate
|
||||
```
|
||||
|
||||
- **Create Storage Symlink**
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan storage:link
|
||||
```
|
||||
|
||||
- **Fix Permissions**
|
||||
```sh
|
||||
docker compose exec php-fpm chmod -R 777 storage bootstrap/cache
|
||||
```
|
||||
|
||||
- **Run Laravel Migrations**
|
||||
```sh
|
||||
docker compose exec php-fpm php artisan migrate
|
||||
```
|
||||
|
||||
- **Access the Container Shell**
|
||||
```sh
|
||||
docker exec -it php-fpm bash
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Advanced Usage with Nginx**
|
||||
|
||||
### **Docker-Compose with Nginx**
|
||||
Example of using a custom nginx config:
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
services:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
#Project root
|
||||
- ./:/var/www/html
|
||||
- ~/.ssh:/root/.ssh # If you use private CVS
|
||||
- ./php.ini:/usr/local/etc/php/conf.d/php.ini # Optional, your custom php init file
|
||||
environment:
|
||||
- APP_ENV=development # Optional, or production
|
||||
#- LARAVEL_PROCS_NUMBER=1 # Optional, Laravel queue:work process number
|
||||
#Nginx server
|
||||
nginx-server:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
networks:
|
||||
- default
|
||||
|
||||
nginx-server:
|
||||
image: nginx:alpine
|
||||
container_name: nginx-server
|
||||
restart: unless-stopped
|
||||
@@ -198,46 +163,68 @@ services:
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
- ./default.conf:/etc/nginx/conf.d/default.conf
|
||||
environment:
|
||||
- DOCUMENT_ROOT=/var/www/html/public
|
||||
- CLIENT_MAX_BODY_SIZE=20M
|
||||
- PHP_FPM_HOST=php-fpm:9000
|
||||
networks:
|
||||
- default
|
||||
volumes:
|
||||
storage-data:
|
||||
```
|
||||
|
||||
## Docker run
|
||||
```sh
|
||||
docker compose up -d
|
||||
### **Nginx Configuration (default.conf)**
|
||||
|
||||
```
|
||||
## Build from base
|
||||
```conf
|
||||
server {
|
||||
listen 80;
|
||||
index index.php index.html;
|
||||
root /var/www/html/public;
|
||||
|
||||
Dockerfile
|
||||
location ~ \.php$ {
|
||||
try_files $uri =404;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass php-fpm:9000;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
gzip_static on;
|
||||
}
|
||||
|
||||
client_max_body_size 15M;
|
||||
server_tokens off;
|
||||
fastcgi_hide_header X-Powered-By;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Custom Build**
|
||||
|
||||
### **Dockerfile Example**
|
||||
```Dockerfile
|
||||
FROM jkaninda/laravel-php-fpm:8.3
|
||||
# Copy laravel project files
|
||||
# Copy Laravel project files
|
||||
COPY . /var/www/html
|
||||
# Storage Volume
|
||||
VOLUME /var/www/html/storage
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Custom cache invalidation / optional
|
||||
#ARG CACHEBUST=1
|
||||
# Run composer install / Optional
|
||||
#RUN composer install
|
||||
# Fix permissions
|
||||
RUN chown -R www-data:www-data /var/www/html
|
||||
|
||||
USER www-data
|
||||
```
|
||||
## Supervisord
|
||||
### Add supervisor process in
|
||||
|
||||
> /etc/supervisor/conf.d/
|
||||
---
|
||||
|
||||
In case you want to execute and maintain a task or process with supervisor.
|
||||
## **Supervisord Integration**
|
||||
|
||||
Find below an example with Apache Kafka, when you want to maintain a consumer process.
|
||||
### Example:
|
||||
### **Adding Custom Supervisor Processes**
|
||||
Place configurations in `/etc/supervisor/conf.d/`.
|
||||
Example Kafka consumer process:
|
||||
```conf
|
||||
[program:kafkaconsume-worker]
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
@@ -250,21 +237,26 @@ redirect_stderr=true
|
||||
stdout_logfile=/var/www/html/storage/logs/kafka.log
|
||||
```
|
||||
|
||||
### Custom php.ini
|
||||
> /var/www/html/conf/php/php.ini
|
||||
---
|
||||
|
||||
### Storage permision issue
|
||||
```sh
|
||||
docker compose exec php-fpm /bin/bash
|
||||
```
|
||||
## **Custom PHP Configurations**
|
||||
Place your custom `php.ini` file at:
|
||||
```
|
||||
/usr/local/etc/php/conf.d/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Storage Permissions Fix**
|
||||
If you encounter permission issues, run:
|
||||
|
||||
```sh
|
||||
chown -R www-data:www-data /var/www/html
|
||||
```
|
||||
|
||||
> chmod -R 775 /var/www/html/storage
|
||||
|
||||
|
||||
> P.S. please give a star if you like it :wink:
|
||||
docker compose exec php-fpm /bin/bash
|
||||
chown -R www-data:www-data /var/www/html
|
||||
chmod -R 775 /var/www/html/storage
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ⭐️ **Support the Project**
|
||||
If you find this project useful, please give it a ⭐️ on GitHub! 😊
|
||||
29
compose.yaml
Normal file
29
compose.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
php-fpm:
|
||||
image: jkaninda/laravel-php-fpm
|
||||
container_name: php-fpm
|
||||
restart: unless-stopped
|
||||
user: www-data #Use www-data user production usage
|
||||
volumes:
|
||||
#Project root
|
||||
- ./:/var/www/html
|
||||
networks:
|
||||
- web #if you're using networks between containers
|
||||
#Nginx server
|
||||
nginx-server:
|
||||
image: jkaninda/nginx-fpm:alpine
|
||||
container_name: nginx-server
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 80:80
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
environment:
|
||||
- DOCUMENT_ROOT=/var/www/html/public
|
||||
- CLIENT_MAX_BODY_SIZE=20M
|
||||
- PHP_FPM_HOST=php-fpm:9000
|
||||
networks:
|
||||
- web
|
||||
networks:
|
||||
web:
|
||||
external: false
|
||||
Reference in New Issue
Block a user