Docker
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条评论