在这个教程中,我们将学习如何使用 Docker Compose 在单个服务器上部署 PHP 应用程序。
如果您使用的是 Symfony,建议阅读 Symfony Docker 项目(使用 FrankenPHP)的 “部署到生产环境” 文档条目。
如果您使用的是 API Platform(也使用 FrankenPHP),请参考框架的 部署文档。
准备您的应用程序
首先,在 PHP 项目的根目录中创建一个 Dockerfile
:
FROM dunglas/frankenphp
# 确保将 "your-domain-name.example.com" 替换为您的域名
ENV SERVER_NAME=your-domain-name.example.com
# 如果您想禁用 HTTPS,请使用此值:
# ENV SERVER_NAME=:80
# 启用 PHP 生产设置
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# 将项目的 PHP 文件复制到公共目录
COPY . /app/public
# 如果您使用 Symfony 或 Laravel,您需要复制整个项目:
# COPY . /app
有关更多详细信息和选项,请参考 “构建自定义 Docker 镜像”,并了解如何自定义配置、安装 PHP 扩展和 Caddy 模块。
如果您的项目使用 Composer,请确保将其包含在 Docker 镜像中,并安装您的依赖项。
然后,添加一个 compose.yaml
文件:
services:
php:
image: dunglas/frankenphp
restart: always
ports:
- "80:80" # HTTP
- "443:443" # HTTPS
- "443:443/udp" # HTTP/3
volumes:
- caddy_data:/data
- caddy_config:/config
# Caddy 证书和配置所需的卷
volumes:
caddy_data:
caddy_config:
注意
上面的示例适用于生产用途。在开发过程中,您可能想要使用卷、不同的 PHP 配置以及不同的
SERVER_NAME
环境变量值。可以查看 Symfony Docker 项目(使用 FrankenPHP)以获取使用多阶段镜像、Composer、额外 PHP 扩展等的更高级示例。
最后,如果您使用 Git,请提交这些文件并推送。
准备服务器
要将应用程序部署到生产环境,您需要一个服务器。在本教程中,我们将使用 DigitalOcean 提供的虚拟机,但任何 Linux 服务器都可以工作。如果您已经有一个安装了 Docker 的 Linux 服务器,您可以跳到 下一节。
否则,使用 这个联盟链接 获取 $200 的免费信用,创建一个账户,然后点击“创建一个 Droplet”。然后,在“选择一个镜像”部分下的“Marketplace”标签页中点击,并搜索名为“Docker”的应用程序。这将配置一个 Ubuntu 服务器,预装了最新版本的 Docker 和 Docker Compose!
对于测试目的,最便宜的计划就足够了。对于真正的生产使用,您可能想要选择“通用”部分中的一个计划以满足您的需求。
您可以保留其他设置的默认值,或者根据需要进行调整。不要忘记添加您的 SSH 密钥或创建一个密码,然后按“完成并创建”按钮。
然后,等待几秒钟,等待您的 Droplet 配置完成。当您的 Droplet 准备好后,使用 SSH 连接:
ssh root@<droplet-ip>
配置域名
在大多数情况下,您会想要将域名与您的网站关联起来。如果您还没有域名,您需要通过注册商购买一个。
然后为您的域名创建一个指向服务器 IP 地址的 A
记录类型:
your-domain-name.example.com. IN A 207.154.233.113
使用 DigitalOcean Domains 服务的示例(“网络” > “域名”):
注意
FrankenPHP 默认使用的 Let’s Encrypt 服务不支持使用裸 IP 地址。使用域名是使用 Let’s Encrypt 的强制性要求。
部署
使用 git clone
、scp
或任何其他适合您需求的工具将您的项目复制到服务器上。如果您使用 GitHub,您可能想使用 部署密钥。部署密钥也得到 GitLab 的支持。
使用 Git 的示例:
git clone git@github.com:<username>/<project-name>.git
进入包含您的项目 (<project-name>
) 的目录,并以生产模式启动应用程序:
docker compose up -d --wait
您的服务器正在运行,并且已为您自动生成 HTTPS 证书。转到 https://your-domain-name.example.com
并享受吧!
注意
Docker 可能有缓存层,请确保每次部署都有正确的构建或使用
--no-cache
选项重新构建您的项目,以避免缓存问题。
在多个节点上部署
如果您想在一组机器上部署应用程序,您可以使用 Docker Swarm,它与提供的 Compose 文件兼容。要在 Kubernetes 上部署,请查看 API Platform 提供的 Helm 图表,它使用 FrankenPHP。