Перейти к содержимому
Главная страница » Запуск PHP в Docker

Запуск PHP в Docker

Docker — это популярная технология с открытым исходным кодом для запуска приложений в контейнерной среде. Это полезно, потому что позволяет легко создавать и развёртывать приложения на любой платформе, поддерживающей Docker. 

В этом руководстве мы узнаем, как создать приложение PHP, которое можно запускать в контейнере Docker. Сначала мы сделаем это, создав образ Docker и запустив его в качестве контейнера. Веб-сервером, который мы будем использовать для нашего PHP-приложения, является Apache. При желании вы также можете использовать для этого Nginx.

Далее рассмотрим более сложный пример с разверткой всего LAMP стэка для работы полноценного php приложения, а конкретно:

  • Apache — веб-сервер;
  • MariaDB / MySQL — система управления базами данных (СУБД);
  • PHP —  язык программирования, используемый для создания веб-приложений.

Что такое PHP?

Прежде чем мы начнём, нам нужно понять, что такое PHP. PHP — это язык программирования, который используется для создания динамических веб-приложений. PHP — популярный выбор среди веб-разработчиков, потому что он прост в освоении и очень гибок. PHP — это серверный язык, то есть он пишется на сервере и выполняется на сервере. Запуск PHP в Docker — хорошая идея, потому что она позволяет легко развёртывать и запускать PHP-приложение на любой платформе, поддерживающей Docker.

Считаем, что Docker у вас уже установлен, если еще нет, то читаем, как установить Docker на Ubuntu, Debian, Centos или Windows.

Структура каталогов

К концу этого руководства наше приложение будет иметь следующую структуру каталогов:

app
├── src
|   └── index.php
├── .env
├── docker-compose.yml
└── Dockerfile

Как видите, это простое приложение с несколькими файлами для целей данного руководства.

PHP-приложение

В этом руководстве предполагается, что у вас уже есть PHP-приложение, которое вы хотите развернуть в контейнере Docker, однако мы создадим очень простое приложение с нуля.

Создайте файл с именем index.php в src каталоге.

<?php
    phpinfo();
?>

Этот файл — просто обычный PHP-файл, который выводит версию PHP и некоторую информацию о сервере. Вот как он будет выглядеть после запуска.

Обзор Docker

Прежде чем мы продолжим, давайте вкратце рассмотрим, как работает Docker. Как уже говорилось, Docker — это технология контейнеризации, которая упрощает создание, развёртывание и запуск приложений внутри контейнеров.

Контейнер Docker — это облегчённая, переносимая и изолированная единица программного обеспечения. Это отдельный процесс, который работает на одном компьютере. Он предназначен для запуска определённого приложения, например веб-сервера или базы данных.

Образ Docker — это шаблон для контейнера Docker. Это набор файлов и команд, которые можно использовать для создания контейнера Docker. Он хранится в файле с именем Dockerfile. Инструкции в этом файле используются для создания образа.

Docker Compose

Теперь, когда у нас есть приложение для развёртывания и определены основные термины для Docker, давайте развернём его в контейнере Docker. Это можно сделать несколькими способами, но проще всего использовать инструмент Docker Compose. Он поставляется вместе с Docker, так что у вас уже должен быть к нему доступ.

Создайте файл с именем docker-compose.yml в корневом каталоге вашей папки.

version: "3.9"

services:
    php:
        container_name: php
        image: php
        restart: always
        build:
            context: .
            dockerfile: Dockerfile
            target: base
        ports:
            - "${PORT}:80"

Давайте разберёмся, что здесь происходит. Этот файл сообщает Docker, что нужно создать сервис под названием php, который запускает образ php с именем контейнера php и открывает порт, который мы позже установим на 8080. Сами инструкции по созданию образа находятся в файле Dockerfile.

Dockerfile

Создайте файл с именем Dockerfile в корневом каталоге вашей папки.

FROM php:8.0-apache as base
COPY ./src /var/www/html

Здесь всего две строки, и все просто.

FROM php:8.0-apache as base

Это указывает Docker на необходимость получить последнюю версию образа php:8.0-apache Docker, в котором предварительно установлены PHP 8 и Apache, и назвать этот образ base.

COPY ./src /var/www/html

Это указывает Docker на необходимость скопировать содержимое src в каталог /var/www/html/ внутри контейнера. Это важно, потому что эта папка является корневой, из которой Apache будет считывать данные.

Env-файл

Прежде чем мы сможем развернуть наше приложение в контейнере Docker, нам нужно настроить переменные среды, которые понадобятся для запуска приложения. Создайте файл с именем .env в корневом каталоге вашей папки.

Поскольку мы определили порт как переменную в файле docker-compose.yml, нам нужно задать порт в файле .env.

PORT=8080

Вы можете выбрать любой порт, какой захотите, но помните, что это порт, который вы будете использовать для доступа к своему приложению.

Запуск приложения

Наконец-то мы готовы развернуть приложение в контейнере Docker. Для этого используйте Docker Compose.

docker compose up --build

При первой сборке вам не понадобится флаг build, но он понадобится при последующих запусках. В случае успеха вы увидите что-то вроде этого:

Приложение теперь создано и доступно по адресу http://localhost:8080/ так же, как и раньше, однако теперь оно работает в Docker.

Вы можете убедиться, что контейнер запущен в Docker, а также все остальные запущенные контейнеры, с помощью команды docker ps

docker ps
CONTAINER ID IMAGE COMMAND                CREATED        STATUS        PORTS                  NAMES
ba804e8bff5f php   "docker-entrypoint.s…" 5 seconds ago  Up 5 seconds  0.0.0.0:8080->8080/tcp php

Вы можете остановить запущенный контейнер, командой:

docker compose down

Имейте в виду, что, как мы уже упоминали, несмотря на то, что мы используем Apache в качестве веб-сервера, вы можете использовать вместо него Nginx.

Развертывание в рабочей среде

Теперь, наше простое PHP-приложение успешно контейнеризировано, его можно развернуть в любой среде, которую вы выберете. 

Ну а теперь рассмотрим, как развернуть более сложное php приложение которому необходима еще и база данных MySQL, для этого доработаем файл docker-compose.yml:

version: "3.9"

services:
   php:
        container_name: php
        image: php
        restart: always
        build:
            context: .
            dockerfile: Dockerfile
            target: base
        ports:
            - "${PORT}:80"
        links:
      - mysql
   mysql:
    image: mysql:8
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: php_docker
      MYSQL_USER: app
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *