教你如何做出自己想要的PHP Docker鏡像

之前有片文章講過如何通過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鏡像安裝上常用的pdopdo_mysqlmcrypt這些擴展。

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安裝了PHPredis還有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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章