Docker, LEMP · 6 min read · Sep 24, 2025
Dockerизация стека LEMP с помощью Docker-Compose на Ubuntu
Docker-Compose — это инструмент командной строки для определения и управления многоконтейнерными приложениями Docker. Compose — это скрипт на Python, который можно легко установить с помощью команды pip (pip — это команда для установки программного обеспечения Python из репозитория пакетов Python). С помощью Compose мы можем запускать несколько контейнеров Docker одной командой. Это позволяет создать контейнер как сервис, что отлично подходит для вашей среды разработки, тестирования и предварительного просмотра.
В этом руководстве я проведу вас шаг за шагом, чтобы использовать docker-compose для создания среды стека LEMP (LEMP = Linux - Nginx - MySQL - PHP). Мы запустим все компоненты в разных контейнерах Docker, настроим контейнер Nginx, контейнер PHP, контейнер PHPMyAdmin и контейнер MySQL/MariaDB.
Предварительные требования
- Сервер Ubuntu 16.04 -64bit
- Привилегии root
Шаг 1 - Установка Docker
На этом шаге мы установим Docker. Docker доступен в репозитории Ubuntu, просто обновите свой репозиторий, а затем установите его.
Обновите репозиторий ubuntu и выполните обновление:
sudo apt-get update
sudo apt-get upgradeУстановите последнюю версию Docker из репозитория ubuntu.
sudo apt-get install -y docker.ioЗапустите docker и включите его автозагрузку при загрузке:
systemctl start docker
systemctl enable dockerСлужбы Docker работают.
Далее вы можете попробовать использовать docker с помощью команды ниже, чтобы протестировать его:
docker run hello-worldПривет, мир от docker.

