Разработка сайтов в Украинске, ДНР. Настройка современной среды разработки PHP с помощью Docker

 
 

В этом руководстве я расскажу, как лучше всего начать работу с настройкой среды разработки PHP, и покажу вам, как настроить Docker. Существует так много способов настроить среду разработки PHP, но на данный момент лучше всего использовать Docker.

Я начну с краткой истории того, как люди настраивали свою среду разработки PHP на протяжении многих лет, что привело нас к тому, что мы имеем сейчас. Но если вы предпочитаете пропустить все это и просто запустить свой сервер, вы можете сразу перейти к этапам настройки.

Немного предыстории

Одна из проблем веб-разработки заключается в том, что все меняется очень быстро. Лучшие практики CSS меняются по мере добавления в спецификацию новых свойств. (Как мы раньше справлялись без CSS Grid?) Сейчас PHP версии 8, и даже инструменты, которые мы используем для выполнения PHP-скриптов, со временем совершенствуются. В результате многие учебники довольно быстро устаревают.

Еще пару лет назад я отправлял всех, кого обучал, к отличной статье Бруно Скворца Re-introducing Vagrant: The Right Way to Start with PHP. В то время это было фантастическое введение в (тогда) лучший способ настроить локальную среду разработки.

Эта статья только из 2015 года, но пять или шесть лет — это эпоха в постоянно меняющихся временных масштабах веб-разработки. С тех пор «правильный путь» значительно продвинулся вперед.

Я быстро подытожу, как все изменилось за эти годы.

1. Ручная установка PHP, MySQL и Apache

Если вы, как и я, достаточно взрослые, чтобы заниматься разработкой веб-сайтов в 90-х, вы помните, насколько разочаровывающим был этот опыт. В то время, если бы вы были в меньшинстве, которое не просто разрабатывало на живом веб-сервере (да, мы действительно так делали, да, это была ужасная идея), вы бы вручную устанавливали Apache, PHP и MySQL на свой компьютер для разработки.

Для настройки среды разработки требовался значительный опыт. Вам нужно было знать, как настроить веб-сервер, как настроить PHP, и вам нужно было вручную установить и настроить все программное обеспечение, которое вы использовали. Это было трудоемкой и сложной задачей для начинающих разработчиков.

2. Предварительно настроенные пакеты, такие как XAMPP

К началу-середине2000-х годов люди начали собирать все необходимое программное обеспечение в один пакет, который устанавливал и настраивал все необходимое программное обеспечение. Этими пакетами были такие вещи, как XAMPP и WAMP, и одним нажатием кнопки они давали вам удобную среду разработки.

Если вы побродите по различным группам PHP в Facebook, вы обнаружите, что значительная часть новых разработчиков все еще следуют руководствам той эпохи, а большое количество существующих разработчиков так и не ушли, поэтому XAMPP по-прежнему используется довольно широко. Если это относится к вам, пора двигаться дальше.

Использование XAMPP упростило установку и запуск среды веб-разработки на вашем компьютере. В статье Бруно описываются проблемы, связанные с этим подходом, но основная проблема возникает, когда вы хотите опубликовать свой сайт в Интернете. Версии PHP, MySQL и Apache (или NGINX) могут отличаться от тех, которые вы установили как часть пакета XAMPP. Кроме того, есть пара незначительных, но неприятных различий между Windows и Linux. Если вы разрабатываете свой сайт на компьютере с Windows и загружаете его на сервер Linux, часть вашего кода может вообще не работать после загрузки.

3. Виртуальные машины и бродяги

В конце 2000-х и начале 2010-х среди разработчиков была тенденция перехода на виртуальную машину. Идея заключалась в том, что вы могли запустить копию реальной операционной системы веб-сервера со всеми установленными программами — точно такую ​​же конфигурацию и настройку, что и фактический веб-сервер, на котором вы собирались в конечном итоге развернуть свой веб-сайт. Таким образом, когда вы запускали веб-сайт, не было никаких шансов, что он не заработает.

В то время как многие программисты видели преимущества такой среды, трудности и время, необходимые для ее настройки, означали, что это сделали немногие. Так было до тех пор, пока не появился Vagrant (и связанные с ним инструменты, такие как Puppet), которые избавили вас от всех хлопот.

Взгляните на статью, на которую я ссылался ранее, для отличного описания Vagrant, виртуальных машин и преимуществ такой настройки среды разработки.

4. Докер

Вся эта предыстория подводит нас к сегодняшнему дню и к причине этой статьи. Если Vagrant такой классный, зачем использовать что-то другое?

Основные преимущества виртуальной среды, созданной с помощью Vagrant:

Ваш компьютер для разработки не привязан к определенной среде. Вы можете разместить несколько веб-сайтов: один с использованием Apache, один с использованием NGINX, один с использованием PHP 7 и один с использованием PHP 8.

Когда сайт запускается, он загружается точно в ту же среду, в которой он был разработан.

Легко понять, почему разработчики хотят этого. Следующий шаг к Docker сохраняет эти преимущества, избегая при этом некоторых недостатков сред Vagrant/Virtual Machine.

Что не так с Вагрантом?

Несмотря на преимущества, среда разработки на основе Vagrant имеет свой собственный набор ограничений и проблем.

Системные ресурсы. Vagrant требует запуска совершенно другой операционной системы. Вам необходимо загрузить и установить операционную систему, работающую на вашем веб-сервере, и все установленные на ней пакеты. При этом используется значительный объем дискового пространства и памяти. Виртуальной машине обычно требуется не менее 512 МБ ОЗУ. Это немного для современных компьютеров, но быстро увеличивается. Если вы хотите разместить один веб-сайт на PHP 7 и один на PHP 8, вам необходимо установить и настроить два разных экземпляра виртуальной машины на вашем компьютере.

Вы должны убедиться, что виртуальная машина и сервер синхронизированы. Всякий раз, когда вы обновляете сервер или изменяете конфигурацию сервера, вы должны помнить, что необходимо обновить локальную среду разработки с теми же изменениями.

Он плотно привязывает вас к серверной ОС и конфигурации. Перенос сайта с одного сервера на другой — непростая задача. Веб-сайт — это больше, чем просто PHP-скрипты, изображения и CSS, которые его составляют. Для правильной работы веб-сайта также требуется определенная конфигурация сервера (например, установленные расширения PHP и nginx.conf/).httpd.conf

Существует очень ограниченный выбор доступных пакетов. В зависимости от того, какой дистрибутив Linux работает на вашем веб-сервере, у вас может не быть выбора, какую версию PHP использовать. Если вы не установите пакеты из сторонних репозиториев, вы не сможете использовать самую последнюю и лучшую версию PHP. На момент написания PHP 8 недавно стал доступен. Если вы используете CentOS 8/RHEL 8, вы застряли на PHP 7.3, пока не получите новую версию операционной системы. Если вы используете Debian, последняя доступная версия — 7.3. В других дистрибутивах будут доступны другие версии.

Конфигурация сервера является глобальной. PHP имеет файл настроек с именем php.ini. Изменение этого параметра применяет обновленную конфигурацию ко всем веб-сайтам, размещенным на сервере. То же самое касается nginx.confNGINX или httpd.confApache. Экземпляр базы данных MySQL содержит базы данных для всех сайтов, размещенных на сервере. Внесение любых крупномасштабных изменений в конфигурацию базы данных может иметь далеко идущие последствия. Обновление настроек MySQL повлияет на каждый веб-сайт, использующий этот сервер MySQL!

Версии пакетов являются глобальными на реальном сервере. Хотя на одном и том же веб-сервере можно запускать несколько версий PHP, его сложно настроить, и он может иметь странные побочные эффекты в зависимости от того, что делает ваш скрипт (например, когда у вас есть скрипт, который вы хотите запустить в systemd unit/cronjob и забудьте, что вы должны использовать /bin/php72вместо /bin/php).

