docker-laravel/docs/examples.md

211 lines
5.3 KiB
Markdown
Raw Permalink Normal View History

# Examples
## Quick Start with plug-n-pray
The fastest way to Dockerize any Laravel project:
```bash
# From your Laravel project root:
curl -fsSL https://raw.githubusercontent.com/blax-software/docker-laravel/main/scripts/plug-n-pray.sh | bash
# Or with options:
curl -fsSL https://raw.githubusercontent.com/blax-software/docker-laravel/main/scripts/plug-n-pray.sh | bash -s -- \
--php=8.4 \
--name=my-app \
--host=my-app.localhost
```
Or if you have `blax-software/laravel-workkit` installed:
```bash
php artisan workkit:plug-n-pray
```
This generates:
- `docker-compose.yml` — Full stack with app, MySQL, Redis, and Traefik
- `.env.docker` — Database/Redis connection values to merge into `.env`
- `docker/supervisor/` — Directory for custom supervisor programs
Then:
```bash
docker network create web # once per machine
docker compose up -d
```
---
## Example: Minimal API (no frontend tooling)
```yaml
services:
app:
image: blaxsoftware/laravel:php8.4
volumes:
- ./:/var/www/html
ports:
- "80:80"
environment:
ENABLE_QUEUE: "true"
ENABLE_SCHEDULER: "true"
```
---
## Example: Full Stack with Traefik
Assumes Traefik is already running on the `web` network.
```yaml
networks:
web:
external: true
internal:
volumes:
mysql-data:
redis-data:
services:
app:
image: blaxsoftware/laravel:php8.4
volumes:
- ./:/var/www/html
- ./docker/supervisor:/etc/supervisor/custom.d
environment:
ENABLE_QUEUE: "true"
ENABLE_SCHEDULER: "true"
ENABLE_LARAVEL_PERMS: "1"
networks:
- web
- internal
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
labels:
- traefik.enable=true
- traefik.docker.network=web
- traefik.http.routers.my-app.rule=Host(`my-app.localhost`)
- traefik.http.routers.my-app.entrypoints=web
- traefik.http.routers.my-app.service=my-app-http
- traefik.http.services.my-app-http.loadbalancer.server.port=80
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: my_app
volumes:
- mysql-data:/var/lib/mysql
networks:
- internal
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-psecret"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
networks:
- internal
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
```
---
## Example: With Horizon
```yaml
services:
app:
image: blaxsoftware/laravel:php8.4
volumes:
- ./:/var/www/html
environment:
ENABLE_HORIZON: "true" # replaces basic queue worker
ENABLE_SCHEDULER: "true"
```
---
## Example: Custom Supervisor Programs
Mount your own `.conf` files into `/etc/supervisor/custom.d/`:
```yaml
services:
app:
image: blaxsoftware/laravel:php8.4
volumes:
- ./:/var/www/html
- ./docker/supervisor/reverb.conf:/etc/supervisor/custom.d/reverb.conf
```
`docker/supervisor/reverb.conf`:
```ini
[program:reverb]
command=/usr/local/bin/php -d variables_order=EGPCS /var/www/html/artisan reverb:start --host=0.0.0.0 --port=8080
autostart=true
autorestart=true
user=www-data
priority=25
startsecs=5
stdout_logfile=/proc/1/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/proc/1/fd/2
stderr_logfile_maxbytes=0
```
---
## Example: Override PHP-FPM
```yaml
volumes:
- ./docker/php-fpm.conf:/etc/supervisor/conf.d/php-fpm.conf
```
---
## Example: Multiple PHP Versions in One Compose
```yaml
services:
app-legacy:
image: blaxsoftware/laravel:php8.1
volumes:
- ../legacy-app:/var/www/html
app-new:
image: blaxsoftware/laravel:php8.4
volumes:
- ../new-app:/var/www/html
```
---
## plug-n-pray.sh Options
| Flag | Default | Description |
|------------------|------------------------|----------------------------------------------------------|
| `--php=VERSION` | `8.4` | PHP version |
| `--name=NAME` | directory name | Project name (used for container names & Traefik router) |
| `--host=HOST` | `NAME.localhost` | Traefik hostname |
| `--db=NAME` | project name | MySQL database name |
| `--db-pass=PASS` | `secret` | MySQL root password |
| `--image=IMAGE` | `blaxsoftware/laravel` | Docker image |
| `--no-queue` | — | Disable queue worker |
| `--no-scheduler` | — | Disable scheduler |
| `--horizon` | — | Enable Horizon (auto-disables basic queue) |
| `--no-redis` | — | Skip Redis service |
| `--no-mysql` | — | Skip MySQL service |
| `--force` | — | Overwrite existing files |