FrankenPHP Docker 镜像基于 官方 PHP 镜像。为流行的架构提供了 Debian 和 Alpine Linux 版本。建议使用 Debian 版本。
提供了 PHP 8.2 和 PHP 8.3 的变体。
标签遵循这种模式:dunglas/frankenphp/<frankenphp-version>-php<php-version>-<os>
<frankenphp-version>
和<php-version>
分别代表 FrankenPHP 和 PHP 的主版本、次版本或补丁版本。<os>
是bookworm
(Debian Bookworm)或alpine
(最新稳定版的 Alpine)。
浏览标签。
如何使用这些镜像
在您的项目中创建一个 Dockerfile
:
FROM dunglas/frankenphp
COPY . /app/public
然后,运行以下命令构建并运行 Docker 镜像:
docker build -t my-php-app .
docker run -it --rm --name my-running-app my-php-app
如何安装更多 PHP 扩展
基础镜像中提供了 docker-php-extension-installer
脚本。添加额外的 PHP 扩展非常简单:
FROM dunglas/frankenphp
# 在此处添加额外的扩展:
RUN install-php-extensions \
pdo_mysql \
gd \
intl \
zip \
opcache
如何安装更多 Caddy 模块
FrankenPHP 建立在 Caddy 之上,所有 Caddy 模块 都可以与 FrankenPHP 一起使用。
安装自定义 Caddy 模块的最简单方法是使用 xcaddy:
FROM dunglas/frankenphp:latest-builder AS builder
# 将 xcaddy 复制到构建镜像中
COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy
# 必须启用 CGO 才能构建 FrankenPHP
ENV CGO_ENABLED=1 XCADDY_SETCAP=1 XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'"
RUN xcaddy build \
--output /usr/local/bin/frankenphp \
--with github.com/dunglas/frankenphp=./ \
--with github.com/dunglas/frankenphp/caddy=./caddy/ \
# Mercure 和 Vulcain 包含在官方构建中,但可以自由移除它们
--with github.com/dunglas/caddy-cbrotli \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy
# 在此处添加额外的 Caddy 模块
FROM dunglas/frankenphp AS runner
# 用包含自定义模块的二进制文件替换官方二进制文件
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
FrankenPHP 提供的 builder
镜像包含了 libphp
的编译版本。构建镜像 为所有版本的 FrankenPHP 和 PHP 提供,包括 Debian 和 Alpine。
提示
如果你使用 Alpine Linux 和 Symfony,可能需要增加默认栈大小。
默认启用工作模式
设置 FRANKENPHP_CONFIG
环境变量以使用工作脚本启动 FrankenPHP:
FROM dunglas/frankenphp
# ...
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
在开发中使用卷
为了更容易地使用 FrankenPHP 进行开发,将包含应用源代码的宿主机目录作为卷挂载到 Docker 容器中:
docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app
![TIP]
--tty
选项允许有美观的人类可读日志而不是 JSON 日志。
使用 Docker Compose:
# compose.yaml
services:
php:
image: dunglas/frankenphp
# 如果你想使用自定义 Dockerfile,请取消下面一行的注释
#build: .
# 如果你想在生产环境中运行,请取消下面一行的注释
# restart: always
ports:
- "80:80" # HTTP
- "443:443" # HTTPS
- "443:443/udp" # HTTP/3
volumes:
- ./:/app/public
- caddy_data:/data
- caddy_config:/config
# 在生产中注释下面一行,它允许在开发中有美观的人类可读日志
tty: true
# Caddy 证书和配置所需的卷
volumes:
caddy_data:
caddy_config:
作为非 root 用户运行
FrankenPHP 可以在 Docker 中作为非 root 用户运行。
这是一个示例 Dockerfile
这样做:
FROM dunglas/frankenphp
ARG USER=www-data
RUN \
# 对于基于 Alpine 的发行版使用 "adduser -D ${USER}"
useradd -D ${USER}; \
# 增加绑定端口 80 和 443 的额外能力
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
# 给 /data/caddy 和 /config/caddy 写访问权限
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
无需任何能力运行
即使以无根用户身份运行,FrankenPHP 也需要 CAP_NET_BIND_SERVICE
能力才能在特权端口(80 和 443)上绑定 web 服务器。
如果你将 FrankenPHP 暴露在非特权端口(1024 及以上),可以作为非 root 用户运行 web 服务器,而且不需要任何能力:
FROM dunglas/frankenphp
ARG USER=www-data
RUN \
# 对于基于 Alpine 的发行版使用 "adduser -D ${USER}"
useradd -D ${USER}; \
# 移除默认能力
setcap -r /usr/local/bin/frankenphp; \
# 给 /data/caddy 和 /config/caddy 写访问权限
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
接下来,设置 SERVER_NAME
环境变量以使用非特权端口。示例::8000
更新
Docker 镜像构建:
- 当标记新版本时
- 如果官方 PHP 镜像有新版本,则在协调世界时每天凌晨 4 点
开发版本
开发版本可在 dunglas/frankenphp-dev
Docker 仓库中获得。每次将提交推送到 GitHub 仓库的主分支时,都会触发新的构建。
latest
标签指向 main
分支的头部。还提供形式为 sha-<git-commit-hash>
的标签。