Хотя пункты 5 и 6 можно преодолеть на машине разработки, запустив разные виртуальные машины Vagrant, вам понадобится настоящий веб-сервер, который отражает каждую конфигурацию, которую вы используете, чтобы веб-сайты работали, когда вы их загружаете.

Знакомство с Докером

Docker решает все перечисленные выше проблемы. Но что такое Docker и как он работает?

Начнем с вступления из Википедии:

Docker — это набор продуктов «платформа как услуга» (PaaS), которые используют виртуализацию на уровне ОС для доставки программного обеспечения в пакетах, называемых контейнерами. Контейнеры изолированы друг от друга и содержат собственное программное обеспечение, библиотеки и файлы конфигурации; они могут общаться друг с другом через четко определенные каналы.

Прежде чем углубляться в технические аспекты, практическое преимущество для нас, как веб-разработчиков, заключается в том, что Docker позволяет нам упаковать все, что нужно веб-сайту, весь код PHP вместе с исполняемым файлом PHP, сервером MySQL и сервером NGINX в дополнение к файлам конфигурации, используемым теми. программы.

Весь код веб-сайта и точные версии программ, необходимых для запуска этого кода, упакованы вместе, фактически как одно приложение. Затем все это приложение можно запустить в любой операционной системе. Когда кто-то запускает упакованное приложение, PHP, MySQL, NGINX и все написанные вами PHP-файлы внедряются в само приложение. Более того, точные версии MySQL, NGINX и PHP являются частью пакета. Когда вы запускаете приложение, загружаются и устанавливаются точные версии этих инструментов, для которых оно было разработано.

«Разве это не то, что уже делает виртуальная машина?» Я слышу, как ты спрашиваешь. Да, но есть большая разница между тем, как Vagrant и Docker обрабатывают установку программного обеспечения.

С Vagrant, работающим на виртуальной машине, полная операционная система с определенной версией PHP, версией MySQL и (обычно) конфигурацией сервера клонируется с реального веб-сервера. При обновлении сервера виртуальная машина также должна быть обновлена.

Однако при использовании Docker версия PHP/MySQL/NGINX предоставляется в виде единого пакета, известного как образ, и сервер может запускать столько разных образов, сколько вам нужно.

Преимущество здесь в том, что веб-сервер и ваш компьютер для разработки используют один и тот же образ. Вы просто загружаете свое изображение на веб-сервер, запускаете там все приложение, и ваш веб-сайт работает без какой-либо настройки веб-сервера.

Кроме того, каждое изображение полностью отделено от другого изображения на сервере. Каждое изображение (по одному на веб-сайт в этом упрощенном примере) отделено друг от друга. Каждый веб-сайт будет иметь свою собственную конфигурацию NGINX, свои php.iniсобственные установки PHP и MySQL. На каждом веб-сайте могут работать совершенно разные версии PHP. Вы даже можете иметь один веб-сайт, работающий на Apache, и один веб-сайт, работающий на NGINX, на одном компьютере одновременно. Даже когда вы запускаете два разных веб-сайта NGINX, у вас будет два разных процесса NGINX с их собственными конфигурациями, работающими одновременно.

Это имеет небольшие накладные расходы на память, но гибкость, которую оно предоставляет, делает это очень выгодным компромиссом:

Весь веб-сайт с необходимыми версиями PHP/MySQL, всю конфигурацию и весь код можно легко перемещать. Для переноса веб-сайта на новый сервер достаточно скопировать одну папку. Вам не нужно вносить какие-либо изменения в конфигурацию PHP или NGINX на новом сервере. Вам даже не нужно устанавливать PHP или NGINX на самом сервере. Они будут автоматически установлены Docker при запуске приложения.

Вы можете запустить точно такой же образ на своем компьютере для разработки. Используя Vagrant, вы эффективно запускаете копию конфигурации/установленных пакетов сервера на том же компьютере. С Docker на вашем ПК для разработки запускается тот же образ, что и на сервере.

php.iniнастройки, nginx.confизменения конфигурации или обновление PHP до последней версии обрабатываются так же, как загрузка обновленного кода PHP на сервер. Вы обновляете приложение, и не имеет значения, изменяет ли это код PHP или обновляете php.ini.

Каждое изображение самодостаточно в так называемом «контейнере». PHP-скрипт, работающий в одном образе, не может получить доступ к файлам, работающим в другом. Думайте open_basedir, но гораздо строже. Контейнер похож на очень легкую виртуальную машину. Он действует как собственная операционная система, и код, работающий в контейнере, даже не знает, что он выполняется внутри контейнера, и не может видеть ничего вне контейнера. Если один из ваших PHP-скриптов небезопасен и дает кому-то эффективный доступ к оболочке, он может получить доступ только к файлам на сервере, к которому вы предоставили доступ контейнеру.

В отличие от виртуальной машины, если два разных веб-сайта находятся в совершенно разных контейнерах, но используют одни и те же версии NGINX или PHP, дисковое пространство и оперативная память распределяются между двумя контейнерами.

Поскольку каждое изображение является автономным, перенос веб-сайта на другой сервер очень прост. Приложение не зависит от версии PHP, установленной на сервере, и ему все равно, какие пакеты установлены на сервере. Если вы хотите переместить Dockerized-приложение на другой сервер, это так же просто, как скопировать все файлы веб-сайта и запустить приложение.

Вы можете запускать на сервере столько образов Docker, сколько захотите, каждый со своей версией PHP, программным обеспечением веб-сервера, базой данных и соответствующими файлами.

Настройка вещей

Это теория из пути. Теперь давайте приступим и создадим сервер с помощью Docker.

Предпосылки

Прежде чем мы начнем, вам нужно скачать и установить Docker. Перейдите на веб-сайт Docker, затем загрузите и установите его для своей операционной системы.

Если вы работаете в Linux, вам следует установить пакеты dockerи docker-composeчерез менеджер пакетов вашего дистрибутива. В зависимости от вашего дистрибутива вам может потребоваться:

Добавьте своего пользователя в dockerгруппу, как описано в руководстве по Docker здесь.

Запустите dockerслужбу systemctl start docker.serviceи включите ее с помощью systemctl enable docker.

Если вы используете Windows или macOS, установщик сделает это за вас.

Во-вторых, поскольку мы будем запускать веб-сервер внутри Docker и перенаправлять некоторые порты, если у вас уже есть веб-сервер (Apache, NGINX, XAMPP, IIS и т. д.) или MySQL, работающий на вашем компьютере, остановите их, прежде чем продолжить.

Начиная

Веб-сервер обычно состоит из нескольких разных программ, таких как NGINX, PHP и MySQL. В терминологии Docker каждая программа, которую вы хотите установить, является службой.

Есть несколько способов создания этих сервисов в Docker. Я расскажу о наиболее удобном для пользователя. Docker поддерживает создание файла конфигурации с использованием YAML (еще один язык разметки).

Хотя вы можете ввести все параметры в командной строке, я рекомендую использовать файл конфигурации YAML по нескольким причинам:

Это намного легче читать/понимать.

Вам не нужно повторно вводить несколько длинных команд каждый раз, когда вы хотите запустить сервер.

Вы можете отслеживать изменения в файле с помощью Git.

docker-compose.ymlдля Nginx

Docker предоставляет инструмент docker-compose, который берет файл конфигурации docker-compose.ymlи запускает службы, перечисленные в нем. Начнем с добавления веб-сервера NGINX.

Во-первых, создайте папку где-нибудь на своем компьютере, в которой будет храниться ваш сайт. Вам нужно будет регулярно возвращаться к этой папке, поэтому помните, где она находится. Создать docker-compose.ymlсо следующим содержимым:

version: '3'

services:

web:

image: nginx: latest

