FrankenPHP项目Docker镜像使用完全指南
frankenphp The modern PHP app server 项目地址: https://gitcode.com/gh_mirrors/fr/frankenphp
前言
FrankenPHP是一个基于Caddy服务器的PHP运行时环境,它结合了PHP和Caddy的优势,为开发者提供了高性能的Web服务解决方案。本文将全面介绍如何使用Docker来部署和管理FrankenPHP应用。
FrankenPHP Docker镜像概述
FrankenPHP官方提供了基于Debian和Alpine Linux的Docker镜像,这些镜像又基于官方的PHP镜像构建而成。对于大多数用户,我们推荐使用Debian变体,因为它提供了更好的兼容性和更丰富的功能支持。
镜像标签命名规则
FrankenPHP的Docker镜像标签遵循以下命名模式:
dunglas/frankenphp:<frankenphp-version>-php<php-version>-<os>
其中:
<frankenphp-version>
:FrankenPHP的版本号,可以是主版本(如1)、次版本(如1.2)或补丁版本(如1.2.3)<php-version>
:PHP的版本号,如8.2、8.3等<os>
:操作系统类型,bookworm
表示Debian Bookworm,alpine
表示Alpine Linux
基础使用教程
创建Dockerfile
要使用FrankenPHP Docker镜像,首先需要在项目根目录创建一个Dockerfile:
FROM dunglas/frankenphp
COPY . /app/public
这个简单的Dockerfile会:
- 基于官方FrankenPHP镜像
- 将当前目录内容复制到容器的/app/public目录
构建和运行容器
构建和运行容器的命令如下:
docker build -t my-php-app .
docker run -it --rm --name my-running-app my-php-app
扩展功能配置
安装额外PHP扩展
FrankenPHP镜像内置了docker-php-extension-installer
脚本,可以方便地安装额外PHP扩展:
FROM dunglas/frankenphp
RUN install-php-extensions \
pdo_mysql \
gd \
intl \
zip \
opcache
安装自定义Caddy模块
FrankenPHP基于Caddy构建,因此可以添加任何Caddy模块。使用xcaddy工具可以方便地构建包含自定义模块的FrankenPHP:
FROM dunglas/frankenphp:builder AS builder
COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy
RUN CGO_ENABLED=1 \
XCADDY_SETCAP=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS=$(php-config --includes) \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
xcaddy build \
--output /usr/local/bin/frankenphp \
--with github.com/dunglas/frankenphp=./ \
--with github.com/dunglas/frankenphp/caddy=./caddy/ \
--with github.com/dunglas/caddy-cbrotli \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy
FROM dunglas/frankenphp AS runner
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
高级配置技巧
启用Worker模式
通过设置环境变量可以启用Worker模式:
FROM dunglas/frankenphp
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
开发环境使用卷
在开发环境中,可以使用卷挂载本地代码:
docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app
使用Docker Compose
推荐使用Docker Compose管理服务:
services:
php:
image: dunglas/frankenphp
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./:/app/public
- caddy_data:/data
- caddy_config:/config
tty: true
volumes:
caddy_data:
caddy_config:
安全最佳实践
以非root用户运行
提高安全性,可以配置容器以非root用户运行:
FROM dunglas/frankenphp
ARG USER=appuser
RUN useradd ${USER}; \
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
无特权模式运行
如果使用非特权端口(≥1024),可以完全移除权限要求:
FROM dunglas/frankenphp
ARG USER=appuser
RUN useradd ${USER}; \
setcap -r /usr/local/bin/frankenphp; \
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
然后设置SERVER_NAME
环境变量为:8000
等非特权端口。
镜像更新策略
FrankenPHP Docker镜像会在以下情况下自动更新:
- 有新版本发布时
- 每天UTC时间4点检查官方PHP镜像更新
开发版本使用
对于需要最新功能的开发者,可以使用开发版镜像,这些镜像会在每次代码提交后自动构建。
总结
本文全面介绍了FrankenPHP Docker镜像的使用方法,从基础配置到高级功能,帮助开发者充分利用Docker部署PHP应用。无论是简单的PHP网站还是复杂的微服务架构,FrankenPHP都能提供稳定高效的运行环境。
frankenphp The modern PHP app server 项目地址: https://gitcode.com/gh_mirrors/fr/frankenphp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考