教你如何做出自己想要的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。

相关推荐