ports:

— «80:80»

Давайте рассмотрим конфигурацию построчно:

version: '3'

Это говорит о том docker-compose, какую версию спецификации YAML использовать. 3является последней, и разные версии имеют немного разные спецификации, ключевые слова и структуру.

За следующей строкой services: будет следовать список всех служб, которые вы хотите запустить.

В нашем примере пока вызывается только одна служба web (вы можете называть ее как угодно) с использованием официального образа NGINX: latest. Обратите внимание, что отступы с использованием пробелов (не табуляции!) имеют значение. YAML полагается на уровень вложенности для определения структуры файла.

Если вы хотите указать другую версию NGINX, вы можете указать это здесь следующим образом:

version: '3'

services:

web:

image: nginx:1.18.0

ports:

— «80:80»

Я рекомендую использовать latest, если у вас нет веских причин использовать более раннюю версию.

Блок portsнастраивает переадресацию портов. Он перенаправляет 80на локальную машину 80на изображение. Любой запрос на хост-компьютере http: //127.0.0.1будет перенаправлен на сервер NGINX, работающий в контейнере.

Запуск службы

Чтобы запустить сервер, вам нужно открыть терминал в вашей операционной системе и указать ему папку, содержащую ваш docker-compose.ymlфайл. В Windows 10 самый простой способ — использовать Проводник (ранее известный как Проводник Windows, не путать с Internet Explorer). Перейдите в папку, содержащую ваш файл docker-compose.yml, затем нажмите «Файл», а затем «Открыть Windows Powershell». В Linux большинство файловых менеджеров имеют кнопку «Открыть терминал здесь «или аналогичную кнопку. В macOS вам нужно сначала включить эту опцию.

Как только ваш терминал откроется в правильном месте, введите docker-compose up. Вы должны увидеть вывод, подобный изображенному ниже.

вывод docker-compose

Если вы получаете какие-либо сообщения об ошибках, убедитесь, что Docker установлен и работает правильно. Если вы видите вывод, как показано выше, вы можете подключиться к серверу, посетив http: //127.0.0.1 в своем браузере. Если все работает, вы увидите тестовую страницу NGINX, как показано на рисунке ниже.

Тестовая страница NGINX

Почему не Апач?

Прежде чем мы продолжим, вам может быть интересно, почему я не использую здесь Apache. Если вы использовали XAMPP или аналогичный пакет, веб-сервер, который вы используете, — это Apache. Веб-сервер — это часть сервера, которая прослушивает запросы веб-браузера и отправляет ему файлы.

Apache в порядке, и он работает, но он существует всегда. Когда был создан Apache, Интернет был совсем другим местом. Apache большой, и есть много разных функций, которые появлялись и исчезали, но которые Apache все еще поддерживает. Интернет сильно изменился с тех пор, как был создан Apache, и хотя это мощный сервер, который будет работать нормально, большинство веб-сайтов в наши дни, как правило, используют NGINX. Его проще настроить, он легче и лучше настроен для задач, которые используют многие современные веб-сайты (например, потоковое видео), и поэтому его доля на рынке быстро растет за счет Apache.

Мой общий совет: если у вас уже есть веб-сайт, на котором работает Apache, нет причин мучиться с его изменением, но если вы начинаете новый проект с нуля, используйте NGINX.

Размещение файлов на сервере

Теперь, когда сервер установлен и запущен через Docker, мы можем сделать наши файлы видимыми на сервере. Если вы привыкли к Apache, вы бы поместили их в папку httpdocs, htdocsили где- publicнибудь на вашем компьютере.

Поскольку сервер работает в контейнере, он не имеет доступа ни к одному файлу на вашем компьютере. Однако Docker позволяет вам указать том — файл или папку на вашем компьютере, которые используются совместно с контейнером. Вам понадобятся два тома: nginx.confфайл конфигурации (который мы еще не создали) и папка, в которой будут храниться файлы вашего веб-сайта. Измените свой docker-compose.yml, чтобы включить два volumes:

