Try PHP 8.0 beta features with Docker / Kubernetes

martinpham

Martin Pham

Posted on February 3, 2020

Try PHP 8.0 beta features with Docker / Kubernetes

PHP 8.0's development had started one year ago. With many promising features like: Union types, JIT, Static return type, Weak maps, ..., probably you'd like to give it a try. Or simply, you just want to know if your codebase will run fines with future PHP version. So I've created PHP 8.0 beta Docker images for you :)

The base image martinpham/php8:fpm-alpine contains PHP 8.0 FPM, built from PHP source code, and based on Alpine Linux, so it's quite small and fast. It also supports multiple architectures (linux/amd64, linux/arm64, linux/386, linux/arm/v7, linux/arm/v6), so you can run it even on a small Raspberry Pi!

Docker

You can try to run it now:

docker run -p 9000:9000 --rm martinpham/php8:fpm-alpine
Enter fullscreen mode Exit fullscreen mode

Docker will pull the image, and creates a new container with this image, also exposes port 9000 for PHP-FPM server. (Note: The --rm option tells Docker to remove the container after it finishes).

If everything goes fine, you'd see logs from Docker:

NOTICE: fpm is running, pid 1
NOTICE: ready to handle connections
Enter fullscreen mode Exit fullscreen mode

To make sure, you could also try to send request to the PHP-FPM server:

REQUEST_METHOD=GET cgi-fcgi -bind -connect localhost:9000
Enter fullscreen mode Exit fullscreen mode

(Replace localhost with your Docker's Host IP)

PHP-FPM will respond:

X-Powered-By: PHP/8.0.0-dev
Content-type: text/html; charset=UTF-8
Enter fullscreen mode Exit fullscreen mode

Everything is good! You are running your first PHP 8.0 beta - FPM server!

Kubernetes

If you were following my Kuberetes tutorial before, probably you'd like to deploy it on your Kubernetes cluster :).
Well it's very easy, here is a sample configuration, with:

  • A persistent volume (code-pvc) for storing application code
  • A config map (nginx-config) for nginx configuration
  • A deployment (app-deployment) with PHP 8 FPM server and NGINX web server
  • A service (app-service) to expose deployed pod (tagged with name: app-pod)
## App code volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: code-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---

## Nginx config
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events {
    }
    http {
      server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.html index.htm index.php;

        location / {
          try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
          include fastcgi_params;
          fastcgi_param REQUEST_METHOD $request_method;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_pass 127.0.0.1:9000;
        }
      }
    }

---

## App deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 1
  strategy:
    type: Recreate    
  selector:
    matchLabels:
      name: app-pod
  template:
    metadata:
      name: app-pod
      labels:
        name: app-pod
    spec:
      volumes:
        - name: app-files-volume
          persistentVolumeClaim:
            claimName: code-pvc

        - name: nginx-config-volume
          configMap:
            name: nginx-config

      containers:

        # php-fpm
        - name: phpfpm
          image: martinpham/php8:fpm-alpine
          volumeMounts:
            - name: app-files-volume
              mountPath: /var/www/html
          resources:
            limits:
              cpu: 100m
            requests:
              cpu: 50m

        # nginx
        - name: nginx
          image: nginx:alpine
          volumeMounts:
            - name: app-files-volume
              mountPath: /var/www/html
            - name: nginx-config-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          resources:
            limits:
              cpu: 100m
            requests:
              cpu: 50m

          ports:
          - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3
            successThreshold: 1

--------

## App service
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    name: app-pod
  ports:  
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

Enter fullscreen mode Exit fullscreen mode

Additionally, I've also built an "extra" image, called martinpham/php8:fpm-extra-alpine, which extends from the base image, with mysqli, gd, pdo_mysql and opcache extensions, so you can start to try other extensions with PHP 8.0.


PS: All images above are open-sourced, you can find it here https://github.com/MartinPham/php8-docker

💖 💪 🙅 🚩
martinpham
Martin Pham

Posted on February 3, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related