0Pricing
PHP Academy · 课时

将 PHP 应用容器化

为 PHP + Nginx 构建 Docker 镜像,并使用 Docker Compose 编排。

将 PHP 应用容器化 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。

为什么使用 Docker 开发 PHP

Docker 会将应用程序及其依赖项打包成可移植的容器镜像。同一个镜像在开发、CI 和生产环境中运行时完全一致,从而消除“在我的机器上可以运行”的问题。

基本 PHP Dockerfile

用于 PHP + Nginx 应用程序的最小 Dockerfile。

# Dockerfile
FROM php:8.3-fpm-alpine

# Install extensions
RUN docker-php-ext-install pdo pdo_mysql opcache

# Install Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

COPY . .

RUN chown -R www-data:www-data /app/storage /app/bootstrap/cache

多阶段构建

请使用多阶段构建来保持最终镜像的精简:在一个阶段安装构建工具,只将构建产物复制到最终镜像中。

# Stage 1: builder
FROM composer:2 AS builder
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

# Stage 2: runtime
FROM php:8.3-fpm-alpine
WORKDIR /app
COPY --from=builder /app/vendor ./vendor
COPY . .

docker-compose.yml

请使用 Docker Compose 通过多个服务(PHP-FPM、Nginx、MySQL、Redis)进行编排。

# docker-compose.yml
services:
  app:
    build: .
    volumes:
      - .:/app
  nginx:
    image: nginx:alpine
    ports: ["80:80"]
    volumes:
      - .:/app
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
  mysql:
    image: mysql:8
    environment:
      MYSQL_DATABASE: myapp
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
  redis:
    image: redis:alpine
volumes:
  db_data:

Nginx 容器配置

请挂载自定义 Nginx 配置,以代理 PHP-FPM 请求。

# docker/nginx.conf
server {
    listen 80;
    root /app/public;
    index index.php;
    location / { try_files $uri /index.php?$query_string; }
    location ~ \.php$ {
        fastcgi_pass app:9000;  # service name from docker-compose
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

环境变量

请将环境变量传递给容器,切勿将密钥烘焙到镜像中。

# docker-compose.yml:
services:
  app:
    env_file: .env
    # or explicit:
    environment:
      - APP_ENV=production
      - DB_HOST=mysql

Laravel Artisan 命令

请在容器内运行 Artisan 命令。

$ docker compose exec app php artisan migrate
$ docker compose exec app php artisan config:cache
$ docker compose exec app php artisan queue:work

健康检查

请添加健康检查,以便编排器(Kubernetes、ECS)知道容器何时已准备就绪。

# Dockerfile:
HEALTHCHECK --interval=30s --timeout=5s \
  CMD curl -f http://localhost/health || exit 1

构建和推送镜像

请将镜像构建并推送到镜像仓库(Docker Hub、ECR、GHCR)。

$ docker build -t myorg/myapp:1.0.0 .
$ docker push myorg/myapp:1.0.0

Kubernetes 部署

在 Kubernetes 中,请使用您的镜像定义 Deployment 和 Service 资源。请使用 kubectl set image 发布新版本,或更新 YAML 后应用更改。

生产环境加固

生产环境中的 Docker 实践包括:使用非 root 用户、使用只读根文件系统、使用精简的基础镜像(Alpine)、不包含开发依赖项、固定镜像标签,以及使用 docker scout 扫描 CVE。

总结

请为 PHP-FPM + Composer 创建 Dockerfile。在本地开发中使用 docker-compose,并运行 Nginx、MySQL 和 Redis 服务。在生产环境中使用多阶段构建,注入环境变量,并通过 Kubernetes 或 ECS 运行。

快速检查

多阶段 Docker 构建的主要优点是什么?

常见问题解答

「将 PHP 应用容器化」课时是免费的吗?

是的 — 「将 PHP 应用容器化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。

「将 PHP 应用容器化」这节课中我会学到什么?

为 PHP + Nginx 构建 Docker 镜像,并使用 Docker Compose 编排。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PHP Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「将 PHP 应用容器化」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PHP Academy 课中编写并运行代码吗?

能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Nginx 与 PHP-FPM 配置
  2. 环境变量与 .env 文件
  3. 使用 GitHub Actions 部署
  4. 将 PHP 应用容器化
← 返回 PHP Academy