以前有片文章講過如何經過Docker來構建Laravel的開發環境,其實變通一下就可以在本地電腦上用Docker運行任何PHP項目,讓任何PHP項目都能運行在Docker環境中主要是須要根據PHP項目的依賴製做PHP鏡像的Dockerfile。這篇文章就主要講一下如何根據需求製做PHP的Docker鏡像文件。php
首先須要根據你的PHP項目對PHP的要求找到基礎鏡像,而後再在基礎鏡像的基礎上按需安裝PHP的擴展。在Dockerfile中使用FROM
命令指定基礎鏡像。mysql
From <image>
FROM
指定構建鏡像的基礎源鏡像,若是本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下來。FROM
必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從 FROM
語句開始。這裏咱們打算製做一個PHP7.2的包括FPM的定製化鏡像,因此首先在Dockerfile中指定基礎鏡像:redis
FROM php:7.2-fpm
定製PHP鏡像的主要工做就是安裝各類PHP擴展,在Dockerfile中PHP鏡像安裝擴展有三種方法,每種方法都有它特定的使用場景,下面依次來講。sql
在DockerHub中提供了一些官方的PHP擴展,能夠經過docker-php-ext-install
腳本命令在Dockerfile中列出要安裝的擴展,下面讓咱們的PHP鏡像安裝上經常使用的pdo
、pdo_mysql
、mcrypt
這些擴展。docker
FROM php:7.2-fpm RUN docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath
若是你須要對擴展指定一些自定義的編譯參數的話,docker提供了另一個有用的腳本docker-php-ext-configure
來傳遞編譯參數(通常狀況下用不到)。segmentfault
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
DockerHub上只是提供了一部分PHP的擴展,安裝這些之外的擴展仍然須要PECL
, 在Docker鏡像中使用pecl install
下載、編譯、安裝擴展而後使用docker-php-ext-enable
框架
下面使用PECL
安裝了PHP
的redis
還有grpc
擴展。curl
RUN pecl install grpc \ && docker-php-ext-enable grpc \ && pecl install -o -f redis \ && docker-php-ext-enable redis \ && rm -rf /tmp/pear
有些擴展即沒法使用docker-php-ext-install
安裝也沒法經過PECL
安裝,只能經過源碼編譯安裝(PHP擴展型的框架Phalcon就是這樣,不過設置比較複雜,之後再講), 在Docker中一樣可以經過源碼安裝PHP擴展url
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官方教程裏有詳細的講解,感興趣的必定要按照教程的步驟本身實踐一下。.net
如今服務的業務組織裏服務端開發語言主要用Go,PHP更多的是一些老系統、管理後臺或者活動類系統在用,最近兩個月我寫過的PHP代碼數都能數過來,更多的時間仍是在寫Go代碼。因此最近寫的關於PHP類的技術文章也不多,以後有時間了會寫如何在Docker裏安裝和配置Phalcon。