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.

Hello 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 --version

Docker-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

Docker compose project environment

Шаг 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

running docker-compose

Теперь у нас четыре контейнера, работающих с Nginx, PHP-fpm, MariaDB и PHPMyAdmin.

Шаг 6 - Тестирование

Проверка портов, используемых docker-proxy на хосте.

netstat -plntu

all docker port mapped to host

Мы можем видеть порт 80 для контейнера Nginx, порт 3306 для контейнера MariaDB, порт 9000 для контейнера php-fpm и порт 8080 для контейнера PHPMyAdmin.

Доступ к порту 80 из веб-браузера, и вы увидите наш файл index.html.

http://serverip-address/

Убедитесь, что PHP-fpm работает, получите к нему доступ из веб-браузера.

http://serverip-address/info.php

php-fpm docker container is working

Доступ к контейнеру 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‘.

access mysql shell docker container

Далее, получите доступ к PHPMyAdmin на порту 8080: http://serverip-address:8080/.

Вы увидите страницу входа PHPMyAdmin, просто введите имя пользователя ‘root‘ и пароль ‘hakase-labs123‘.

phpmyadmin docker container

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

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

phpmyadmin and mysql docker container is working

Успех! Стек LEMP работает под настройкой docker-compose, состоящей из четырех контейнеров.

Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.