version: '3'

services:

web:

image: nginx: latest

ports:

— «80:80»

volumes:

-. /nginx.conf: /etc/nginx/conf.d/nginx.conf

-. /app: /app

Это делает файл nginx.confи appкаталог из той же папки, что и ваш, docker-compose.ymlдоступными в контейнере. Любые изменения, которые вы вносите в файлы в томах, немедленно изменяются в контейнере, и файлы распределяются между ними.

Файл nginx.confс хоста помещается /etc/nginx/conf.d/nginx.confвнутрь контейнера. Это папка, из которой NGINX считывает файлы конфигурации. Папка appсоздается в корне контейнера /app, и в нее вы будете помещать все PHP-скрипты, изображения и файлы JavaScript вашего веб-сайта.

Перед перезапуском сервера создайте файл nginx.confв том же каталоге, что и ваш, docker-compose.ymlсо следующим содержимым:

server {

listen 80 default_server;

root /app/public;

}

Это говорит NGINX, что это конфигурация, которую он должен использовать для сервера по умолчанию и что он должен обслуживать файлы из каталога /app/public. Мы могли бы просто обслуживать файлы из /appкаталога, но рекомендуется держать большинство файлов PHP вне общедоступного каталога. Поскольку PHP-скрипты должны будут загружать файлы с помощью... /, мы поместим наш общедоступный каталог на один уровень ниже.

Чтобы проверить его работу, создайте страницу «Hello, World» по адресу app/public/index.html, создавая каталоги по ходу работы. Содержимое может быть таким:

Hello, World!

Перезапустите сервер, вернувшись в свой терминал и нажав ctrl-c, чтобы остановить сервер, затем снова запустите команду docker-compose up, чтобы перезапустить его. (Вы можете нажать стрелку вверх, а затем Enterвместо повторного ввода.)

Перезагрузите http: //127.0.0.1 в своем браузере, и вы увидите свой Hello, World! тестовая страница. Теперь у вас есть работающий веб-сервер с вашими файлами, которые обслуживаются по адресу http: //127.0.0.1 из вашего app/publicкаталога.

PHP

Если вы хотите запускать PHP-скрипты, вам нужно добавить еще одну службу для PHP docker-compose.ymlи связать ее с nginx:

version: '3'

services:

web:

image: nginx: latest

ports:

— «80:80»

volumes:

-. /nginx.conf: /etc/nginx/conf.d/nginx.conf

-. /app: /app

php:

image: php: fpm

volumes:

-. /app: /app

Появился новый сервис php, использующий изображение php: fpm-latest. Для NGINX вам потребуется fpmпакет (FastCGI Process Manager), но вы можете выбрать любую понравившуюся версию PHP, например php:7.4-fpm, php:7.3-fpm, php:8.0-fpm. Если вы не укажете версию и используете только php: fpm, будет использоваться последняя версия, которая на момент написания была 8.0.

Поскольку PHP потребуется доступ к вашим.phpфайлам из /appкаталога, вам необходимо смонтировать том в образе PHP так же, как вы сделали это для образа NGINX. PHP не нуждается в доступе к nginx.confфайлу конфигурации, поэтому нет необходимости предоставлять ему доступ к нему.

Папка appтеперь доступна на хост-компьютере, а также в контейнерах nginxи.php

Перед перезапуском сервера docker-compose upнам нужно настроить NGINX для запуска.phpфайлов через службу PHP. Откройте свой nginx.confи измените его на следующее:

