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

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

--未完-待续--

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端