Стаття також доступна російською (перейти до перегляду).
Вступ
Процес створення сучасного PHP-додатку нині неможливо уявити без використання контейнерного середовища, яке значно підвищує ефективність розробки порівняно із звичайними умовами. Інструмент Docker, котрий ми розглядали у одній із попередніх статей, здатний забезпечити існування середовища, у котрому в автоматичному режимі буде здійснюватися оркестрування контейнерів додатку, кількість яких майже не обмежена. Розглянемо послідовність дій для розгортання середовища та створення контейнерів для компонентів додатку.
Передумови
У нашому розпорядженні є VPS-сервер під управлінням Ubuntu 22.04, на котрому і будуть здійснюватися всі необхідні налаштування.
Базовий інструмент Docker Engine здатний забезпечити роботу лише одного контейнеру, що недостатньо для створення повноцінного середовища. За допомогою плагіну Compose можна вирішити це питання, оскільки саме він здатний забезпечити управління та взаємодію між різними контейнерами у межах робочого середовища. Отже, цей плагін необхідно буде встановити.
Конфігурування середовища Docker Compose зазвичай здійснюється за допомогою файлу docker-compose.yml, як ми це продемонстрували раніше у нашій статті. І тому ми використаємо його у своєму проекті.
Конфігурація проекту буде складатися із набору служб або контейнерів, котрі будуть містити наступні компоненти додатку – PHP, веб-сервер Nginx та база даних Mysql. У проекті буде використана одна з гілок Mysql – MariaDB, котра повністю з нею сумісна та має кращі характеристики.
На етапі розгортання проекту буде здійснюватися контроль його стану на основі аналізу стану кожного із компонентів додатку.
Підготовка середовища Docker Compose
Для початку, перевіримо стан сервісу Docker Engine на нашому сервері. Для цього введемо в терміналі:
$ docker info
На виході отримали наступний результат: Client: Docker Engine – Community, Version:25.0.3, що говорить про наявність встановленого сервісу.
Встановимо плагін Compose:
$ apt install docker-compose
Результат: Setting up docker-compose ..., тобто плагін успішно встановлений.
Перевірити версію плагіна можна за допомогою наступної команди:
$ docker-compose --version
Версія – docker-compose version 1.29.2.
Створення проекту Compose
Підготовка контейнерного середовища розробки веб-додатку ототожнюється зі створенням проекту Compose. І тому починати треба зі створення каталогу проекту Compose. Його ім’я – new_compose_project. Створимо каталог, після чого перейдемо до нього.
Введемо в терміналі:
$ mkdir new_compose_project $ cd new_compose_project
У цьому ж каталозі буде розміщуватися файл docker-compose.yml, до котрого ми поступово будемо вносити нові дані по мірі додавання чергового компоненту.
Створення Nginx-контейнеру та його налаштування
Для запуску та налаштування контейнеру відкриємо файл docker-compose.yml та внесемо до нього наступні зміни:
$ nano docker-compose.yml version: "3.9" services: nginx: image: nginx:latest container_name: web-container ports: - 80:80
Тут ми вказали первісний образ, з якого буде розгортатися веб-сервер, ім’я контейнеру та порт, на котрому він буде працювати.
Збережемо внесені зміни та вийдемо з редактору.
Запустимо Docker Compose, котрий в автоматичному режимі створить конфігурацію середовища відповідно до інструкцій файлу docker-compose.yml. Для цього введемо в терміналі:
$ docker-compose up -d
Вихід команди:
Creating network "new_compose_project_default" with the default driver Pulling nginx (nginx:latest)... .................. Status: Downloaded newer image for nginx:latest Creating web-container ... done
В результаті була створена розгалужена мережа проекту зі стандартним драйвером та запущений контейнер для веб-серверу Nginx.
Переконатися в тому, що контейнер запущений можна за допомогою наступної команди:
$ docker ps
Вихід:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3cbacd13273a nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp web-container
Можна переконатися, що контейнер із ім’ям web-container створений та запущений, тобто є активним. Вказаний порт, на якому він працює, його ID (3cbacd13273a) та ім’я.
Продивитися результати роботи запущеного компоненту можна у веб-режимі. Для цього наберемо в адресній строчці браузеру:
http://178.20.159.96:80/
Тут 178.20.159.96 – IP-адреса нашого серверу, 80 – порт, на якому працює Nginx.
Нижче вказаний результат роботи веб-серверу. Це є вітальна сторінка веб-серверу Nginx.
Створимо каталог для веб-серверу:
$ mkdir web
Створимо файл конфігурації веб-серверу, необхідний для запуску веб-додатку:
$ nano web/default.conf
Внесемо до нього наступний код:
server { listen 80 default_server; root /var/www/html; index index.html index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/error.log error; sendfile off; client_max_body_size 100m; location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 300; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; } location ~ /.ht { Alter; } }
Збережемо внесені зміни та вийдемо з редактору.
Створимо Dockerfile, щоб можна було скопіювати створений раніше файл default.conf:
$ nano web/Dockerfile
Вставимо наступний код:
FROM nginx COPY ./default.conf /etc/nginx/conf.d/default.conf
Збережемо зміни та закриємо файл.
Створення PHP-контейнера додатку
Цей контейнер буде містити код нашого веб-проекту.
У кореневому каталозі проекту створимо каталог для PHP-коду:
$ mkdir php
У створений каталог із ім’ям php можна скопіювати або клонувати PHP-код нашого веб-проекту з будь-якого джерела, наприклад, із github-репозиторію:
git clone https://github.com/compose-private-limited/php-project.git ~/new_compose_project/php/
Створимо Dockerfile для контейнеру:
$ nano php/Dockerfile
Внесемо до нього наступний код:
FROM php:7.0-fpm RUN docker-php-ext-install mysqli pdo pdo_mysql RUN docker-php-ext-enable mysqli
Оновимо YML-файл з урахуванням появи нового PHP-компоненту:
$ nano docker-compose.yml
Оновлений код:
version: "3.9" services: nginx: build: ./web/ ports: - 80:80 volumes: - ./php/:/var/www/html/ php: build: ./php/ expose: - 9000 volumes: - ./php/:/var/www/html/
Збережемо зміни та вийдемо з редактору.
Введемо команду запуску контейнерів у фоновому режимі:
$ docker-compose up -d
Переконаємося, що PHP-контейнер є активним. Введемо у терміналі:
$ docker ps
Вихід:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 886985e06db7 new_compose_project_php "docker-php-entrypoi…" 5 minutes ago Up 5 minutes 9000/tcp new_compose_project_php_1
Можна переконатися, що контейнер із ім’ям new_compose_project_php_1 запущений. Його ID - 886985e06db7.
Для того, що побачити результати роботи php-додатку у веб-режимі, достатньо у браузері перейти за посиланням:
http://ip-сервера
Створення контейнеру бази даних MariaDB
Нам залишилося створити MariaDB-компонент у якості окремого контейнеру та налаштувати його для роботи з нашим додатком.
Оновимо YAML файл проекту:
$ nano docker-compose.yml
Додамо до нього наступний код:
db: image: mariadb volumes: - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: mariadb MYSQL_DATABASE: mybase volumes: mysql-data:
Тут ми вказали первісний образ для розгортання бази, каталог розміщення програми, пароль доступу для root-користувача, назву бази даних. Увесь код файлу показаний у вікні редактору.
Збережемо зміни та вийдемо з редактору.
Запустимо контейнер:
$ docker-compose up -d
Вихід:
Creating volume "new_compose_project_mysql-data" with default driver Pulling db (mariadb:)... ............ Status: Downloaded newer image for mariadb:latest new_compose_project_php_1 is up-to-date Starting new_compose_project_nginx_1 ... done Creating new_compose_project_db_1 ... done
Можна переконатися, що контейнер із ім’ям new_compose_project_db_1 створений.
Переконаємося, що він активний:
$ docker ps
Результат:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b79fc6879274 mariadb "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 3306/tcp new_compose_project_db_1 886985e06db7 new_compose_project_php "docker-php-entrypoi…" 4 hours ago Up 4 hours 9000/tcp new_compose_project_php_1
Контейнер запущений. Його ID - b79fc6879274.
Здійснимо серію налаштувань для нашої бази.
Для цього створимо сеанс CLI усередині контейнеру, використовуючи його ID:
$ docker exec -it b79fc6879274 /bin/sh
Встановимо root-доступ до бази:
# mariadb -u root -pmariadb
Створимо користувача бази:
MariaDB > CREATE USER 'dbuser'@'%' IDENTIFIED BY "dbuser333";
Розширимо для нього права:
MariaDB > GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%'; FLUSH PRIVILEGES;
Вийдемо з оболонки MariaDB:
MariaDB > exit
Наведемо код створення таблиці та завантаження записів з даними до бази:
# cat > db_script.sql <<-EOF USE mybase; CREATE TABLE food (id mediumint(8) unsigned NOT NULL auto_increment,Nameone varchar(255) default NULL,Pricenew varchar(255) default NULL, Url varchar(255) default NULL,PRIMARY KEY (id)) AUTO_INCREMENT=1; INSERT INTO food (Nameone,Pricenew,Url) VALUES ("Apple","100","c31.png"),("Lemon","200","c32.png"),("Orange","300","c33.png"),("Mandarin","50","c35.png"),("Banana ","90","c36.png"),("Kiwi","20","c37.png"),("Cucumber","80","c38.png"),("Pepper","150","c34.png"); EOF
Запустимо сценарій:
# mariadb -u root -pmariadb < db_script.sql
Вийдемо з оболонки контейнеру:
# exit
Компонент налаштований та готовий до роботи.
Для того, щоб під час роботи додатку дані коректно вибиралися з бази, у PHP-коді необхідна наявність коду, котрий наведений нижче:
<?php $link = mysqli_connect('db', 'dbuser', 'dbuser333', 'mybase'); if ($link) { $res = mysqli_query($link, "select * from food;"); while ($row = mysqli_fetch_assoc($res)) { ?>
Переглянути остаточні результати роботи веб-додатку можна за посиланням:
http://ip-сервера або http://localhost
Дата-центр FREEhost.UA пропонує VPS сервер із Docker. Крім базового програмного забезпечення, збирання включає візуальний інструмент управління контейнерами - Portainer. З його допомогою Ви зможете керувати контейнерами, іміджами та багатьом іншим. Вже через кілька хвилин після підтвердження замовлення повністю настроєний сервер готовий до роботи.
Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
Дата: 27.03.2024 Автор: Олександр Ровник
|
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus