Розгортання Laravel за допомогою Docker на Elastic Beanstalk

Посібник з розгортання веб-додатку на Laravel в AWS Elastic Beanstalk за допомогою контейнеризації Docker

Ця стаття зосереджена на розгортанні додатку Laravel в AWS Elastic Beanstalk з використанням образу Ubuntu 20.04 LTS для інстансу, у простих конфігураціях, зручних для розробників, для цілей розробки.

Передумови для продовження

  1. Основи команд Laravel
  2. Основи команд Docker
  3. Основи команд Linux
  4. Основи роботи з консоллю AWS для створення EB

Розгортання додатку Laravel в AWS EB

Увійдіть до консолі AWS та знайдіть або перейдіть до консолі Elastic Beanstalk, як показано на зображенні нижче, та натисніть на створення інстансу для створення сервера.

pic

Створення додатку Elastic Beanstalk

Далі потрібно створити додаток EB. Для цього натискайте кнопку Створити додаток (Create Application), як показано на попередньому зображенні.

Тепер потрібно ввести інформацію про додаток, як показано на зображенні нижче: змініть ім'я додатку на назву вашого проекту, виберіть платформу як Docker, використовуйте останню версію і натисніть Створити додаток (Create Application), як показано на зображенні.

pic

Зачекайте, поки додаток буде створений. Ви побачите журнал створення додатку, як показано на зображенні.

pic

Через деякий час ви будете перенаправлені на сторінку додатку, як показано на зображенні нижче.

pic

Тепер ми повинні контейнеризувати наш PHP додаток на Laravel. Перейдіть до кореня вашого проекту, відкрийте його у вашому улюбленому редакторі, я використовую Vscode, і створіть файл Dockerfile в корені проекту, як показано на зображенні нижче, і додайте в нього команди Docker.

FROM php:7.4-fpm  

# Встановлення необхідних системних пакетів та PHP-розширень  
RUN apt-get update && apt-get install -y \  
 libpng-dev \  
 libzip-dev \  
 libonig-dev \  
 libxml2-dev \  
 zip \  
 unzip \  
 && docker-php-ext-install pdo_mysql \  
 && docker-php-ext-install gd \  

 && docker-php-ext-install exif \  
 && docker-php-ext-install gettext \  
 && docker-php-ext-install pcntl \  
 && docker-php-ext-install shmop \  
 && docker-php-ext-install sockets \  
 && docker-php-ext-install sysvmsg \  
 && docker-php-ext-install sysvsem \  
 && docker-php-ext-install sysvshm  

# Встановлення Nginx  
RUN apt-get update && apt-get install -y nginx  

# Налаштування Nginx для обробки PHP-файлів  
RUN rm /etc/nginx/sites-enabled/default  
COPY nginx.conf /etc/nginx/sites-enabled/default  

# Встановлення Composer  
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \  
 && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \  
 && php -r "unlink('composer-setup.php');"  

# Встановлення робочого каталогу  
WORKDIR /var/www/html  

# Копіювання коду в контейнер  
COPY .

текст перекладу
/var/www/html/  

## Встановлення залежностей  
RUN composer install  

## Встановлення прав доступу для каталогів storage та bootstrap  
RUN chgrp -R www-data storage bootstrap/cache && \  
 chmod -R ug+rwx storage bootstrap/cache  

RUN php artisan migrate  

RUN php artisan optimize:clear  

## Відкриття порту 80  
EXPOSE 80  

## Запуск Nginx та PHP-FPM  
CMD service nginx start && php-fpm && --restart=on-failure

pic

Dockerfile

У цьому прикладі ми використовуємо php:7.4-fpm як базовий образ для запуску нашого додатку, а також Nginx для маршрутизації Laravel-додатку з контейнера Docker. Тепер ми хочемо створити конфігурацію для Nginx, для цього створіть файл nginx.conf в кореневому каталозі вашого проєкту, як показано нижче.

server {  
 listen 80;  
 server_name localhost;  

 root /var/www/html/public;  
 index index.php;  

 access_log /var/log/nginx/access.log;  
 error_log /var/log/nginx/error.log;  

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

 location ~ \.php$ {  
 fastcgi_pass localhost:9000;  
 fastcgi_index index.php;  
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
 include fastcgi_params;  
 }  

 location ~ /\.ht {  
 deny all;  
 }  
}

Таким чином, Nginx допомагає обслужити додаток на порту 80, коли контейнер буде створено.

Далі нам потрібно створити базу даних для нашого додатку. Ми використовуємо AWS RDS як базу даних, тому створимо її на AWS.

Увійдіть в консоль AWS, знайдіть або перейдіть до консолі RDS, як показано на зображенні, і натисніть "Create database" для створення сервера.

pic

Створення RDS

Тут ми вибираємо варіант "Engine" як MySQL, оскільки наш додаток працює з MySQL.

pic

Частина 1

Далі у відповідних полях потрібно ввести DB Instance Identifier (1) — назву вашої бази даних, Master Username (2) для бази даних, а також Master Password для бази даних. Пам'ятайте, що Master Username і Master Password будуть використовуватися як DBUSERNAME та DBPASSWORD. Потім виберіть конфігурацію інстансу згідно з потребами вашого проєкту (я вибрав db.t3.micro, щоб зменшити витрати, але ви можете збільшити розмір інстансу пізніше).

pic

Частина 2

Після заповнення вищезазначених полів, прокрутіть вниз і ви побачите ще кілька полів для заповнення:

Public access: Виберіть "Yes", оскільки нам потрібно протестувати базу даних на нашій локальній машині, але після завершення тестування та розгортання поверніться та змініть на "No" для забезпечення безпеки.

Потім змініть порт бази даних на потрібний та надайте ім'я базі даних, яку ви хочете створити.

pic

Після заповнення всіх полів натисніть кнопку "Create database" і зачекайте, поки база даних буде створена. Пам'ятайте, що облікові дані, які ви заповнили, потрібно буде додати в файл .env.

Після успішного створення ви отримаєте консоль бази даних, як показано на зображенні, і візьмете звідти ендпоінти, що будуть використовуватися як DB_HOST для вашого додатку.

pic

Створення RDS

Далі потрібно оновити правила груп безпеки для відкриття порту MySQL. Для цього перейдіть до Security Groups та знайдіть групу безпеки для RDS.

Тепер вам потрібно оновити правила групи безпеки для відкриття порту RDS (для тестування). Перейдіть до RDS і знайдіть групу безпеки.

pic

Група безпеки RDS

Натисніть на групу безпеки (я вибрав стандартну, але досвідчені користувачі можуть створити свою групу безпеки). Ви будете перенаправлені на сторінку, як показано на зображенні нижче.
текст перекладу
pic

Security Groups

Натисніть на групу безпеки та додайте нове правило для вхідного трафіку, як показано на зображенні, і збережіть зміни.

pic

Оновлення правила

Після виконання всіх кроків потрібно додати поля для бази даних у файл .env вашого додатку.

Перейдіть до файлу .env в кореневому каталозі вашого проєкту та додайте значення, як показано на зображенні нижче.

pic

.env налаштування

Тепер нам потрібно зробити пробний запуск для створення Docker-образу. Для цього відкрийте термінал у VSCode і введіть наступну команду для створення Docker-образу.
текст перекладу
Ви можете змінити ім'я projectx на будь-яке інше.

docker build -t projectx .

pic

docker build

Цей процес побудує проєкт і чекатиме завершення побудови.

pic

Створення образу

Після завершення побудови ви отримаєте повідомлення про успіх без помилок.

pic

Успішне створення

Далі перевірте зображення, які ви створили, виконавши наступну команду:

docker images

pic

Далі потрібно протестувати, чи правильно працюють Docker-образи. Для цього потрібно запустити Docker-образ за допомогою наступної команди. Зверніть увагу на ваш image ID і вставте його в відповідну частину.

docker run -dp 80:80 

pic

Після цього контейнер має запуститися успішно, і вам потрібно перевірити працюючий контейнер, виконавши наступну команду:

docker ps

pic

Якщо ви не бачите жодного контейнера, запустіть команду:

docker ps -a

Ця команда відобразить виведення з усіма завершеними контейнерами, і ви можете перевірити журнали контейнера, щоб дізнатися, чому він знаходиться в стані "Exited", за допомогою:

docker logs 

Якщо все працює нормально за допомогою першої команди docker ps, можете продовжувати.

Тепер потрібно отримати IP-адресу Docker-контейнера. Для цього виконайте наступну команду:

docker inspect 

pic

Інспектування контейнера

pic

Запишіть IP-адресу та вставте її у браузер, щоб побачити результат.

Після успішного Docker-зустрічі та тестування на вашій локальній машині, тепер потрібно завантажити це в середовище Elastic Beanstalk. Для цього потрібно встановити AWS CLI на вашу систему.

НАТИСНІТЬ ТУТ ДЛЯ ІНСТАЛЯЦІЇ AWS CLI

Після цього перейдіть до налаштувань безпеки у верхньому правому меню вашого облікового запису AWS, як показано на зображенні нижче.

pic

Головне меню налаштувань AWS

Далі перейдіть до Access Key і створіть новий ключ доступу, запишіть Access Key ID та Secret Key ID.

pic

Створення ключів доступу

Введіть наступну команду в терміналі, як показано на зображенні нижче, і введіть необхідні дані.

pic

Тепер перейдіть до каталогу вашого проєкту, відкрийте термінал і ініціалізуйте Elastic Beanstalk (EB), виконавши наступну команду. Оберіть регіон, в якому ви створили EB (для мого проєкту це ap-south-1 (Мумбаї), тому я вибираю 6 і натискаю Enter).

eb init

pic

Вибір регіону для розгортання EB

Далі вас запитають про ім'я проєкту. Виберіть ім'я проєкту, який ми раніше створили в EB, або ви можете створити новий EB. Я вибираю вже створений проєкт.

pic

Вибір проєкту

Далі вас запитають, чи хочете ви завантажувати код через CodeCommit. Оскільки в цьому посібнику я показую, як код буде безпосередньо завантажуватися з вашої локальної машини та Docker Hub, я вибираю n та натискаю Enter.

pic

Вибір методу завантаження коду

Тепер все налаштовано! Ви побачите нову папку для конфігурацій EB та файлів, як показано на зображенні нижче.
текст перекладу
pic

Конфігурації EB

Далі потрібно створити файл Dockerrun.aws.json, як показано на зображенні нижче.
текст перекладу
Файл визначає місце розташування Docker-образу, порти для відкриття, змінні середовища та інші деталі, необхідні для запуску Docker-контейнера на Elastic Beanstalk.

pic

Dockerrun.aws.json

Зверніть увагу, що ім'я образу вказано як назва вашого проєкту, який ви створили.

Для просунутих користувачів, які можуть вказати змінні середовища разом із цим, створивши секрети

pic

Далі ми можемо розгорнути наш код на EB безпосередньо, запустивши нижченаведену команду з кореня вашої проєктної директорії, і почекати, поки він буде розгорнутий.

eb deploy

pic

eb deploy

pic

EB розгортання в AWS Beanstalk

Після очікування ви отримаєте виведення в терміналі, як-от Environment update completed successfully, і зможете перевірити лінк EB, щоб побачити застосунок.

pic

pic

Далі потрібно забезпечити безпеку нашої бази даних та її портів. Оскільки ми відкрили порти БД для тестування на локальному середовищі, ми хочемо зробити її приватною та дозволити доступ лише з EB. Для цього йдемо в RDS, знаходимо групу безпеки VPC і змінюємо вхідні правила, як показано на зображеннях нижче.

pic

RDS Security Groups

pic

Редагування вхідних правил

Знайдіть групу безпеки для вашого Elastic Beanstalk і виберіть її, як показано на зображенні нижче, замість 0.0.0.0/0.

pic

Вхідне правило групи безпеки встановлено на групу безпеки EB

Все готово!!!

Перекладено з: Docker Deploy Laravel In Elastic Beanstalk

Leave a Reply

Your email address will not be published. Required fields are marked *