• База знаний
  • /
  • Блог
  • /
  • 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

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

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

Убедимся, что 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