0

Как с помощью docker запустить окружение для разработки nginx + php + mysql

Создание проекта 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)) { ?>

Добавить комментарий

Облачная платформа

Свежие комментарии

Подписка

Лучшие статьи

WordPress › Ошибка

На сайте возникла критическая ошибка.

Узнайте больше про решение проблем с WordPress.