之前有片文章講過如何通過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。