server {

listen 80 default_server;

root /app/public;

index index.php index.html index.htm;

location ~ \.php$ {

fastcgi_pass php:9000;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

Строка indexуказывает серверу искать index.phpвместо index.htmlстраницы по умолчанию. Блок locationуказывает NGINX запускать любой файл с.phpрасширением через службу PHP (fastcgi_pass php:9000, где phpимя службы, настроенной в docker-compose.yml).

Создайте phpinfoфайл по адресу app/public/index.php:

<? php

phpinfo () ;

Перезапустите сервер, нажав ctrl-cв терминале, и повторите docker-compose upкоманду. Если все настроено правильно, при посещении http: //127.0.0.1 вы должны увидеть phpinfo () вывод:

Информационная страница PHP

Предполагая, что ваш веб-сайт использует MySQL, если вы просмотрите phpinfo () страницу, вы заметите, что драйвер PHP MySQL не установлен. Мы хотим установить пакет PDO в PHP.

Это немного сложнее, так как нам нужно установить пакеты в образ. К счастью, официальный образ PHP содержит скрипт для этого.

Мы возьмем php: fpmза основу официальный образ и установим в него драйвер PDO MySQL. Это требует создания собственного имиджа, но это не так сложно, как кажется.

Во- первых, измените свой, docker-compose.ymlчтобы указать ему создавать образ для PHP, а не использовать существующий php: fpmобраз:

version: '3'

services:

web:

image: nginx: latest

ports:

— «80:80»

volumes:

-. /nginx.conf: /etc/nginx/conf.d/nginx.conf

-. /app: /app

php:

build:

context:.

dockerfile: PHP.Dockerfile

volumes:

-. /app: /app

Вместо imageзаписи теперь есть buildстрока под php. Директива context— это папка, в которой находится файл конфигурации, в нашем случае это., текущий каталог (та же папка, что и у нас docker-compose.yml) и dockerfileимя файла, который мы будем использовать для создания нашего образа.

Создайте PHP.Dockerfileв той же папке, что и ваша, docker-compose.ymlи добавьте следующее:

FROM php: fpm

RUN docker-php-ext-install pdo_mysql

Это установит pdo_mysqlрасширение для PHP. Директива FROMсообщает Docker, что он должен использоваться php: fpmв качестве базового образа, и эта RUNдиректива используется для запуска команд внутри образа. Здесь вы можете запустить любую команду Linux. В данном случае мы запускаем docker-php-ext-installскрипт, который удобно предоставляется как часть официального пакета PHP и позволяет нам устанавливать расширения PHP.

Если вы хотите использовать библиотеку MySQLi (хотя вам, вероятно, следует использовать PDO), вы можете установить ее вместо или вместе с PDO:

FROM php: fpm

RUN docker-php-ext-install mysqli

Перезагрузите сервер с помощью docker-compose upкоманды. На этот раз вы увидите намного больше вывода, поскольку он создает изображение. Он будет делать это только при первом запуске docker-compose up. Однако, если вы внесете какие-либо изменения в файл PHP.Dockerfileв будущем, вам потребуется вручную перестроить его, выполнив команду docker-compose build.

Вы можете убедиться, что pdo_mysqlрасширение было установлено, просмотрев phpinfo () вывод на http: //127.0.0.1.

Пока мы устанавливаем расширения, давайте добавим xdebugрасширение для более приятных сообщений об ошибках на нашем сервере разработки:

FROM php: fpm

RUN docker-php-ext-install pdo_mysql

RUN pecl install xdebug && docker-php-ext-enable xdebug

xdebugустанавливается через pecl, который предоставляется как часть официального образа PHP. Пересоберите образ с помощью docker-compose build, затем перезапустите сервер с помощью docker-compose up. Вывод phpinfo () должен показать, что оба pdo_mysqlи xdebugустановлены.

MySQL

Теперь мы готовы установить MySQL. Еще раз, мы добавим его как сервис в docker-compose.yml. Однако вместо установки официального образа MySQL мы будем использовать MariaDB, замену с потенциально лучшими будущими условиями лицензирования, поскольку MySQL принадлежит Oracle. Если вы раньше использовали MySQL, MariaDB будет работать точно так же:

version: '3'

services:

web:

image: nginx: latest

ports:

— «80:80»

volumes:

-. /nginx.conf: /etc/nginx/conf.d/nginx.conf

-. /app: /app

php:

build:

context:.

dockerfile: PHP.Dockerfile

volumes:

-. /app: /app

mysql:

image: mariadb: latest

environment:

MYSQL_ROOT_PASSWORD: 'secret’

MYSQL_USER: 'tutorial’

MYSQL_PASSWORD: 'secret’

MYSQL_DATABASE: 'tutorial’

volumes:

— mysqldata: /var/lib/mysql

ports:

— 3306:3306

volumes:

mysqldata: {}

Мы используем изображение mariadb: latest. Как и в случае с NGINX и PHP, при желании вы можете указать здесь конкретную версию MariaDB.

На этот раз есть environmentблок, который используется для передачи некоторых переменных в контейнер при его создании. Они используются для настройки базы данных со следующими параметрами. Установите собственные значения для следующих переменных:

MYSQL_ROOT_PASSWORD: пароль root для базы данных. Вы можете использовать это для входа в систему rootи управления базой данных.

MYSQL_USERи MYSQL_PASSWORD: имя и пароль для пользователя MySQL, который создается с ограниченными разрешениями. Вы захотите использовать это из своих PHP-скриптов.

MYSQL_DATABASE: имя автоматически создаваемой схемы, к которой имеет доступ указанный выше пользователь.

В приведенном выше примере создается база данных с именем tutorial, доступ к которой можно получить с помощью пользователя tutorialи пароля secret.

Вы также заметите, что volumesвнизу есть запись. Это создает специальный тип тома, который не отображается в локальной файловой системе. Здесь будут храниться данные для MySQL — все ваши таблицы, записи и т. д.

Причина, по которой мы не хотим использовать папку в локальной файловой системе, заключается в том, что когда приложение загружается на реальный веб-сервер, вы не хотите перезаписывать реальную базу данных своей тестовой. Здесь будут храниться все ваши записи среды тестирования/разработки. Это позволяет вам иметь разные базы данных на рабочем сервере и сервере разработки, когда вы загружаете свой веб-сайт.

Наконец, portsблок предоставляет порт 3306, поэтому мы можем подключиться к нему с помощью клиента, такого как MySQL Workbench, для управления базой данных. Я настоятельно рекомендую использовать это поверх PHPMyAdmin, если вы к этому привыкли, хотя вы можете поместить PHPMyAdmin в app/publicпапку и запустить его оттуда, если хотите.

Перезагрузите сервер. Первая загрузка и настройка MariaDB займет минуту или две. Затем в сценарии PHP попробуйте подключиться к MySQL с помощью PDO и выбранного вами имени пользователя, пароля и имени базы данных:

<? php

$pdo = new PDO ('mysql: dbname=tutorial; host=mysql’, 'tutorial’, 'secret’, [PDO: ATTR_ERRMODE => PDO: ERRMODE_EXCEPTION]) ;

$query = $pdo→query ('SHOW VARIABLES like «version»') ;

$row = $query→fetch () ;

echo 'MySQL version:'. $row['Value’];

Запустите этот скрипт на сервере. Если вы видите версию MySQL и никаких сообщений об ошибках, значит, вы подключены к серверу MySQL и все настроено правильно.

Готово!

Как вы только что обнаружили, Docker требует небольшой настройки, если вы делаете это самостоятельно. Если вы используете существующие docker-compose.ymlи конфигурационные файлы, это может быть всего пара команд.

Когда вы запустите свой веб-сайт, вы просто загрузите весь проект, включая docker-compose.yml, nginx.confи PHP.Dockerfile, запустите docker-compose up -dна сервере (-dфлажок запускает его как службу в фоновом режиме), и на нем будет работать точно такой же веб-сайт, который вы видите на своем машина развития! Вам не нужно вручную настраивать и устанавливать PHP, MariaDB и NGINX на веб-сервере.

Как только вы освоитесь, вы никогда не оглянетесь назад. Docker значительно упрощает процесс разработки веб-сайта, потому что все самодостаточно.

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая