Контейнеризация приложения PHP
Создайте образ Docker для PHP и Nginx и управляйте ими с помощью Docker Compose
«Контейнеризация приложения PHP» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Зачем Docker нужен для PHP?
Docker упаковывает приложение вместе с его зависимостями в переносимый образ контейнера. Один и тот же образ одинаково работает в разработке, непрерывной интеграции и production, устраняя проблемы в духе «у меня на машине работает».
Базовый Dockerfile для PHP + Nginx
Минимальный Dockerfile для приложения PHP + Nginx.
# 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
Оркестрируйте несколько служб (PHP-FPM, Nginx, MySQL, Redis) с помощью Docker Compose.
# 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Команды Artisan Laravel
Запускайте команды 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 и примените его.
Усиление защиты production-среды
Практики для production в Docker: используйте пользователя без прав root, файловую систему корня только для чтения, минимальный базовый образ (Alpine), не устанавливайте зависимости для разработки, фиксируйте теги образов и сканируйте их на наличие уязвимостей CVE с помощью docker scout.
Итоги
Создайте Dockerfile для PHP-FPM + Composer. Используйте docker-compose для локальной разработки со службами Nginx, MySQL и Redis. В production применяйте многоэтапные сборки, передавайте переменные окружения и запускайте приложение через Kubernetes или ECS.
Быстрая проверка
Каково главное преимущество многоэтапных сборок Docker?
Часто задаваемые вопросы
Урок «Контейнеризация приложения PHP» бесплатный?
Да — полный текст урока «Контейнеризация приложения PHP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Контейнеризация приложения PHP»?
Создайте образ Docker для PHP и Nginx и управляйте ими с помощью Docker Compose Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Контейнеризация приложения PHP»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка Nginx и PHP-FPM
- Переменные окружения и файлы .env
- Развёртывание с GitHub Actions
- Контейнеризация приложения PHP