将 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=mysqlLaravel 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.0Kubernetes 部署
在 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 反馈 — 无需本地设置。