在 mac
上用 brew
裝 php56
時,由於 openssl
是 1.1
版本而致使各類 google
都搞不定的錯誤,太折騰了,如今用 docker
建立一個 php56-fpm
服務容器,nginx
直裝在宿主機上。php
PHP DockerHub 主頁html
# 建立容器 docker run -d \ --name php56-fpm \ -p 9056:9000 \ -v /home/wwwroot:/var/www/html --privileged=true php:5.6-fpm
注意:/var/www/html
是 php docker
鏡像的工做目錄。nginx
-v /home/wwwroot:/var/www/html
的做用是將宿主機的站點目錄掛載到容器上。好比 /home/wwwroot/siteA
,在容器中的訪問位置是 /var/www/html/siteA
。redis
nignx
轉發 php
請求時,會將執行的腳本名 SCRIPT_NAME
和腳本文件名 SCRIPT_FILENAME
轉發給 fpm
,然後 fpm
去讀取腳本執行。docker
在使用 fpm
容器時,須要注意 nginx
轉發的 SCRIPT_FILENAME
是不是 fpm
容器中的有效站點路徑,若是 nginx
的 root
並不能直接映射至 fpm
容器的站點 root
,咱們須要在 php location
中從新定義爲 fpm
容器的站點 root
。這樣 fpm
才能正確的讀取到腳本。ubuntu
即宿主機上的 /home/wwwroot/siteA/public/index.php
要轉爲 /var/www/html/siteA/public/index.php
發送給 fpm
容器,不然會報 File not found
的錯誤。vim
因此 nginx
配置 server
時要注意以下的卷路徑轉換:bash
server { listen 8056; .... # 宿主機的站點根目錄 root /home/wwwroot/siteA/public; location ~* (^[/]*.php)[/|$] { # 容器中的站點根目錄 root /var/www/html/siteA/public; pass_proxy: 127.0.0.1:9056; include fastcgi.conf; } }
不過通常狀況下你們都是 docker nginx + docker php-fpm
,兩個容器都統一映射了站點目錄,就不會有這個問題了。這裏的 nginx
是直接裝在宿主機上才致使 nginx
轉發 php
請求時須要從新定義下站點的根目錄。swoole
# 查看容器是否運行 docker ps # 登錄容器 docker exec -it php56-fpm /bin/bash
php
的 docker
鏡像是基於 ubuntu
咱們可使用 apt-get
安裝須要的工具,好比 vim/vi lrzsz net-tools
之類的。php-fpm
# 在使用 apt-get 安裝一些工具前,須要 update 更新一下源 # 不然會 apt-get E: Unable to locate package apt-get update apt-get install vim
php/pecl
擴展php
擴展即 php
官方擴展,好比 shomp
這種自帶但默認不開啓的擴展。
# 查看自帶了那些擴展 cd /usr/local/php/ext && ls -l # 安裝擴展 dcoker-php-ext-install shmop
pecl
擴展容器中是有安裝 pecl
的,因此直接使用 pecl
安裝便可,注意擴展對 php
版本的支持便可。
docker-php-ext-enable
的主要用途是生成擴展相應的配置文件到 /usr/local/etc/php/conf.d/docker-php-ext-{extName}.ini
方便 php
加載擴展。
# igbinary php5.6 最高版本是 2.0.8 pecl install igbinary-2.0.8 docker-php-ext-enable igbinary # phpredis php5.6 最高版本是 4.3.0 pecl install redis-4.3.0 docker-php-ext-enable redis # swoole php5.6 最高版本是 2.0.11 pcel install swoole-2.0.11 docker-php-ext-enable swoole
php/php-fpm
配置/usr/local/etc
是 php
容器的配置目錄,裏面自帶了 php
及 php-fpm
的配置文件,配置目錄結構以下:
root@aa739592b579:/usr/local# tree etc/ etc/ |-- pear.conf |-- php # php 配置目錄 | |-- conf.d # php 擴展配置 | | |-- docker-php-ext-shmop.ini | |-- php.ini # cp 的 php.ini-development/production | |-- php.ini-development | |-- php.ini-production |-- php-fpm.conf # php-fpm 的配置 自帶的主要是引入 php-fpm.d |-- php-fpm.conf.default # php-fpm 配置本體 同 php-fpm.d/www.conf 一致 |-- php-fpm.d # php-fpm 的擴展配置 |-- docker.conf |-- www.conf # php-fpm 配置本體 模式啊 max/min children 啊都在這裏 |-- zz-docker.conf
你可映射宿主機的配置目錄到容器的 /usr/local/etc
,但要注意宿主機上的配置目錄與容器現有的要保持一致,或者直接在容器裏編輯配置文件。按 docker
的理念咱們應該在宿主機上維護一份配置文件映射到容器的配置目錄上,這樣才能發揮出 docker
容器的複用性。
映射宿主機的 php 配置文件到容器
-v /opt/docker/conf/php/php.ini:/usr/local/etc/php/php.ini -v /opt/docker/conf/php/php-fpm.ini:/usr/local/etc/php-fpm.d/www/conf
一、File not found
nginx
指定的站點根目錄
沒法直接映射給fpm
容器,在location
中從新指定fpm
容器的站點根目錄
。
二、apt-get E: Unable to locate package
執行apt-get update
刷新一下源便可。
三、容器的相關約定 工做目錄:/var/www/html 建議將宿主機的站點目錄映射至此目錄 配置目錄:/usr/local/etc 注意配置目錄結構 php 擴展目錄:/usr/local/php/ext 能夠查看 php 自帶的擴展包 使用 docker-php-ext-install 安裝更方便