在这个教程中,我们将学习如何使用 Docker Compose 在单个服务器上部署 PHP 应用程序。

如果您使用的是 Symfony,建议阅读 Symfony Docker 项目(使用 FrankenPHP)的 “部署到生产环境” 文档条目。

如果您使用的是 API Platform(也使用 FrankenPHP),请参考框架的 部署文档

准备您的应用程序

首先,在 PHP 项目的根目录中创建一个 Dockerfile

  1. FROM dunglas/frankenphp
  2. # 确保将 "your-domain-name.example.com" 替换为您的域名
  3. ENV SERVER_NAME=your-domain-name.example.com
  4. # 如果您想禁用 HTTPS,请使用此值:
  5. # ENV SERVER_NAME=:80
  6. # 启用 PHP 生产设置
  7. RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
  8. # 将项目的 PHP 文件复制到公共目录
  9. COPY . /app/public
  10. # 如果您使用 Symfony 或 Laravel,您需要复制整个项目:
  11. # COPY . /app

有关更多详细信息和选项,请参考 “构建自定义 Docker 镜像”,并了解如何自定义配置、安装 PHP 扩展和 Caddy 模块。

如果您的项目使用 Composer,请确保将其包含在 Docker 镜像中,并安装您的依赖项。

然后,添加一个 compose.yaml 文件:

  1. services:
  2. php:
  3. image: dunglas/frankenphp
  4. restart: always
  5. ports:
  6. - "80:80" # HTTP
  7. - "443:443" # HTTPS
  8. - "443:443/udp" # HTTP/3
  9. volumes:
  10. - caddy_data:/data
  11. - caddy_config:/config
  12. # Caddy 证书和配置所需的卷
  13. volumes:
  14. caddy_data:
  15. caddy_config:

注意

上面的示例适用于生产用途。在开发过程中,您可能想要使用卷、不同的 PHP 配置以及不同的 SERVER_NAME 环境变量值。

可以查看 Symfony Docker 项目(使用 FrankenPHP)以获取使用多阶段镜像、Composer、额外 PHP 扩展等的更高级示例。

最后,如果您使用 Git,请提交这些文件并推送。

准备服务器

要将应用程序部署到生产环境,您需要一个服务器。在本教程中,我们将使用 DigitalOcean 提供的虚拟机,但任何 Linux 服务器都可以工作。如果您已经有一个安装了 Docker 的 Linux 服务器,您可以跳到 下一节

否则,使用 这个联盟链接 获取 $200 的免费信用,创建一个账户,然后点击“创建一个 Droplet”。然后,在“选择一个镜像”部分下的“Marketplace”标签页中点击,并搜索名为“Docker”的应用程序。这将配置一个 Ubuntu 服务器,预装了最新版本的 Docker 和 Docker Compose!

对于测试目的,最便宜的计划就足够了。对于真正的生产使用,您可能想要选择“通用”部分中的一个计划以满足您的需求。

使用 Docker 在 DigitalOcean 上部署 FrankenPHP

您可以保留其他设置的默认值,或者根据需要进行调整。不要忘记添加您的 SSH 密钥或创建一个密码,然后按“完成并创建”按钮。

然后,等待几秒钟,等待您的 Droplet 配置完成。当您的 Droplet 准备好后,使用 SSH 连接:

  1. ssh root@<droplet-ip>

配置域名

在大多数情况下,您会想要将域名与您的网站关联起来。如果您还没有域名,您需要通过注册商购买一个。

然后为您的域名创建一个指向服务器 IP 地址的 A 记录类型:

  1. your-domain-name.example.com. IN A 207.154.233.113

使用 DigitalOcean Domains 服务的示例(“网络” > “域名”):

在 DigitalOcean 上配置 DNS

注意

FrankenPHP 默认使用的 Let’s Encrypt 服务不支持使用裸 IP 地址。使用域名是使用 Let’s Encrypt 的强制性要求。

部署

使用 git clonescp 或任何其他适合您需求的工具将您的项目复制到服务器上。如果您使用 GitHub,您可能想使用 部署密钥。部署密钥也得到 GitLab 的支持。

使用 Git 的示例:

  1. git clone git@github.com:<username>/<project-name>.git

进入包含您的项目 (<project-name>) 的目录,并以生产模式启动应用程序:

  1. docker compose up -d --wait

您的服务器正在运行,并且已为您自动生成 HTTPS 证书。转到 https://your-domain-name.example.com 并享受吧!

注意

Docker 可能有缓存层,请确保每次部署都有正确的构建或使用 --no-cache 选项重新构建您的项目,以避免缓存问题。

在多个节点上部署

如果您想在一组机器上部署应用程序,您可以使用 Docker Swarm,它与提供的 Compose 文件兼容。要在 Kubernetes 上部署,请查看 API Platform 提供的 Helm 图表,它使用 FrankenPHP。