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