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