创建Nginx+PHP的Docker镜像

1、相关说明

  1. 该镜像基于Centos8.3;
  2. Nginx与PHP均为官网下载源码编译安装;
  3. Nginx配置目录:/usr/local/nginx/conf 文件目录:/usr/local/nginx/html
  4. PHP配置目录:/usr/local/etc/
  5. 已做好的镜像地址:https://hub.docker.com/r/yusian/nginx1.20-php7.4

2、安装步骤

2.0 基础环境

docker镜像市场搜索cetnos,选择官方最新版本

[root@centos ~]# docker search centos

启动该镜像一个实例

[root@centos ~]# docker run -itd centos

进入该实例

[root@centos ~]# docker exec -it 5f4263abbcb7 bash

2.1、Nginx安装

Nginx安装相对比较简单

  • 下载源码:https://nginx.org/
    [root@5f4263abbcb7 src]# wget https://nginx.org/download/nginx-1.20.0.tar.gz
    

    如果提示没有wget命令,则先安装wget,后面会多次出现类似提示,都使用yum工具安装

    [root@5f4263abbcb7 src]# yum install -y wget
    
  • 解压:
    [root@5f4263abbcb7 src]# tar -zxf nginx-1.20.0.tar.gz
    
  • 安装gcc及make工具
    [root@5f4263abbcb7 src]# yum install -y gcc-c++ make
    
  • 进入源码目录,配置源码,加带ssl模块
    [root@5f4263abbcb7 nginx-1.20.0]# ./configure --with-http_stub_status_module --with-http_ssl_module 
    
  • 下载下关依赖

    在configure过程当中会出现类似checking for PCRE library ... not found的报错信息,说明信息中提到的依赖本机没有安装,上面有提到过,类似这种提示都可以通过yum包管理工具进行安装修复。这里有一个技巧,我们实际安装的依赖需要在提示的xxx库后面带-devel

    比如说checking for PCRE library ... not found,表明没有PCRE库,那么安装时装的是pcre-devel库;这是他对应的开发库,其他的类似。

    [root@5f4263abbcb7 nginx-1.20.0]# yum install -y pcre-devel
    

    安装完成后再configure一下,还会有报错,就继续完善安装,直到没有报错为止。

    我这里安装的时候,相关的依赖有2个,可以一次性先安装好

    [root@5f4263abbcb7 nginx-1.20.0]# yum install -y pcre-devel openssl-devel
    
  • 编译安装
    [root@5f4263abbcb7 nginx-1.20.0]# make && make install
    
  • 安装结束

    默认的安装目录为/usr/local/nginx,也可以在configure的时候指定,但我觉得没有必要,可执行程序是sbin目录下的nginx文件,可以通过添加一个硬链接到/usr/bin目录下方便在任何地方执行nginx命令,不需要配置什么环境变量

    [root@5f4263abbcb7 nginx]# ln /usr/local/nginx/sbin/nginx /usr/bin/nginx
    

    启动

    [root@5f4263abbcb7 nginx]# nginx
    

    修改配置文件:

    [root@5f4263abbcb7 nginx]# vi conf/nginx.conf
    

2.2、安装php

php安装的方法思路与Nginx大致一样,也是官网下载源码,然后configure再就是make编译

  • 官网:https://www.php.net 目前最新版本是8.0.3,但是discuz似乎目录还不支持8.0版本,所以上述镜像安装的是7.4版本;

  • discuz与wordpress需要的php模块比较多,我总结了一下,以下几个是必须安装的,上述镜像安装的就是这些,如果有需要可以再扩展,扩展的方法就中重新configure然后make编译安装

    [root@5f4263abbcb7 php-7.4.16]#./configure \
    --enable-fpm \
    --enable-mysqlnd \
    --enable-mbstring \
    --enable-gd \
    --enable-exif \
    --with-mysqli=mysqlnd \
    --with-curl \
    --with-zip \
    --with-openssl
    
  • 同样的道理,遇到有缺失的库就通过yum包管理工具补全,但有一个例外:onigurumayum包管理工具中有oniguruma,但没有对应的开发库oniguruma-devel,解决方法参考:https://www.yusian.com/blog/?p=2010

  • PHP编译时间会比较久一点,我2核4G的服务器需要10~20分钟左右,安装完成后默认的配置目录为/usr/local/etc/

  • 初始化配置

    /usr/local/etc/目录下,将默认的php-fpm.conf文件拷贝一份使用即可

    [root@5f4263abbcb7 etc]# cp php-fpm.conf.default php-fpm.conf
    

    该配置文件中的最后一行:include=NONE/etc/php-fpm.d/*.conf,将NONE/去掉,即改成include=etc/php-fpm.d/*.conf

    再进入php-fpm.d目录中拷贝www.conf文件

    [root@5f4263abbcb7 php-fpm.d]# cp www.conf.default www.conf
    

    该配置文件中间,大概第一页的最后一行listen = 127.0.0.1:9000,表明php只对本机提供服务,如果外部机器需要使用,将127.0.0.1:9000改成0.0.0.0:9000

  • 启动php

    [root@5f4263abbcb7 etc]# php-fpm
    

3、基本使用

如果直接拉取上述我已经做好的镜像docker pull yusian/nginx1.20-php7.4,可以直接创建容器,基本步骤如下

  1. 创建卷宗:
    [root@yusian ~]# docker volume create www
    

    卷宗对应的本地物理路径为:/var/lib/docker/volumes/www/_data,可将网站的文件拷贝到该目录下;

  2. 启动容器:

    [root@yusian ~]# docker run -itd -v www:/usr/local/nginx/html -p 443:443 -p 80:80 yusian/nginx1.20-php7.4
    

    容器启动后,到对应的配置目录下修改配置文件,主要是Nginx的配置文件,php基本上不需要额外配置;

  3. 启动服务

  • 启动Nginx:nginx
  • 启动PHP:php-fpm

Leave a Reply