首先感謝社區,作者從本社區汲取了許多技術營養。現分享作者基於docker的PHP開發環境配置方案,希望能為小夥伴們在搭建PHP開發環境上帶來想法上的參考。
專案集背景
laravel版本不同對PHP的版本要求不同。
如果遇到同時調試多個版本項目,且使用docker環境進行開發。具體場景如下(舉例):
認證系統基於laravel6,PHP運行版本7.2。
應用系統基於laravel9,PHP運行版本8.1。
應用程式需要跳轉認證系統進行統一登入。在認證通過後,攜帶臨時ticket參數code回跳應用程式。套用拿到code參數後,請求認證系統RPC服務取得使用者詳細資料。
目錄結構參考:
./ ├── 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/...
hub.docker.com/r/bai615/arm64-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等版本切換不夠靈活。
以上是MacBook下laravel多版本docker開發環境配置方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!