分享MacBook下laravel多版本docker开发环境配置方案

 首先感谢社区,作者从本社区汲取了很多技术营养。现分享作者基于docker的PHP开发环境配置方案,希望能给小伙伴们在搭建PHP开发环境上带来思路上的参考。

项目集背景

laravel版本不同对PHP的版本要求不同。
如果遇到同时调试多个版本项目,且使用docker环境进行开发。具体场景如下(举例):
认证系统基于laravel6,PHP运行版本7.2。
应用系统基于laravel9,PHP运行版本8.1。
应用需要跳转认证系统进行统一登录。在认证通过后,携带临时ticket参数code回跳应用。应用拿到code参数后,请求认证系统RPC服务获取用户详细信息。

Image

目录结构参考:

./
├── 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 :
hub.docker.com/r/bai615/amd64-php/...

MacBook M1芯片 docker PHP images :
hub.docker.com/r/bai615/arm64-php/...

好用的第三方老版本PHP
包含 PHP5.3、PHP5.4、PHP5.5、PHP5.6、PHP7.0、PHP7.1、PHP7.2、PHP7.3
hub.docker.com/r/leleos/php-fpm/ta...

作者的开发体验。

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等版本切换不够灵活。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

laradock

3年前 评论
Image bai615 (楼主) 3年前
Image gznet (作者) 3年前

laravel valet 现在对多版本php支持也挺好的

3年前 评论
Image bai615 (楼主) 3年前

Macbook 上是装Docker Desktop for Mac吗?

3年前 评论
Image bai615 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!