• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Стаття також доступна російською (перейти до перегляду).

docker nginx + php + mysql

Вступ

Процес створення сучасного 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

Стан сервісу Docker Engine

Стан сервісу Docker Engine

На виході отримали наступний результат: Client: Docker Engine – Community, Version:25.0.3, що говорить про наявність встановленого сервісу.

Встановимо плагін Compose:

$ apt  install docker-compose

Встановлення плагіну Compose

Процес встановлення Compose

Процес встановлення Compose

Результат: Setting up docker-compose ..., тобто плагін успішно встановлений.

Перевірити версію плагіна можна за допомогою наступної команди:

$ docker-compose --version

Версія Compose

Версія – 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.yml

Збережемо внесені зміни та вийдемо з редактору.

Запустимо Docker Compose, котрий в автоматичному режимі створить конфігурацію середовища відповідно до інструкцій файлу docker-compose.yml. Для цього введемо в терміналі:

$ docker-compose up -d

Запуск Docker Compose

Вихід команди:

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.

Робота 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; 
    	} 
	}

код файлу конфігурації web-серверу

Збережемо внесені зміни та вийдемо з редактору.

Створимо Dockerfile, щоб можна було скопіювати створений раніше файл default.conf:

$ nano web/Dockerfile

Вставимо наступний код:

FROM nginx
 COPY ./default.conf /etc/nginx/conf.d/default.conf

Код файлу Dockerfile

Збережемо зміни та закриємо файл.

Створення 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

Код файлу Dockerfile

Оновимо 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.yml

Збережемо зміни та вийдемо з редактору.

Введемо команду запуску контейнерів у фоновому режимі:

$ docker-compose up -d

Pапуск контейнерів у фоновому режимі

Запуск контейнерів у фоновому режимі

Переконаємося, що 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.yml

Збережемо зміни та вийдемо з редактору.

Запустимо контейнер:

$ 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

Cтворення сеансу CLI

Встановимо root-доступ до бази:

# mariadb -u root -pmariadb

Встиановлення root-доступу до бази

Створимо користувача бази:

MariaDB > CREATE USER 'dbuser'@'%' IDENTIFIED BY "dbuser333";

Створення користувача для бази даних

Розширимо для нього права:

MariaDB > GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%';
        	FLUSH PRIVILEGES;

Назначення привілегій користувачу

Вийдемо з оболонки MariaDB:

MariaDB > exit

Вихід із оболнки MariaDB

Наведемо код створення таблиці та завантаження записів з даними до бази:

# 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
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA