基于ubuntu制作PHP-FPM镜像

因工作需要,需将php-fpm放到docker里去,这里走了很多弯路,特记录如下。

一、基础镜像的选择

试了php的官方镜像,alpine的,小是小,但是我需要安装redis,amqp,memcahced,swoole等扩展,这时就不太友好了,要安装很多的运行库才能安装这些扩展,安装过程非常累人,经历数十次的失败,总算成功。不同版本的官方镜像大多如此,如果你能创建成功,那就用它。我没用它,因为太TM烦了。

二、laravel的官方镜像

其实是不存在的。都是第三方提供,比如 sail,这个做为开发环境那是爽的飞起。生产环境部署嘛,差点意思。也可能是我没怎么研究,如果你喜欢,用它也行。

三、自己从头做一个

我就是从头做了一个,现记录如下。

首先创建Dockerfile文件:

主要是为了laravel项目,所以额外添加了几个PHP扩展。

bash 复制代码
# 使用官方的Ubuntu 24.04镜像作为基础镜像
FROM ubuntu:24.04

# 设置环境变量以避免交互式配置工具
ENV DEBIAN_FRONTEND=noninteractive

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

# 更新包列表并安装必要的软件包
RUN apt-get update && \
    apt-get install -y software-properties-common ca-certificates supervisor && \
    add-apt-repository ppa:ondrej/php && \
    apt-get update && \
    apt-get install -y \
        php8.3 \
        php8.3-cli \
        php8.3-fpm \
        php8.3-bcmath \
        php8.3-soap \
        php8.3-intl \
        php8.3-readline \
        php8.3-ldap \
        php8.3-msgpack \        
        php8.3-igbinary \
        php8.3-mysql \
        php8.3-pgsql \
        php8.3-gd \
        php8.3-imagick \
        php8.3-curl \
        php8.3-mbstring \
        php8.3-xml \
        php8.3-zip \
        php8.3-redis \
        php8.3-memcached \
        php8.3-amqp \
        php8.3-swoole \
        git \
        unzip \
        curl \
    &&  curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
    && apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 确保目录存在
RUN mkdir -p /run/php \
    && chown -R www-data:www-data /run/php

# 设置工作目录
WORKDIR /var/www/html

# 复制现有的应用代码到容器中(如果你有现成的Laravel项目)
#COPY . .

# 安装Laravel项目依赖
#RUN composer install

# 设置权限
RUN chown -R www-data:www-data /var/www/html

# 配置php-fpm监听所有IP
RUN sed -i "s/listen =.*/listen = 0.0.0.0:9000/" /etc/php/8.3/fpm/pool.d/www.conf

# 配置 Supervisor
COPY supervisord.conf /etc/supervisord.conf

# 暴露默认的PHP-FPM端口
EXPOSE 9000

# 启动PHP-FPM服务
#CMD ["php-fpm8.3"]

# 启动 Supervisor
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

这里加了supervisor,用来守护php-fpm进程。

supervisord.conf内容如下:

bash 复制代码
[supervisord]
nodaemon=true
logfile=/var/log/php/supervisord.log
pidfile=/run/supervisord.pid

[program:php-fpm]
command=/usr/sbin/php-fpm8.3 --nodaemonize --fpm-config /etc/php/8.3/fpm/php-fpm.conf
autostart=true
autorestart=true
stdout_logfile=/var/log/php/php-fpm.stdout.log
stderr_logfile=/var/log/php/php-fpm.stderr.log

网上文章都是直接启动php-fpm,我是没试成功过。所以这里加了supervisor来管理进程。

编译

bash 复制代码
docker build -t my-php:8.3 .

启动容器

bash 复制代码
docker run -itd --name=myapp -v /var/www/myapi:/var/www/html -v /data/log/myapp:/var/log/nginx -p 9001:9000 my-php:8.3

如果不报错,容器则运行成功。

--未完-待续--

相关推荐
L_09073 分钟前
【C++】C++11 新特性
开发语言·c++
方也_arkling6 分钟前
【Java-Day15】API篇-ArrayList集合
java·开发语言
我是一颗柠檬9 分钟前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
Fanfanaas11 分钟前
C++ 继承
java·开发语言·jvm·c++·学习·算法
zzqssliu16 分钟前
taocarts 跨境独立站 SEO 优化实践(多语言 + 反向海淘场景)
java·javascript·php
在繁华处24 分钟前
Java从零到熟练(十一):Spring框架入门
java·开发语言·spring
十五年专注C++开发26 分钟前
cereal 库:C++ 序列化的轻量之选
开发语言·c++·序列化·反序列化·cereal
星卯教育tony1 小时前
2026年全国青少年信息素养大赛主题应用 数字守艺人 丝路新城 星火征程 智传民韵 c++ python scratch 所有真题免费分享
开发语言·c++
z落落1 小时前
C# 继承:父子构造函数 + base 关键字 +五大访问修饰符(同项目+跨项目 全覆盖)
开发语言·c#
夜月yeyue1 小时前
KCP 与 UDP 可靠传输
linux·网络·单片机·网络协议·udp·php