С 2021 года статья потеряла актуальность после выхода свежих версий дистрибутива Ubuntu 18.04, Ubuntu 20.04 и т.д. Не рекомендуется действовать по данной методике.
Разберёмся, как использовать Docker-Compose для создания стека LEMP. Принято считать, что LEMP - это Linux+Nginx+MySQL+PHP. Каждый компонент будет запущен в собственном контейнере Docker.
Будут созданы:
- контейнер Nginx,
- PHP-контейнер,
- phpMYADMIN контейнер
- контейнер MySQL / MariaDB.
Необходимые условия
- Ubuntu сервер 16.04
- Root-привилегии
Шаг 1 - Установить Docker
На этом этапе надо установить Docker. Docker доступен в репозитории Ubuntu, но прежде нужно обновить всю систему:
sudo apt-get update sudo apt-get upgrade
Установите последнюю версию Docker из репозитория Ubuntu.
sudo apt-get install -y docker.io
Запустите Докер и включите его в автозагрузку:
systemctl start docker systemctl enable 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 install docker-compose
Теперь проверим версию Docker-Compose :
docker-compose --version
Если Docker-Compose установлен, в консоли будет виден отчёт о номере версии.
Шаг 3 - Создание и настройка среды Docker
На этом этапе нужно будет настроить среду Docker-Compose. Для этого мы используем нового пользователя (не root), поэтому нужно создать такого пользователя. Добавим нового пользователя с именем «robocop» (лучше выбрать собственное имя пользователя):
useradd -m -s /bin/bash robocop passwd robocop
Добавьте нового пользователя в группу «Docker» и перезапустите Докер.
usermod -a -G docker robocop
sudo systemctl restart docker
Теперь пользователь «robocop» может использовать Docker без sudo. Далее из-под супер-пользователя войдём в «robocop» через su:
su - robocop
Создайте новый каталог для создания среды 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: каталог базы данных.
Создаём файлы журналов error.log и access.log в каталоге «журналов»
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; } }
Сохраните файл. Создайте новый файл index.html и PHP-файл в папке «public».
echo '<h1>LEMP Docker-Compose</h1><p><b>hakase-labs</b>' > public/index.html echo '<?php phpinfo(); ?>' > public/info.php
Теперь можно посмотреть структуру каталога с помощью команды:
tree
Шаг 4 - Настройка файла doker-compose.yml
В предыдущем этапе мы создали каталоги и файлы, необходимые для наших контейнеров. На этом этапе нужно отредактировать файл «doker-compose.yml». В файле«doker-compose.yml» следует определить службы для стека LEMP, базовые образы для каждого контейнера, а также тома docker.
Заходим из-под пользователя «robocop» и правим файл «doker-compose.yml»:
su - robocop
cd lemp-compose/
mcedit docker-compose.yml
Определим службу 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: используем «bitnami/nginx»
- ports: открыли контейнерный порт 80 на порт хоста 80
- links: увязали контейнер «nginx» и контейнер «phpfpm»
- volumes: монтируеv местные каталоги для контейнера (журнал, конфигурацию виртуального и корневой веб-каталог)
Определим службу 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=robocop123
В данном случае мы задаём:
- MySQL: как имя службы
- image: контейнер основан на образе «mariadb»
- ports: контейнер службы использует порт 3306 для подключения MySQL, пробрасываем его на порт 3306 хоста.
- volumes: db-data
- environment: Необходимо определить переменную среды «MYSQL_ROOT_PASSWORD», задав пароль root
Настройка служб PHPMyAdmin
Для последнего блока вставьте конфигурацию ниже:
phpmyadmin:
image: 'phpmyadmin/phpmyadmin'
restart: always
ports:
- '8080:80'
links:
- mysql:mysql
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: robocop123
PMA_HOST: mysql
Мы используем Docker-образ «phpmyadmin», сопоставляем порт контейнера 80 и порт 8080 на хосте, связываем контейнер с контейнером mariadb, устанавливаем перезагрузку в always, определяем некоторые переменные среды, включая «PMA_HOST».
Сохраните файл.
Шаг 5 – Запуск doker-compose
Теперь мы готовы запустить doker-compose.
Обратите внимание, что для запуска doker-compose, вы должны будете находиться в директории проекта doker-compose и определённо иметь файл YML с конфигурацией.
Выполните команду ниже, чтобы запустить стек 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 работает, обратившись к странице /info.php на сервере.
Из командной строки можно получить доступ к контейнеру MySQL.
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: robocop123
Можно создать новую базу данных:
create database robocop_db; exit
Контейнер MariaDB живой, и мы создали новую базу данных 'robocop_db'.
Далее, для доступа к PHPMyAdmin обратимся к порту 8080 в браузере.
Откроется страница для входа в phpMyAdmin, можно будет войти как root, с паролем "robocop123". Вы будете автоматически подключены к контейнеру mysql, который был определен в переменной PMA_HOST.
Готово! LEMP-stack работает под управлением docker-Compose, состоящей из четырех контейнеров.
Ссылки
_https://hub.docker.com/r/bitnami/nginx/
_https://hub.docker.com/r/bitnami/php-fpm/
_https://docs.docker.com/compose/
_https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
Дискуссия
Написал Rocky 9
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Константин
Опубликовано в: Докеризация стека LEMP под Ubuntu c помощью Compose in LinuxНаписал bammbr
Опубликовано в: Шлюз для маленького отдела на Red Hat 9 in LinuxНаписал Федор
Опубликовано в: Установка и конфигурация Samba на CentOS 7 in LinuxНаписал Evgenytrl
Опубликовано в: Загрузка файлов с помощью Wget in Linux