Dockerfile示例:PHP-FPM & nginx

PHP-FPM + nginx 方式要比Apache方式部署PHP更复杂一些。

原因是,需要同时运行两个进程 php-fpm 和 nginx,而Docker容器要尽量使用单进程容器,这样便于容器管理和故障恢复。

所以,需要 php-fpm 和 nginx 分别运行于不同的容器中,但是 php-fpm 和 nginx 又同时需要访问项目文件 *.php 。那么我们就有了两种方案:

  1. 分别打包两个镜像,将项目文件同时拷贝到 php-fpm 和 nginx 的镜像中。
  2. 打包一个镜像,镜像内安装 php-fpm 和 nginx,但是运行时,启动两个容器,两个容器分别执行不同的程序。

我们采用第二种方案:

# 基于 php-fpm 镜像
FROM php:7.0-fpm

# 安装 nginx,并根据需要安装PHP扩展
RUN apt-get update && apt-get install -y \
        nginx \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

# 拷贝项目源码到镜像中
COPY src/ /var/www/html/

# 拷贝nginx配置
COPY site.conf /etc/nginx/sites-enabled/

nginx 配置内容参考:

server{
    location ~ /.php$ {
        root  /var/www/html/;
        fastcgi_pass http://php-fpm:9000; 
        fastcgi_index index.php
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

注意在 fastcgi_pass http://php-fpm:9000; 中,指定了 php-fpm 地址,而不像平时我们使用的 fastcgi_pass http://127.0.0.1:9000;,原因是nginx启动后会和php-fpm 处于不同的容器中,其IP地址是不一样的,所以不能使用 127.0.0.1

然后,使用脉冲云的部署管理,建立一个应用,起名叫 php-fpm,并开放服务端口映射 9000,这样其他应用就可以通过 http://php-fpm:9000 访问到php-fpm服务。

最后再建立一个应用,起名叫 nginx ,镜像用同一个镜像,但是启动命令设置为 nginx -g "daemon off;";

这样就实现了 PHP-FPM + nginx,并且是单个镜像实现的简单容器。

results matching ""

    No results matching ""