Что такое Docker и как создать контейнер для PHP?php-61

Что такое Docker?

Docker — это платформа для разработки, развертывания и запуска приложений в изолированных средах (контейнерах). Контейнеры включают все необходимое для работы приложения: код, runtime, системные инструменты, библиотеки и настройки.

Ключевые преимущества для PHP-разработки:

  1. Идентичные среды на всех этапах (dev/stage/prod)
  2. Быстрое развертывание без "works on my machine" проблем
  3. Изоляция зависимостей (разные версии PHP, расширений)
  4. Масштабируемость через оркестрацию (Docker Compose, Kubernetes)

Основные компоненты Docker

  1. Dockerfile - инструкция для сборки образа
  2. Образ (Image) - шаблон для создания контейнеров
  3. Контейнер - запущенный экземпляр образа
  4. Docker Hub - репозиторий готовых образов

Создание контейнера для PHP

1. Базовый Dockerfile для PHP-приложения:

# Используем официальный образ PHP с Apache
FROM php:8.2-apache

# Устанавливаем системные зависимости
RUN apt-get update && apt-get install -y \
    git \
    libzip-dev \
    unzip \
    && docker-php-ext-install zip pdo_mysql

# Устанавливаем Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Копируем код приложения
COPY . /var/www/html/

# Устанавливаем зависимости
RUN composer install --no-dev --optimize-autoloader

# Настраиваем Apache
ENV APACHE_DOCUMENT_ROOT /var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN a2enmod rewrite

# Порт, который будет слушать контейнер
EXPOSE 80

2. Сборка и запуск:

# Сборка образа
docker build -t my-php-app .

# Запуск контейнера
docker run -p 8080:80 --name my-app-container my-php-app

3. Docker Compose для комплексного решения :

version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - db
      - redis

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

volumes:
  mysql_data:

Оптимизация PHP-образа

  1. Многоэтапная сборка для уменьшения размера:
# Этап сборки
FROM php:8.2-cli as builder
COPY . /app
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader

# Финальный образ
FROM php:8.2-apache
COPY --from=builder /app /var/www/html
  1. Безопасность:
  • Использование .dockerignore
  • Не копировать vendor и node_modules
  • Отдельный пользователь (не root)
RUN useradd -m appuser && chown -R appuser /var/www/html
USER appuser

Работа с Xdebug для отладки

RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

Пример xdebug.ini:

xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003

Полезные команды Docker

# Просмотр запущенных контейнеров
docker ps

# Просмотр логов
docker logs -f my-app-container

# Вход в контейнер
docker exec -it my-app-container bash

# Остановка и удаление
docker stop my-app-container && docker rm my-app-container

# Очистка системы
docker system prune -a

Best Practices для PHP в Docker

  1. Используйте .dockerignore для исключения ненужных файлов
  2. Разделяйте образы для dev и prod (с разными настройками PHP)
  3. Для production:
    • Убирайте Xdebug
    • Включайте opcache
    • Используйте alpine-образы для уменьшения размера
  4. Для разработки:
    • Используйте volume для кода
    • Настройте hot-reload

Резюмируем:

Docker революционизирует процесс разработки PHP-приложений, обеспечивая консистентность сред и упрощая развертывание. Правильно настроенный Docker-контейнер для PHP включает оптимизированный образ, все необходимые расширения и интеграцию с другими сервисами (БД, кеш), что значительно ускоряет разработку и снижает эксплуатационные риски.