之前有篇文章講過如何通過Docker來構建Laravel的開發環境,其實變通一下就能夠在本地電腦上用Docker執行任何PHP專案,讓任何PHP專案都能執行在Docker環境中主要是需要根據PHP專案的依賴製作PHP映象的Dockerfile。這篇文章就主要講一下如何根據需求製作PHP的Docker映象檔案。
1. 繼承基礎映象
首先需要根據你的PHP專案對PHP的要求找到基礎映象,然後再在基礎映象的基礎上按需安裝PHP的擴充套件。在Dockerfile中使用FROM
命令指定基礎映象。
From <image>
FROM
指定構建映象的基礎源映象,如果本地沒有指定的映象,則會自動從 Docker 的公共庫 pull 映象下來。FROM
必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從FROM
語句開始。
這裡我們打算製作一個PHP7.2的包括FPM的定製化映象,所以首先在Dockerfile中指定基礎映象:
FROM php:7.2-fpm
2. 安裝PHP擴充套件
定製PHP映象的主要工作就是安裝各種PHP擴充套件,在Dockerfile中PHP映象安裝擴充套件有三種方法,每種方法都有它特定的使用場景,下面依次來說。
2.1安裝dockerhub中php官方提供的擴充套件
在DockerHub中提供了一些官方的PHP擴充套件,可以通過docker-php-ext-install
指令碼命令在Dockerfile中列出要安裝的擴充套件,下面讓我們的PHP映象安裝上常用的pdo
、pdo_mysql
、mcrypt
這些擴充套件。
FROM php:7.2-fpm
RUN docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath
如果你需要對擴充套件指定一些自定義的編譯引數的話,docker提供了另外一個有用的指令碼docker-php-ext-configure
來傳遞編譯引數(一般情況下用不到)。
FROM php:7.2-fpm
RUN docker-php-ext-install pdo pdo_mysql mcrypt zip pcntl opcache bcmath\
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
2.2 使用PECL安裝擴充套件
DockerHub上只是提供了一部分PHP的擴充套件,安裝這些以外的擴充套件仍然需要PECL
, 在Docker映象中使用pecl install
下載、編譯、安裝擴充套件然後使用docker-php-ext-enable
下面使用PECL
安裝了PHP
的redis
還有grpc
擴充套件。
RUN pecl install grpc \
&& docker-php-ext-enable grpc \
&& pecl install -o -f redis \
&& docker-php-ext-enable redis \
&& rm -rf /tmp/pear
2.3 原始碼安裝擴充套件
有些擴充套件即無法使用docker-php-ext-install
安裝也無法通過PECL
安裝,只能通過原始碼編譯安裝(PHP擴充套件型的框架Phalcon就是這樣,不過設定比較複雜,以後再講), 在Docker中同樣能夠通過原始碼安裝PHP擴充套件
RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
&& mkdir -p /tmp/xcache \
&& tar -xf xcache.tar.gz -C /tmp/xcache --strip-components=1 \
&& rm xcache.tar.gz \
&& docker-php-ext-configure /tmp/xcache --enable-xcache \
&& docker-php-ext-install /tmp/xcache \
&& rm -r /tmp/xcache
講在最後
文章重點講了一下Docker中怎麼安裝PHP的擴充套件,其實還有其他很多與Docker相關的概念需要了解才能製作出自己需要的映象檔案,好在Docker官方教程裡有詳細的講解,感興趣的一定要按照教程的步驟自己實踐一下。
現在服務的業務組織裡服務端開發語言主要用Go,PHP更多的是一些老系統、管理後臺或者活動類系統在用,最近兩個月我寫過的PHP程式碼數都能數過來,更多的時間還是在寫Go程式碼。所以最近寫的關於PHP類的技術文章也很少,之後有時間了會寫如何在Docker裡安裝和配置Phalcon。