Докеризация стека LEMP под Ubuntu c помощью Compose

Docker-Compose - это инструмент командной строки для определения и для управления несколькими мульти-контейнерами приложений Docker. Фактически, Compose является скриптом на языке Python, может быть легко установлен с помощью команды pip (это команда для установки программного обеспечения Python из репозитория пакетов Python). Благодаря Compose можно запускать несколько Docker-контейнеров с помощью одной команды. Это позволит в создать контейнер как службу, что прекрасно подходит как для разработки и тестирования, так и для реальных задач.


Разберёмся, как использовать Docker-Compose для создания стека LEMP. Принято считать, что LEMP - это Linux+Nginx+MySQL+PHP. Каждый компонент будет запущен в собственном контейнере Docker.

Будут созданы:

 

  • контейнер Nginx,
  • PHP-контейнер,
  • phpMYADMIN контейнер
  • контейнер MySQL / MariaDB.

 

Необходимые условия

  • Ubuntu сервер 16.04-64 bit
  • 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

3 комментарии

  • Dima

    написал Dima

    Четверг, 24 Май 2018 11:01

    После редактирования docker-compose.yml
    docker-compose up -d
    выдает ошибку:
    ERROR: yaml.parser.ParserError: expected '', but found ''
    in "./docker-compose.yml", line 12, column 1

  • Dima

    написал Dima

    Четверг, 24 Май 2018 12:04

    Разобрался:
    Во первых удалил все скрытые символы, оставив по 2 и 4 пробела в строке.
    Потом здесь обнаружил ошибку:
    phpmyadmin:
    image: 'phpmyadmin/phpmyadmin'
    restart: always
    ports:
    - '8080:80'
    links:
    - mysql:mysql
    environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: robocop123
    PMA_HOST: mysql
    ------------------------------------------заменить на ------------------------
    environment:
    - MYSQL_USERNAME=root
    - MYSQL_ROOT_PASSWORD=robocop123
    - PMA_HOST=mysql

  • Дима

    написал Дима

    Четверг, 24 Май 2018 14:48

    Но конфигурация все равно не рабочая, nginx не запускается

Оставить комментарий

Ваше мнение очень важно для нас! Обязательно выскажите Ваши мысли, пожелания и критику! Не стесняйтесь задавать вопросы. Скорее всего, ответ появится уже через 2-3 дня. Спасибо заранее.

Go to top