Как установить и настроить LEMP стек на Linux Fedora с использованием Docker?

Здравствуйте! Недавно я проходил собеседование в IT-компании, и мне было дано техническое задание. Вот его условия:

1. Настроить LEMP-стек в контейнере, запустить его и проверить работоспособность.
2. Организовать отдачу метрик с nginx по пути /metrics, а в инструкции описать значения метрик, которые будут выводиться на странице.
3. Разработать PHP-скрипт для вывода двух строк из базы данных и подключить его к веб-серверу как главную страницу.
4. Реализация может быть на ваше усмотрение (примитивность необязательна, можно не придавать значения стилям).
5. Предоставить Dockerfile с проектом (возможно, с дополнительными файлами) и описать каждую строчку, объясняя ее назначение.
6. Подготовить пошаговую инструкцию по запуску контейнера, чтобы инженеры могли получить такой же вывод, как и у меня.

Какой дистрибутив вы рекомендуете использовать в качестве базового образа, учитывая, что он должен быть rpm-based?
  • 15 сентября 2024 г. 16:53
Ответы на вопрос 3
Для реализации LEMP-стека в контейнере на Fedora (которая основана на RPM) вы можете использовать Fedora в качестве базового образа. Однако более популярным выбором, особенно для Docker, может быть образ с CentOS или другой RPM-базированный дистрибутив, например, Rocky Linux или AlmaLinux. Тем не менее, вы можете использовать Fedora, так как она поддерживает последние версии пакетов.

Вот пошаговая инструкция по настройке LEMP-стека с использованием Docker на Fedora:

### Шаг 1: Создание структуры проекта

Создайте директорию для вашего проекта и перейдите в нее:

```bash
mkdir my_lemp_stack
cd my_lemp_stack
```

### Шаг 2: Создание Dockerfile

Создайте файл `Dockerfile` в этой директории и добавьте следующие строки:

```dockerfile
# Используем базовый образ Fedora
FROM fedora:latest

# Устанавливаем зависимости для Nginx, PHP и MySQL
RUN dnf -y update && \
    dnf -y install nginx php php-fpm php-mysqlnd mariadb-server php-mbstring

# Копируем конфигурационные файлы
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./www /var/www/html

# Открываем порты
EXPOSE 80

# Запускаем Nginx и PHP-FPM
CMD ["sh", "-c", "nginx; php-fpm"]
```

### Пояснения к Dockerfile

1. `FROM fedora:latest`: Определяет базовый образ, использующий Fedora.
2. `RUN dnf -y update ...`: Обновляет систему и устанавливает необходимые пакеты (`nginx`, `php`, `php-fpm`, `mariadb-server`).
3. `COPY ./nginx.conf /etc/nginx/nginx.conf`: Копирует ваш файл конфигурации Nginx в контейнер.
4. `COPY ./www /var/www/html`: Копирует веб-директорию с вашими PHP-скриптами.
5. `EXPOSE 80`: Указывает, что контейнер слушает на порту 80.
6. `CMD ["sh", "-c", "nginx; php-fpm"]`: Запускает Nginx и PHP-FPM.

### Шаг 3: Создание конфигурации Nginx

Создайте файл `nginx.conf` в корне вашего проекта:

```nginx
server {
    listen 80;
    server_name localhost;

    root /var/www/html;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location /metrics {
        stub_status on;
        allow 127.0.0.1; # разрешить доступ только локально
        deny all; # закрыть доступ всем остальным
    }
}
```

### Шаг 4: Создание PHP-скрипта

Создайте директорию `www` и добавьте файл `index.php` в нее:

```php
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");

if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

$result = $mysqli->query("SELECT * FROM your_table LIMIT 2");

while ($row = $result->fetch_assoc()) {
    echo $row['your_column1'] . "<br/>";
    echo $row['your_column2'] . "<br/>";
}

$mysqli->close();
```

### Шаг 5: Сборка Docker-образа

В терминале выполните команду:

```bash
docker build -t my_lemp_stack .
```

### Шаг 6: Запуск контейнера

Запустите контейнер с помощью команды:

```bash
docker run -d -p 80:80 --name my_lemp_container my_lemp_stack
```

### Шаг 7: Проверка работоспособности

Откройте веб-браузер и перейдите по адресу `http://localhost`. Вы должны увидеть ваши строки из базы данных. Для доступа к метрикам Nginx используйте `http://localhost/metrics`.

### Пояснения к метрикам

Метрики Nginx будут содержать информацию о текущем состоянии сервера, такие как:
- `active connections`:
Ну так неплохая задача. Ставишь где-нить lemp (nginx+mysql), настраиваешь ему конфигурацию, чтобы отдавал метрики и запускал php скрипт, пишешь скрипт который лазит в базу и выдает две строки, подключаешь скрипт к nginx, и упаковываешт это в докерфайл, возможно с доп. файлами. 

Или ты хочешь, чтобы тебе прям инструкцию дали? Так если не можешь выполнить сам, значит работа тебе не подойдет, там же твою квалификацию спрашивают а не нашу
В одном контейнере, конечно же, это настраивать не нужно. А вот сделать docker-compose с 3 сервисами - nginx, php-fpm, mysql, вполне реально. Берёте нужные образы, настраиваете связку, пишете скрипты для заполнения БД и отдачи строчек.
Похожие вопросы