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