docker构建php8.2-nginx镜像

docker构建php8.2-nginx镜像

最近有个业务需要用到php8.2版本,之前都是用自己构建的镜像,由于这个版本没有,所以打算手动撸一个,在这里跟大家介绍分享。

一、创建Nginx配置文件

我们在当前构建目录下创建一个文件default.conf,内容如下

server {
  listen 80;
  server_name localhost;

  root /var/www/html;
  index index.html index.htm index.nginx-debian.html;

  location / {
    try_files $uri $uri/ =404;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

二、创建测试文件

同样在当前构建目录下创建一个文件index.php,内容如下

<?php
phpinfo();

三、创建启动命令文件

同样在当前构建目录下创建一个文件run.sh,我们让镜像默认启动PHP、Nginx、Crond(定时任务),这三个服务,这里说明下,为了以后我们可以将定时任务直接放到容器里跑,不用在宿主机跑,这里我们让crond默认启动,内容如下

#!/usr/bin/env sh
set -e

# 启动定时任务
crond

# 同时启动 PHP-FPM 和 Nginx 
php-fpm &
nginx -g 'daemon off;' &

# 只要其中任意一个进程退出了,整个容器就停止,方便 Docker 识别状态并自动重启
wait -n
exit 1

四、创建构造文件

我们在当前构建目录下创建文件Dockerfile,内容如下

# Version 2.2 (包含 Swoole + 图片表格增强版)
FROM php:8.2-fpm-alpine3.19

# 维护者信息
LABEL MAINTAINER="hzx790254812@gmail.com"

# 设置时区
ENV TZ="Asia/Shanghai"
RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata

# 创建 www 用户和组
RUN addgroup -g 1000 -S www \
    && adduser -s /sbin/nologin -S -D -u 1000 -G www www

# 1. 安装基础依赖、Nginx、Git 以及图片/表格/Swoole 底层所需的 C 语言库
# 额外增加了 openssl-dev 和 nghttp2-dev 以确保 Swoole 支持 HTTPS(SSL) 和 HTTP2 协议
RUN apk update && apk add --no-cache \
    nginx \
    git \
    vim \
    bash \
    curl \
    libstdc++ \
    libzip-dev \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    libwebp-dev \
    libavif-dev \
    imagemagick-dev \
    oniguruma-dev \
    zlib-dev \
    openssl-dev \
    nghttp2-dev

# 2. 编译安装 PHP 核心扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-avif \
    && docker-php-ext-install -j$(nproc) \
    pdo_mysql \
    mysqli \
    opcache \
    bcmath \
    zip \
    gd \
    fileinfo \
    pcntl

# 3. 使用官方推荐的安装器一键安装第三方扩展 (这里已经明确加上了 swoole)
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
RUN install-php-extensions redis imagick xlswriter swoole

# 4. 规范化安装最新版 Composer 2.x
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 5. Nginx & 项目配置文件注入
COPY default.conf /etc/nginx/http.d/
COPY index.php /var/www/html

# 修改 PHP 生产环境配置
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
    && mkdir -p /run/nginx/

# 6. 启动脚本配置
COPY run.sh /run.sh
RUN chmod +x /run.sh

ENTRYPOINT ["/run.sh"]
EXPOSE 80

五、构建镜像

我们通过以下命令进行构建

docker build -t hongzhuangxian/php8.2_nginx .

等待他构建完成之后,我们就拥有一个8.2+nginx的镜像。

六、部署使用

前面我们成功构建了8.2+nginx镜像,下面我们介绍如何使用

我们先创建一个conf.d目录,目录下创建一个文件default.conf,内容如下

server {
    listen       80;
    server_name  localhost;
    root         /var/www/html/public; # 把 root 提到最外层,规范化
    index        index.php index.html index.htm;

    location / {
        # 优雅的 Laravel 伪静态重写,不要用 if !-e, try_files 性能更好且不容易出错
        try_files $uri $uri/ /index.php?$query_string;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 正确解析 PHP
    location ~ \.php$ {
        # 一体化镜像内,PHP-FPM 就在本地,用 127.0.0.1 绝对正确
        fastcgi_pass   127.0.0.1:9000; 
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

然后在根目录下创建一个docker-compose.yml文件,内容如下

version: "3"
services:
  serialNumber:
    image: php8.2-nginx
    container_name: serial_number_compose
    restart: always
    ports:
    - 9888:80
    volumes:
    - /D/code/serial_number/:/var/www/html/
    - /D/code/serial_number/conf.d:/etc/nginx/http.d/

下面两个映射,一个是映射项目,另一个是映射nginx配置,然后我们执行命令就可以启动容器

docker-compose up -d

这样就成功部署项目。

0条评论

发表评论