共计 1984 个字符,预计需要花费 5 分钟才能阅读完成。
之前有片文章讲过如何通过 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。