在MacBook下laravel项目多php版本docker开发环境配置方案

2023-06-01 00:00:00 版本 环境 配置

我自己有个windows下docker + php多版本环境,刚看到社区有人分享macBook下多PHP版本docker环境,感觉不错,分享之!

先发一下我自用的windows10+docker编排实现php多版本共存之自用dnmp开发环境

https://www.zongscan.com/demo333/95917.html

git码云

https://gitee.com/houtizong/dockers


话不多说分享macbook下多版本docker环境:

项目需求

laravel 版本不同对 PHP 的版本要求不同。

如果遇到同时调试多个版本项目,且使用 docker 环境进行开发。具体场景如下(举例):

认证系统基于 laravel6,PHP 运行版本 7.2。

应用系统基于 laravel9,PHP 运行版本 8.1。

应用需要跳转认证系统进行统一登录。在认证通过后,携带临时 ticket 参数 code 回跳应用。

应用拿到 code 参数后,请求认证系统 RPC 服务获取用户详细信息。

1.png


目录结构:

./
├── docker-compose.yaml
├── mariadb-data
├── mariadb-log
├── nginx-config                         # nginx 配置
│   ├── conf.d
│   │   ├── default.conf
│   │   ├── sso.example.com.conf
│   │   ├── app.example.com.conf
│   ├── fastcgi.conf
│   ├── fastcgi_params
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── nginx-bak.conf
│   ├── nginx.conf
│   ├── scgi_params
│   ├── uwsgi_params
│   └── win-utf
├── nginx-html                           # laravel 项目代码目录
│   ├── sso.example.com
│   ├── app.example.com
├── nginx-log
│   ├── access.log
│   ├── error.log
│   ├── sso.example.com-error.log
│   ├── app.example.com-error.log
├── php-config-7.2
│   ├── conf.d
│   ├── php.ini
│   ├── php.ini-development
│   └── php.ini-production
├── php-config-8.1
│   ├── conf.d
│   ├── php.ini
│   ├── php.ini-development
│   └── php.ini-production
└── php-log

docker-compose.json 内容:

version: "3" 
services:
  mysql:
    hostname: mysql
    image: mariadb:10.5.10
    container_name: lara-mariadb-10.5
    ports:
      - "3308:3306" 
    volumes:
      - ./mariadb-log:/var/log/mysql
      - ./mariadb-data:/var/lib/mysql
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_USER=username
      - MYSQL_PASSWORD=password
    networks:
      lara-net:
        ipv4_address: 172.23.0.2
  php72:
    hostname: php-fpm-72
    image: leleos/php-fpm:7.2
    container_name: lara-php-fpm-7.2
    ports:
      - "9001:9000" 
    links:
      - mysql:lara-mariadb-10.5
      - redis:lara-redis-6
    extra_hosts:
      - "sso.example.com:172.23.0.10" 
      - "app.example.com:172.23.0.10" 
    volumes:
      - ./nginx-html:/usr/share/nginx/html:rw
      - ./php-log:/var/log/phplog
      - ./php-config-7.2:/usr/local/etc/php
    environment:
      - TZ=Asia/Shanghai
    networks:
      lara-net:
        ipv4_address: 172.23.0.4
  php81:
    hostname: php-fpm-81
    image: bai615/amd64-php:8.1.17-fpm
    container_name: lara-php-fpm-8.1
    ports:
      - "9002:9000" 
    links:
      - mysql:lara-mariadb-10.5
      - redis:lara-redis-6
    extra_hosts:
      - "sso.example.com:172.23.0.10" 
      - "app.example.com:172.23.0.10" 
    volumes:
      - ./nginx-html:/usr/share/nginx/html:rw
      - ./php-log:/var/log/phplog
      - ./php-config-8.1:/usr/local/etc/php
    environment:
      - TZ=Asia/Shanghai
    networks:
      lara-net:
        ipv4_address: 172.23.0.5
  redis:
    hostname: redis
    container_name: lara-redis-6
    image: redis:6.2.6
    ports:
      - "6479:6379" 
    environment:
      - TZ=Asia/Shanghai
    networks:
      lara-net:
        ipv4_address: 172.23.0.8
  nginx:
    hostname: nginx
    container_name: lara-nginx-1.22.0
    image: nginx:1.22.0
    ports:
      - "81:81" 
      - "443:443" 
    links:
      - "php72:lara-php-fpm-7.2" 
      - "php81:lara-php-fpm-8.1" 
      - "mysql:lara-mariadb-10.5" 
      - "mongo:lara-mongo-5" 
      - "redis:lara-redis-6" 
    extra_hosts:
      - "sso.example.com:127.0.0.1" 
      - "app.example.com:127.0.0.1" 
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./nginx-config:/etc/nginx
      - ./nginx-log:/var/log/nginx
      - ./nginx-html:/usr/share/nginx/html
    networks:
      lara-net:
        ipv4_address: 172.23.0.10
  mongo:
    hostname: mongo
    container_name: lara-mongo-5
    image: mongo:5.0.12
    ports:
      - "27018:27017" 
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - mongo-data:/data/db
    networks:
      lara-net:
        ipv4_address: 172.23.0.9
volumes:
  mongo-data:
networks:
  lara-net:
    ipam:
      config:
        - subnet: "172.23.0.0/24" 

nginx 虚拟机配置:

server {
    listen 80;
    server_name app.example.com;
    root "/usr/share/nginx/html/app.example.com/public";
    index index.html index.htm index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    access_log off;
    error_log  /var/log/nginx/sso.example.com-error.log error;
    sendfile off;
    client_max_body_size 100m;
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass  php81:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }
    location ~ /\.ht {
        deny all;
    }
}

宿主机 hosts 配置:

127.0.0.1 sso.example.com
127.0.0.1 app.example.com


php-fpm 的 docker image 获取链接:

作者在官方 image 的基础上补充了一些开发必须扩展,然后 build 的 image

包含 PHP7.4、PHP8.0、PHP8.1、PHP8.2

MacBook Intel 芯片 docker PHP images :

https://hub.docker.com/r/bai615/amd64-php/tags

MacBook M1 芯片 docker PHP images :

https://hub.docker.com/r/bai615/arm64-php/tags

好用的第三方老版本 PHP

包含 PHP5.3、PHP5.4、PHP5.5、PHP5.6、PHP7.0、PHP7.1、PHP7.2、PHP7.3

https://hub.docker.com/r/leleos/php-fpm/tags


总结

docker开发环境:

可以任意切换软件版本(PHP,MySQL,Nginx 等),与测试环境或者生产环境保持一致。


homestead开发环境:

需要基于vgrant,依赖 vbox 或者 wmware,目前对M1支持还不够友好。


基于brew 软件管理的开发环境:

brew方式安装、管理软件(PHP,MySQL,Nginx 等)。

当 brew 版本升级时,可能会影响已安装软件出现不可预知问题。

如下:

1、携带底层依赖同步升级,不再支持低版本 PHP 运行(如,PHP5.6 及以下版本不能运行)。

2、软件默认安装路径变更,依赖原路径的软件不能运行。

brew 3.x 软件默认安装路径 /opt/homebrew/bin/

brew 4.x 软件默认安装路径 /usr/local/bin/

3、PHP,MySQL,Nginx 等版本切换不够灵活。

相关文章