Шаг 2 - Установка Docker-Compose
На первом шаге мы уже установили Docker. Теперь мы установим docker-compose.
Нам нужен python-pip для установки compose, установите python и python-pip с помощью apt:
sudo apt-get install -y python python-pipКогда установка завершится, установите docker-compose с помощью команды pip.
pip install docker-composeТеперь проверьте версию docker-compose:
docker-compose --versionDocker-compose был установлен.
Шаг 3 - Создание и настройка окружения Docker
На этом шаге мы создадим нашу среду docker-compose. Мы будем использовать пользователя без прав root, поэтому нам нужно создать этого пользователя сейчас.
Добавьте нового пользователя с именем ‘hakase‘ (выберите свое имя пользователя, если хотите):
useradd -m -s /bin/bash hakase
passwd hakaseДалее добавьте нового пользователя в группу ‘docker‘ и перезапустите docker.
usermod -a -G docker hakase
sudo systemctl restart dockerТеперь пользователь ‘hakase‘ может использовать docker без sudo.
Далее, от имени пользователя root, войдите в пользователя ‘hakase’ с помощью su.
su - hakaseСоздайте новую директорию для окружения compose.
mkdir lemp-compose/
cd lemp-compose/Это наша среда docker-compose, все файлы, которые должны находиться в контейнере Docker, должны находиться в этой директории. Когда мы используем docker-compose, нам нужен файл .yml с именем ‘docker-compose.yml‘.
В директории ‘lemp-compose’ создайте несколько новых директорий и файл docker-compose.yml:
touch docker-compose.yml
mkdir -p {logs,nginx,public,db-data}- logs: Директория для файлов журналов Nginx.
- nginx: содержит конфигурацию Nginx, такую как виртуальный хост и т.д.
- public: директория для веб-файлов, index.html и файла информации PHP.
- db-data: том директории данных MariaDB.
Создайте файлы журналов error.log и access.log в директории ‘logs‘.
touch logs/{error,access}.logСоздайте новый файл конфигурации виртуального хоста nginx в директории ‘nginx‘:
vim nginx/app.confВставьте конфигурацию ниже:
upstream php {
server phpfpm:9000;
}
server {
server_name 193.70.36.50;
error_log "/opt/bitnami/nginx/logs/myapp-error.log";
access_log "/opt/bitnami/nginx/logs/myapp-access.log";
root /myapps;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}Сохраните файл и выйдите из vim.
Создайте новый файл index.html и файл информации PHP в директории ‘public‘.
echo 'LEMP Docker-Compose
hakase-labs' > public/index.html
echo '' > public/info.php
Теперь вы можете увидеть директорию окружения, как показано ниже:
tree
Шаг 4 - Конфигурация файла docker-compose.yml
На предыдущем шаге мы создали директории и файлы, необходимые для наших контейнеров. На этом шаге мы хотим отредактировать файл ‘docker-compose.yml‘. В файле docker-compose.yml мы определим наши сервисы для стека LEMP, базовые образы для каждого контейнера и тома docker.
Войдите в пользователя ‘hakase‘ и отредактируйте файл docker-compose.yml с помощью vim:
su - hakase
cd lemp-compose/
vim docker-compose.yml- Определите сервисы Nginx
Вставьте конфигурацию nginx ниже:
nginx:
image: 'bitnami/nginx'
ports:
- '80:80'
links:
- phpfpm
volumes:
- ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log
- ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log
- ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf
- ./public:/myappsВ этой конфигурации мы уже определили:
- nginx: имя сервиса
- image: мы используем образы Docker ‘bitnami/nginx‘
- ports: открываем порт контейнера 80 для порта хоста 80
- links: связываем контейнер сервиса ‘nginx‘ с контейнером ‘phpfpm‘
- volumes: монтируем локальные директории в контейнер. Монтируем директорию файлов журналов, монтируем конфигурацию виртуального хоста Nginx и монтируем корневую директорию веба.
- Определите сервисы PHP-fpm
Вставьте конфигурацию ниже блока Nginx:
phpfpm:
image: 'bitnami/php-fpm'
ports:
- '9000:9000'
volumes:
- ./public:/myappsМы определили здесь:
- phpfpm: определяем имя сервиса.
- image: определяем базовый образ для сервиса phpfpm с образом ‘bitnami/php-fpm‘.
- ports: Мы запускаем PHP-fpm на TCP порту 9000 и открываем порт 9000 для хоста.
- volumes: монтируем корневую директорию веба ‘public‘ в ‘myapps‘ на контейнере.
- Определите сервис MySQL
В третьем блоке вставьте конфигурацию ниже для контейнера сервиса MariaDB:
mysql:
image: 'mariadb'
ports:
- '3306:3306'
volumes:
- ./db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=hakase-labs123Здесь вы можете видеть, что мы используем:
- mysql: как имя сервиса.
- image: контейнер основан на образах ‘mariadb‘.
- ports: сервисный контейнер использует порт 3306 для соединения MySQL и открывает его для хоста на порту 3306.
- volumes: директория db-data mysql
- environment: устанавливаем переменную окружения ‘MYSQL_ROOT_PASSWORD‘ для пароля root mysql для образов docker, выполняется при сборке контейнера.
- Конфигурация сервисов PHPMyAdmin
В последнем блоке вставьте конфигурацию ниже:
phpmyadmin:
image: 'phpmyadmin/phpmyadmin'
restart: always
ports:
- '8080:80'
links:
- mysql:mysql
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: hakase-labs123
PMA_HOST: mysqlМы используем образ ‘phpmyadmin’, сопоставляя порт контейнера 80 с 8080 на хосте, связываем контейнер с контейнером mariadb, устанавливаем перезапуск всегда и устанавливаем некоторые переменные окружения образа docker, включая установку ‘PMA_HOST‘.
Сохраните файл и выйдите из vim.
Вы можете увидеть полный пример на github.
Шаг 5 - Запуск Docker-Compose
Теперь мы готовы запустить docker-compose. Примечание: когда вы хотите запустить docker-compose, вы должны находиться в директории проекта docker-compose и убедиться, что есть файл yml с конфигурацией compose.
Запустите команду ниже, чтобы запустить стек LEMP:
docker-compose up -d-d: запуск в фоновом режиме
Вы увидите результат, что новые контейнеры были созданы, проверьте это с помощью команды ниже:
docker-compose ps
Теперь у нас четыре контейнера, работающих с Nginx, PHP-fpm, MariaDB и PHPMyAdmin.
Шаг 6 - Тестирование
Проверка портов, используемых docker-proxy на хосте.
netstat -plntu
Мы можем видеть порт 80 для контейнера Nginx, порт 3306 для контейнера MariaDB, порт 9000 для контейнера php-fpm и порт 8080 для контейнера PHPMyAdmin.
Доступ к порту 80 из веб-браузера, и вы увидите наш файл index.html.
Убедитесь, что PHP-fpm работает, получите к нему доступ из веб-браузера.
http://serverip-address/info.php

Доступ к контейнеру MySQL в оболочке MySQL.
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123Теперь создайте новую базу данных:
create database hakase_db;
exitКонтейнер оболочки MariaDB mysql доступен, и мы создали новую базу данных ‘hakase_db‘.

Далее, получите доступ к PHPMyAdmin на порту 8080: http://serverip-address:8080/.
Вы увидите страницу входа PHPMyAdmin, просто введите имя пользователя ‘root‘ и пароль ‘hakase-labs123‘.

Вы будете автоматически подключены к контейнеру mysql, который был определен в переменной окружения PMA_HOST.
Нажмите ‘Go‘, и вы увидите панель управления phpmyadmin, подключенную к контейнеру ‘mysql‘.

Успех! Стек LEMP работает под настройкой docker-compose, состоящей из четырех контейнеров.
Ссылки
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/
Get new posts in your inbox
No spam. Unsubscribe anytime.