基于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

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

--未完-待续--

相关推荐
Elena_Lucky_baby11 分钟前
在Vue3项目中使用svg-sprite-loader
开发语言·前端·javascript
土豆凌凌七20 分钟前
GO随想:GO的并发等待
开发语言·后端·golang
AI向前看29 分钟前
C语言的数据结构
开发语言·后端·golang
Rossy Yan31 分钟前
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
开发语言·数据结构·c++·算法·查找·头歌实践教学平台·合集
架构文摘JGWZ36 分钟前
一键完成!!网页打包成桌面应用
开发语言·学习·开源软件·工具
快乐非自愿36 分钟前
一文解秘Rust如何与Java互操作
java·开发语言·rust
SomeB1oody38 分钟前
【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期
开发语言·后端·rust
Source.Liu43 分钟前
【学Rust开发CAD】1 环境搭建
开发语言·rust
文浩(楠搏万)1 小时前
Java内存管理:不可达对象分析与内存泄漏优化技巧 Eclipse Memory Analyzer
java·开发语言·缓存·eclipse·内存泄漏·不可达对象·对象分析
绛洞花主敏明1 小时前
我的nvim的init.lua配置
开发语言·junit·lua