Розгортання 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, як показано на зображенні нижче, і натисніть "Create instance" для створення сервера.

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 -  
 zip \  
 unzip \  
 && docker-php-ext-install pdo_mysql \  
 && docker-php-ext-install gd \  
 && docker-php-ext-install zip \  
 && docker-php-ext-install opcache \  
 && docker-php-ext-install bcmath \  
 && docker-php-ext-install calendar \  
 && docker-php-ext-install exif \  
 && docker-php-ext-install gettext \  
 && docker-php-ext-install pcntl \  
 && docker-php-ext  
 && 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

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

pic

Частина 1

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

pic

Частина 2

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

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

Далі змініть порт бази даних за бажанням і дайте ім'я базі даних.

pic

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

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

pic

Створення RDS

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

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

pic

Безпекова група RDS

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

Безпекові групи

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

pic

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

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

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

pic

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

Тепер нам потрібно зробити пробний запуск для створення образу Docker. Щоб побудувати образ Docker, відкрийте термінал у vscode і введіть нижчевказану команду для побудови Docker-образу.
Ви можете змінити назву проекту на будь-яку іншу

docker build -t projectx .

pic

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

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

pic

Побудова образу

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

pic

Успішна побудова

Тепер перевірте образи, які ви побудували, за допомогою наступної команди:

docker images

pic

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

docker run -dp 80:80 

pic

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

docker ps

pic

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

docker ps -a

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

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

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

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

pic

Вибір способу розгортання коду через Code Commit

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

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

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

pic

Dockerrun.aws.json

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

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

pic

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

eb deploy

pic

eb deploy

pic

EB deploying in AWS Beanstalk

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

pic

pic

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

pic

RDS Security Groups

pic

Edit Inbound rules

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

pic

Security Group Inbound is Set to EB Security group

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

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

Leave a Reply

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