docker 安裝 php-fpm 服務 / 擴展 / 配置

mac 上用 brewphp56 時,由於 openssl1.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/htmlphp docker 鏡像的工做目錄。nginx

-v /home/wwwroot:/var/www/html 的做用是將宿主機的站點目錄掛載到容器上。好比 /home/wwwroot/siteA,在容器中的訪問位置是 /var/www/html/siteAredis

nignx 轉發 php 請求時,會將執行的腳本名 SCRIPT_NAME 和腳本文件名 SCRIPT_FILENAME 轉發給 fpm,然後 fpm 去讀取腳本執行。docker

在使用 fpm 容器時,須要注意 nginx 轉發的 SCRIPT_FILENAME 是不是 fpm 容器中的有效站點路徑,若是 nginxroot 並不能直接映射至 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

phpdocker 鏡像是基於 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/etcphp 容器的配置目錄,裏面自帶了 phpphp-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 安裝更方便
相關文章
相關標籤/搜索