Если вы занимаетесь веб-разработкой на PHP, то, скорее всего, сталкивались с проблемой настройки окружения для своих проектов.
Установка PHP и необходимых компонентов на разных машинах занимает время и может привести к ошибкам.
Решением этой проблемы становится использование Docker — инструмента, который позволяет запускать приложения внутри изолированных контейнеров.
Если у вас еще не установлен Docker, вам помогут наши статьи об его установки на Windows и Linux соответственно. В рамках этой статье, процесс установки Docker не рассматривается. В ней мы поговорим о том, как запустить PHP в Docker контейнере и приведем несколько примеров.
Почему стоит использовать Docker для PHP
- Изоляция среды. Каждый проект может работать в своем отдельном контейнере с нужной версией PHP и зависимостями.
- Легкость настройки. Можно быстро запускать, останавливать и переносить проекты.
- Совместимость. Контейнеры работают одинаково на любом компьютере: Windows, Mac или Linux.
Как запустить PHP в Docker: пошаговая инструкция
Мы рассмотрим несколько практических примеров, как с использованием официального образа так и с образами на популярных дистрибутивах.
Но сначала подготовим тестовый файл php_files/hello.php, с помощью которого мы будем проверять работу php:
[root@waky practice]# mkdir php_files/
[root@waky practice]# echo '<?php echo "Hello, World"; ?>' > php_files/hello.php
[root@waky practice]#
1. Использование официального образа PHP
Самый простой и быстрый способ — взять готовый официальный образ PHP из Docker Hub. Например, нам нужен PHP 8.4, скачаем соответствующий образ командой docker pull:
[root@waky practice]# docker pull php:8.4
8.4: Pulling from library/php
0e4bc2bd6656: Already exists
6fb0a7555bfa: Pull complete
6ad4c36519ef: Pull complete
626a3e9bc74e: Pull complete
e034d64b23d3: Pull complete
96e6cf5c792d: Pull complete
edc6f3500bcf: Pull complete
3491850fbccb: Pull complete
655bb1b813ca: Pull complete
054738218147: Pull complete
Digest: sha256:036def05378dcfdaf6e5fd4c002e3a1751209a27be1a3ae2f8e68522938f8571
Status: Downloaded newer image for php:8.4
docker.io/library/php:8.4
[root@waky practice]#
Запустим контейнер командой docker run:
[root@waky practice]# docker run -dt --name php_container -v ./php_files/:/home php:8.4
0afe6a3b5645dbba02e5348ef8c53ff9edfd74f59a1a76ffc36dfdf74d44273b
[root@waky practice]#
Использованные параметры:
-d — запускает его в фоновом режиме
–t – доступ до псевдо терминала
–name php_container — задает имя контейнера
-v ./php_files/:/home — монтирует локальную директорию внутрь контейнера
php:8.4 — образ, из которого создается контейнер
Зайдем в контейнер с помощью docker exec:
[root@waky practice]# docker exec -it php_container /bin/bash
root@0afe6a3b5645:/#
Проверим версию PHP:
root@0afe6a3b5645:/#php -v
PHP 8.4.15 (cli) (built: Nov 20 2025 19:53:04) (NTS)
Copyright (c) The PHP Group
Built by https://github.com/docker-library/php
Zend Engine v4.4.15, Copyright (c) Zend Technologies
with Zend OPcache v8.4.15, Copyright (c), by Zend Technologies
root@0afe6a3b5645:/#
и запустим скрипт:
root@0afe6a3b5645:/# php /home/hello.php
Hello, World
Все готово, контейнер готов. Теперь у нас есть изолированная среда с нужной нам версией PHP для запуска наших скриптов.
Выйдем из контейнера и удалим его:
root@0afe6a3b5645:/# exit
exit
[root@waky practice]# docker rm -f php_container
php_container
[root@waky practice]#
Если вам не нужен постоянно работающий контейнер, можно поступить иначе. Следующая команда создаст контейнер, выполнит скрипт, вернет результат и удалит контейнер:
[root@waky practice]# docker run --rm --name php_container -v ./php_files/:/home php:8.4 php /home/hello.php
Hello, World
Использованные параметры:
—rm – удаление контейнера после остановки
php /home/hello.php – команда, которая будет запущена в контейнере после его создания
Такой запуск контейнера непосредственно для выполнения скрипта поможет сэкономить ресурсы хоста.
2. Установка PHP в контейнере на базе другого образа
Возможно, вам нужно установить PHP в уже имеющийся контейнер. Или вы собираете свой образ на базе популярного дистрибутива. Рассмотрим, как установить PHP в таком случае. Для примера будем использовать два популярных образа alpine и ubuntu.
PHP на базе Alpine
Alpine — легкий Linux-дистрибутив, он идеально подходит для минималистичных контейнеров.
Создадим чистый контейнер с alpine:
[root@waky practice]# docker run -dt --name php_container -v ./php_files/:/home alpine
ca8097b92a67f2cd2b3b11ab68298838dbca960e93d4f28b2e974e4690c9e0a4
[root@waky practice]#
Зайдем в контейнер:
[root@waky practice]# docker exec -it php_container /bin/sh
/ #
Устанавливаем PHP используя пакетный менеджер
/ # apk add php
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/APKINDEX.tar.gz
(1/9) Installing php83-common (8.3.27-r0)
(2/9) Installing argon2-libs (20190702-r5)
(3/9) Installing ncurses-terminfo-base (6.5_p20250503-r0)
(4/9) Installing libncursesw (6.5_p20250503-r0)
(5/9) Installing libedit (20250104.3.1-r1)
(6/9) Installing pcre2 (10.46-r0)
(7/9) Installing xz-libs (5.8.1-r0)
(8/9) Installing libxml2 (2.13.9-r0)
(9/9) Installing php83 (8.3.27-r0)
Executing busybox-1.37.0-r19.trigger
OK: 18 MiB in 25 packages
/ #
Проверим работу PHP запустив скрипт:
/ # php /home/hello.php
Hello, World
Вручную установленные пакеты сохраняются пока существует контейнер, но если его удалить и создать по новой PHP там не останется.
Чтобы не устанавливать PHP каждый раз, используйте Dockerfile следующего содержания:
FROM alpine:latest
RUN apk add php
Если вы еще не знакомы с использованием Dockerfile, прочтите нашу статью, посвященную созданию образов.
PHP на базе Ubuntu
Установка PHP на Ubuntu по сути отличается только используемыми образом и пакетным менеджером.
Удалим старый контейнер:
[root@waky practice]# docker rm -f php_container
php_container
[root@waky practice]#
Создаем контейнер из образа ubuntu:
[root@waky practice]# docker run -dt --name php_container -v ./php_files/:/home ubuntu
09ac7e95241a60501503ad3192e31404a425beeda76dbc49c46d23dbab5f7044
[root@waky practice]#
Подключаемся к контейнеру:
[root@waky practice]# docker exec -it php_container /bin/bash
root@09ac7e95241a:/#
Далее, внутри контейнера, обновим пакеты:
root@09ac7e95241a:/# apt update
Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Get:4 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1174 kB]
Get:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
Get:6 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
Get:8 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [33.1 kB]
Get:9 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [2781 kB]
Get:10 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
Get:11 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1680 kB]
Get:12 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [35.9 kB]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [2050 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1942 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [2925 kB]
Get:17 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.4 kB]
Get:18 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [33.9 kB]
Fetched 34.9 MB in 10s (3431 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
root@09ac7e95241a:/#
и выполним установку PHP:
root@09ac7e95241a:/# apt install -y php
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
adduser apache2 apache2-bin apache2-data apache2-utils ca-certificates krb5-locales libapache2-mod-php8.3 libapr1t64 libaprutil1-dbd-sqlite3 libaprutil1-ldap libaprutil1t64 libargon2-1
libbrotli1 libbsd0 libcurl4t64 libedit2 libexpat1 libgdbm-compat4t64 libgdbm6t64 libgssapi-krb5-2 libicu74 libjansson4 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-common
libldap2 liblua5.4-0 libnghttp2-14 libperl5.38t64 libpsl5t64 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsodium23 libsqlite3-0 libssh-4 libxml2 media-types netbase openssl perl
perl-modules-5.38 php-common php8.3 php8.3-cli php8.3-common php8.3-opcache php8.3-readline psmisc publicsuffix ssl-cert tzdata ucf
Suggested packages:
liblocale-gettext-perl cron quota ecryptfs-utils apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser ufw php-pear gdbm-l10n krb5-doc krb5-user libsasl2-modules-gssapi-mit
| libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make
libtap-harness-archive-perl
The following NEW packages will be installed:
adduser apache2 apache2-bin apache2-data apache2-utils ca-certificates krb5-locales libapache2-mod-php8.3 libapr1t64 libaprutil1-dbd-sqlite3 libaprutil1-ldap libaprutil1t64 libargon2-1
libbrotli1 libbsd0 libcurl4t64 libedit2 libexpat1 libgdbm-compat4t64 libgdbm6t64 libgssapi-krb5-2 libicu74 libjansson4 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-common
libldap2 liblua5.4-0 libnghttp2-14 libperl5.38t64 libpsl5t64 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsodium23 libsqlite3-0 libssh-4 libxml2 media-types netbase openssl perl
perl-modules-5.38 php php-common php8.3 php8.3-cli php8.3-common php8.3-opcache php8.3-readline psmisc publicsuffix ssl-cert tzdata ucf
0 upgraded, 58 newly installed, 0 to remove and 0 not upgraded.
...
root@09ac7e95241a:/#
Проверяем работу PHP:
root@09ac7e95241a:/# php /home/hello.php
Hello, World
Так же можно использовать Dockerfile:
FROM ubuntu:latest
RUN apt update && apt install -y php
Это позволит кастомизировать ваш рабочий образ.
Заключение
Использование Docker для запуска PHP — это быстрый способ создать универсальную среду разработки без головной боли с настройками и несовместимостями.
Можно выбрать официальный образ для максимальной простоты или экспериментировать с другими популярными образами.