7: Настройка MySQL
Настроив PHP и Nginx, вы можете включить MySQL как базу данных для приложения.
Для MySQL нужно создать файл my.cnf в каталоге mysql. Этот файл мы привязали к файлу /etc/mysql/my.cnf внутри контейнера в разделе 2. Привязка монтируемого образа позволяет игнорировать все параметры my.cnf, когда это потребуется.
Чтобы посмотреть, как это работает, давайте добавим в файл my.cnf параметры, которые включают лог общих запросов и задают лог-файл.
Создайте каталог mysql:
Создайте файл my.cnf:
Поместите в файл следующий код, чтобы включить лог запросов и задать расположение лога:
Файл my.cnf включает лог, задавая параметру general_log значение 1. Параметр general_log_file указывает, где будут храниться логи.
Сохраните файл и закройте его.
Все готово, пора запускать контейнеры.
Подключение из-за пределов контейнера
Подключиться к экземпляру SQL Server на компьютере Docker можно также с помощью любого внешнего инструмента в macOS, Windows или Linux, поддерживающего подключения SQL.
В следующем примере используется sqlcmd вне контейнера для подключения к SQL Server, запущенному в контейнере. В этом примере предполагается, что в среде вне контейнера, из которой происходит подключение, уже установлены средства командной строки SQL Server. При использовании других средств действует тот же принцип, но процесс подключения является уникальным для каждого средства.
-
Определите IP-адрес компьютера, на котором размещен контейнер. В Linux используйте команды ifconfig или IP-адрес. В Windows используйте команду ipconfig.
-
В этом примере установите средство sqlcmd на клиентском компьютере. Дополнительные сведения см. в статье Установка sqlcmd в Windows или Установка sqlcmd в Linux.
-
Запустите sqlcmd, указав IP-адрес и порт, сопоставленный с портом 1433 в контейнере. В данном примере это тот же порт 1433, что и на хост-компьютере. Если на хост-компьютере был указан другой сопоставленный порт, используйте его здесь. Кроме того, чтобы разрешить подключение, необходимо открыть соответствующий входящий порт в брандмауэре.
-
Выполните команды языка Transact-SQL. По завершении введите .
Другие распространенные средства для подключения к SQL Server:
- Visual Studio Code
- SQL Server Management Studio (SSMS) в Windows;
- Azure Data Studio
- mssql-cli (предварительная версия).
- PowerShell Core
Composer user
Осталось решить проблему с пользователем. и создаются от . Если не указано другое, то в самом контейнере используется тоже root. Это легко проверить:
FROM composer:latest AS composer FROM php:7.2.3 COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt update && apt install -y git RUN whoami WORKDIR /app
Соберите контейнер:
docker build -t php-composer:3.1 . Output: Step 5/6 : RUN whoami ---> Running in 8707eba18a3b root ... Successfully tagged php-composer:3.1
Если вы хотите, чтобы vendor оставался за тем пользователем, которого вы создали сами, то можно использовать два пути. Первый — с помощью инструкции USER добавить нужного пользователя во время сборки контейнера. Второй — запускать контейнер от пользователя, используя .
Dockerfile USER
Обновите Docker-файл:
FROM composer:latest AS composer FROM php:7.2.3 COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt update && apt install -y git RUN adduser phpcomposeruser USER phpcomposeruser RUN whoami RUN id WORKDIR /app
Соберите новый контейнер:
docker build -t php-composer:3.2 .
Удалите каталог и файл :
sudo rm -rf vendor/ && sudo rm composer.lock
Соберите проект, используя версию 3.2:
docker run -ti --volume $(pwd)/:/app php-composer:3.2 composer install
Проверьте файлы:
ls -l Output: -rw-r--r-- 1 sample sample 142 Dec 13 15:21 composer.json -rw-r--r-- 1 sample sample 8286 Dec 13 15:21 composer.lock -rw-r--r-- 1 sample sample 222 Dec 13 15:18 Dockerfile drwxr-xr-x 6 sample sample 4096 Dec 13 15:21 vendor
Здесь может быть неверно определено имя пользователя. Если это так, вернитесь к логам сборки
Обратите внимание на. Там указан UID пользователя
— это дефолтный пользователь на хосте. Тот пользователь, которого вы создали, будет иметь . Его права на каталог ограничены.
Запуск контейнера от пользователя
Второй способ — запускать контейнер от конкретного пользователя с помощью.
Уберите из Docker-файла . Верните первоначальный вид:
FROM composer:latest AS composer FROM php:7.2.3 COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt update && apt install -y git WORKDIR /app
Соберите версию 3.3:
docker build -t php-composer:3.3 .
Удалите каталог vendor и файл :
sudo rm -rf vendor/ && sudo rm composer.lock
Соберите проект, добавив :
docker run --user phpcomposeruser -ti --volume $(pwd)/:/app php-composer:3.3 composer install
В терминале отобразится ошибка:
docker: Error response from daemon: linux spec user: unable to find user phpcomposeruser: no matching entries in passwd file.
Это связано с тем, что вы не создали пользователя с таким именем в образе . Чтобы устранить эту проблему, можно передать в контейнер UID и GID вместо имени пользователя.
Поменяйте владельца на :
sudo chown phpcomposeruser composer.json
Соберите проект:
docker run --user $(id -u phpcomposeruser):$(id -g phpcomposeruser) -ti --volume $(pwd)/:/app php-composer:3.3 composer install
Проверьте, что все работает:
ls -l total 24 -rw-r--r-- 1 phpcomposeruser sample 142 Dec 13 14:54 composer.json -rw-r--r-- 1 phpcomposeruser phpcomposeruser 8286 Dec 13 14:59 composer.lock -rw-r--r-- 1 sample sample 155 Dec 13 14:44 Dockerfile drwxr-xr-x 6 phpcomposeruser phpcomposeruser 4096 Dec 13 14:59 vendor
Готово, теперь образ собирается не от root, а от имени нового пользователя.
Развернуть хранилище ключей и значений
Образ докера, который мы здесь используем, — Percona-Lab. Этот набор образов требует, чтобы каждый контейнер MySQL имел доступ к набору хранилища значений ключей (поддерживает только etcd) для реализации обнаружения IP-адресов во время инициализации и загрузки кластера. Каждый контейнер будет искать другие IP-адреса в etcd, чтобы завершить запуск MySQL с правильным wsrep_cluster_address. В противном случае первый набор контейнеров будет использовать gcomm: // в качестве адреса загрузки.
-
Сначала разверните нашу службу etcd. Вы можете щелкнуть здесь, чтобы получить зеркало etcd, которое мы используем. Это требует, чтобы мы использовали URL обнаружения в зависимости от количества развертываемых узлов etcd. В этом случае нам нужно настроить отдельный контейнер etcd, конкретные команды:
-
После этого используйте сгенерированный URL в качестве значения «-discovery» и одновременно создайте службу для etcd:
На этом этапе режим Docker Swarm будет управлять развертыванием контейнеров на одном из хостов Docker.
-
Получить виртуальный IP-адрес службы etcd. Нам нужно использовать этот IP-адрес при развертывании кластера на следующем этапе:
На данный момент наша архитектура показана на следующем рисунке:
Смена пароля системного администратора
Учетная запись SA обладает правами администратора на экземпляре SQL Server, создаваемом во время установки. После создания контейнера SQL Server указанную вами переменную среды можно обнаружить, запустив в контейнере. В целях безопасности смените пароль SA.
-
Назначьте для пользователя SA надежный пароль.
-
Используйте для запуска sqlcmd, чтобы изменить пароль с помощью Transact-SQL. В следующем примере старый и новый пароли считываются из вводимых пользователем данных.
-
Назначьте для пользователя SA надежный пароль.
-
В следующем примере замените старый пароль и новый пароль собственными паролями.
-
Назначьте для пользователя SA надежный пароль.
-
В следующем примере замените старый пароль и новый пароль собственными паролями.
Шаг 10 — Миграция данных и работа с консолью Tinker
Теперь ваше приложение запущено, и вы можете провести миграцию данных и поэкспериментировать с командой , которая запускает консоль PsySH с предварительно загруженным приложением Laravel. PsySH — это консоль времени исполнения для разработчика и интерактивный отладчик для PHP, а Tinker — это REPL для Laravel. Команда позволяет взаимодействовать с приложением Laravel из командной строки в интерактивной оболочке.
Сначала протестируйте соединение с MySQL с помощью команды Laravel , которая создает в базе данных таблицу изнутри контейнера:
Эта команда выполняет миграцию таблиц Laravel по умолчанию. Результаты подтверждения миграции выглядят следующим образом:
После завершения миграции вы можете отправить запрос для проверки правильности подключения к базе данных с помощью команды :
Проверьте соединение MySQL, получив данные, миграцию которых вы только что произвели:
Вы получите следующий результат:
Вы можете использовать для взаимодействия с базами данных и экспериментов со службами и моделями.
Теперь ваше приложение Laravel завершено и вы готовы к дальнейшей разработке и экспериментам.
Запуск приложения с помощью MySQL
Приложение Todo поддерживает настройку нескольких переменных среды для указания параметров подключения MySQL. К ним относятся:
- — имя узла для работающего сервера MySQL.
- — имя пользователя, используемое для подключения.
- — пароль, используемый для подключения.
- — база данных, которая будет использоваться после подключения.
Aviso
Настройка параметров подключения с помощью переменных среды. Использование переменных среды для установки параметров подключения обычно подходит для разработки, тогда как при запуске приложений в рабочей среде это не рекомендуется. Чтобы понять причину, см. раздел Почему не следует использовать переменные среды для данных секрета.
Более безопасный механизм заключается в использовании поддержки секрета, предоставляемой платформой оркестрации контейнеров. В большинстве случаев эти секреты подключаются как файлы в работающем контейнере. Вы увидите, что многие приложения (включая образ MySQL и приложение Todo) также поддерживают переменные среды с суффиксом , который указывает на файл, содержащий файл.
Например, установка переменной приведет к тому, что приложение будет использовать содержимое файла, на который указывает ссылка, в качестве пароля подключения. Docker не делает ничего для поддержки этих переменных среды. Приложение должно знать, что нужно найти переменную и получить содержимое файла.
Используя все эти объяснения, запустите контейнер, готовый для разработки.
-
Укажите каждую из переменных среды, приведенных выше, и подключите контейнер к сети приложений (замените символы на в Windows PowerShell).
-
Если просмотреть журналы для контейнера (), вы увидите сообщение, указывающее, что используется база данных MySQL.
-
Откройте приложение в браузере и добавьте несколько элементов в список дел.
-
Подключитесь к базе данных MySQL и подтвердите, что элементы записываются в базу данных. Помните, что пароль — secret.
В оболочке MySQL выполните следующую команду:
Очевидно, что таблица будет выглядеть иначе, так как она содержит элементы. Но вы должны увидеть, что они хранятся!
Если взглянуть на расширение Docker, вы увидите, что у вас работают два контейнера приложений. Но нет никакой реальной индикации того, что они сгруппированы в одном приложении. Вы узнаете, как сделать это лучше в ближайшее время!
Как установить Docker на VDS Timeweb
Так как мы постоянно работаем над тем, чтобы сделать работу на нашем хостинге удобной и комфортной для наших клиентов, внедрение Docker было лишь вопросом времени.
Для того чтобы начать использовать Docker, сначала вам необходимо установить его – это можно сделать двумя путями.
- Вы можете установить Docker в панели управления VDS при создании нового сервера: на 2-м шаге «Программное обеспечение», при выборе Ubuntu 16.04 в качестве операционной системы, вы сможете установить DockerUI.
- Также вы можете провести установку через консоль любого дистрибутива Linux, следуя инструкции на официальном сайте.
Соответственно, работа с Docker может производиться либо в консоли, либо в соответствующем интерфейсе.
Как и во многих других случаях, работа с Docker напрямую через консоль отличается большей стабильностью и широкими возможностями. Все необходимые команды вы найдете на этой странице официального сайта.
Однако начинающим пользователям, которые хотят познакомиться с Docker, будет удобнее работать в DockerUI:
Если вам интересно более детально разобраться в том, что такое Docker, рекомендуем к чтению следующую англоязычную статью: What is Docker?
Шаг 5 — Настройка PHP
Вы определили инфраструктуру в файле , и теперь можете настроить службу PHP для работы в качестве процессора PHP для входящих запросов Nginx.
Для настройки PHP вы создадите файл в папке . Это файл, который вы привязали к файлу в контейнере на шаге 2. Создание этого файла позволит вам игнорировать файл по умолчанию , который PHP считывает при запуске.
Создайте каталог :
Затем откройте файл :
Чтобы продемонстрировать настройку PHP, мы добавим следующий код для установки ограничений размера выгруженных файлов:
~/laravel-app/php/local.ini
Директивы и задают максимальный разрешенный размер выгружаемых файлов и показывают, как задавать конфигурации из файла . Вы можете вставить любой параметр конфигурации PHP, который хотите игнорировать в файле .
Сохраните файл и закройте редактор.
С сохраненным файлом PHP можно перейти к настройке Nginx.
1: Загрузка Laravel и установка зависимостей
Для начала нужно загрузить последнюю версию Laravel и установить зависимости программы, в том числе и Composer, менеджер пакетов PHP уровня приложения. Используйте Docker, чтобы не устанавливать Composer глобально.
Перейдите в домашний каталог и клонируйте последнюю версию Laravel в laravel-app:
Затем перейдите в каталог laravel-app:
Теперь через образ composer смонтируйте каталоги проекта Laravel, чтобы избежать накладок глобальной установки Composer:
Опции -v и –rm в команде docker run создают контейнер, который привязывается к текущему каталогу до тех пор, пока вы его не удалите. Содержимое каталога ~/laravel-app скопируется в контейнер, а содержимое папки vendor, которую Composer создает внутри контейнера, будет скопировано в текущий каталог.
Теперь отредактируйте привилегии каталога, все права на него нужно передать вашему пользователю sudo:
Это пригодится вам позже, когда вы будете работать с Dockerfile для образа приложения, поскольку так вы сможете работать с кодом и запускать процессы в контейнере через своего пользователя sudo.
Начинаем установку
1. Устанавливаем git, чтоб он был доступен из командной строки. Процесс описывать не буду, это легко гуглится.
2. Устанавливаем сам Docker desktop for mac/windows https://docs.docker.com/docker-for-mac/install/https://docs.docker.com/docker-for-windows/install/
Затруднений при установке возникнуть не должно, делать все как описано в инструкции по этим ссылкам.
Главное чтоб у вас установился Docker desktop, чтобы его иконка отображалась в строке состояния со статусом: is running
В процессе установки на своё усмотрение выделяете необходимое кол-во ядер, памяти и места на женском диске.
Для windows не забудьте в настройках указать раздел жесткого диска.
3. Проверяете установился ли Докер. Когда вы установили сам клиент docker — открываете командную строку и вводите:
После выполнения команды должна отобразиться версия докера.
Если все хорошо на этом шаге — то, отлично, переходим дальше!
4. Теперь мы выберем сборку контейнеров для докера и создадим папку, в которой все это будет храниться.
Вообще можно собрать конечно самому сборку и я вначале так и пытался сделать, однако столкнулся с множеством проблем, чтением мануалов. Что привело меня к поиску уже готовой сборки для веб сервера. И я такую нашел: https://github.com/sprintcube/docker-compose-lamp
В нее входят следующие компоненты:
- PHP (вы сами можете выбрать нужную вам 1 из 6 версий. начиная с 5.4 до 7.4)
- Apache
- MySQL
- phpMyAdmin
- Redis
Теперь нужно создать папку куда мы ее скачаем. У меня это — /Users/your_name/Documents/docker/lamp
lamp — это название сборки (в первую очередь для меня, чтобы не забыть)
5. Далее читаем Installation https://github.com/sprintcube/docker-compose-lamp
переходим в папку и выкачиваем файлы с репозитория:
6. Команда docker-compose up -d
Это команда обращается к пакетному менеджеру docker, скачивает и устанавливает (если еще не установлены) все компоненты которые описаны в docker-compose.yml — собирает их вместе и запускает контейнеры.
В файле docker-compose.yml — вы увидите какие именно это пакеты и как они прописаны. Обязательно откройте этот файл и ознакомьтесь с содержимым!
Первый раз процесс скачивания и установки может быть немного длительным, и в результате в командной строе должно отобразиться:
Поздравляю! Теперь можете заходить на localhost и отобразиться страничка, которая расположена по адресу /Users/your_name/Documents/docker/lamp/www/index.php
Разумеется, вы ее меняете, закачиваете в папку свой проект и наслаждаешь дальнейшей разработкой!
Что не так с Vagrant?
Несмотря на преимущества, среда разработки на основе Vagrant вводит свой собственный набор ограничений и проблем.
- Системные ресурсы. Vagrant требует запуска совершенно другой операционной системы. Вам необходимо загрузить и установить операционную систему, работающую на вашем веб-сервере, и все установленные ею пакеты. При этом используется значительный объём дискового пространства и памяти. Виртуальной машине обычно требуется как минимум 512 МБ ОЗУ. Это немного для современных компьютеров, но быстро складывается. Если вы хотите разместить один веб-сайт на PHP 7 и один на PHP 8, вам необходимо установить и настроить на вашем компьютере два разных экземпляра виртуальных машин.
- Вы должны убедиться, что виртуальная машина и сервер синхронизированы. Всякий раз, когда вы обновляете сервер или изменяете конфигурацию сервера, вы должны не забывать обновить локальную среду разработки с такими же изменениями.
- Это жёстко фиксирует вас в операционной системе и конфигурации сервера. Перенести сайт с одного сервера на другой — сложная задача. Веб-сайт — это больше, чем просто сценарии PHP, изображения и CSS, из которых он состоит. Для правильной работы веб-сайта также требуется определённая конфигурация сервера (например, установленные расширения PHP и conf/ httpd.conf).
- Существует очень ограниченный выбор доступных пакетов. В зависимости от того, какой дистрибутив Linux работает на вашем веб-сервере, у вас может не быть выбора, какую версию PHP вы запускать. Если вы не установите пакеты из сторонних репозиториев, вы не сможете использовать самую последнюю и лучшую версию PHP. На момент написания недавно стал доступен PHP 8. Если вы используете CentOS 8 / RHEL 8, вы застряли на PHP 7.3, пока не получите новую версию операционной системы. Если вы используете Debian, последняя доступная версия — 7.3. В других дистрибутивах будут доступны другие версии.
- Конфигурация сервера глобальная. В PHP есть файл настроек с именем ini. При изменении этого параметра обновлённая конфигурация применяется ко всем веб-сайтам, размещённым на сервере. То же самое касается nginx.confNGINX или httpd.confApache. Экземпляр базы данных MySQL имеет базы данных для всех сайтов, размещённых на сервере. Внесение каких-либо крупномасштабных изменений конфигурации базы данных имеет далеко идущие последствия. Обновление настройки MySQL повлияет на каждый веб-сайт, использующий этот сервер MySQL!
- Версии пакета являются глобальными на реальном сервере. Хотя можнозапустить несколько версий PHP на одном веб-сервере, его сложно настроить и могут возникнуть странные побочные эффекты в зависимости от того, что делает ваш скрипт (например, когда у вас есть скрипт, который вы хотите запустить в модуле systemd / cronjob и забудьте, что вы должны использовать, /bin/php72а не /bin/php).
Хотя точки 5 и 6 можно преодолеть на машине разработки, запустив разные виртуальные машины Vagrant, вам понадобится реальный веб-сервер, который отражает каждую используемую вами конфигурацию, чтобы веб-сайты работали, когда вы их загружаете.
Файловая структура
Переходим к организации папок и файлов нашей сборки. Создадим на диске какую-нибудь директорию, которая будет корневой для нашей сборки и в ней по порядку создаем следующие директории:
- www — в этой папке будут лежать файлы наших проектов, по директории на каждый проект;
- mysql — в этой папке будут храниться файлы наших баз данных;
- logs — здесь будет собриать логи из разных образов;
- hosts — здесь будут храниться файлы конфигурации nginx для наших проектов;
- images — папка с нашими образами — компонентами нашей системы.
Еще не помешает создать дефолтный проект, чтобы проверить работоспособность нашей сборки когда все запустится. В директории создадим директорию тестового проекта — с одим единственным файлом . Содердимое файла классическое:
Также в корне будет лежать наш — сердце любой docker-конфигурации
Как все будет работать в итоге
- Мы установим следующую сборку: PHP (5.4 — 7.4), Apache, MySQL, phpMyAdmin. Сможем зайти из браузера на localhost и запустить ваш проект (или просто в данном случае index.php)
- Будет папка, в которой хранится ваш проект. Т.е. используете ваш любимый IDE для разработки. Со всеми файлами вы работаете из своей родной ОС (mac/windows).
- Докер сделает виртуальный контейнер, в котором запустит необходимую сборку (в нашем случае lamp) и все файлы будут синхронизированы
- Доступны конфиги php.ini, apache, дампы mysql, которые загружаются в виртуальный контейнер docker
- при желании c помощью командной строки можно зайти на виртуальный сервер (контейнер) и сделать при желании там все необходимое (подправить конфиг, запустить команду и тд).
Заключение
Вот так современные технологии упрощают и ускоряют разработку и обслуживание. Сравните с тем, что надо сделать, чтобы настроить типовой веб сервер вручную — настройка веб сервера apache. А тут раз, два и все готово. И потом переносится на любую ОС с докером за минуту. Другое дело, что чтобы во всем этом разбираться, надо сначала научиться вручную все это настраивать, а потом переходить к контейнерам. Иначе они будут как черный ящик. Когда что-то сломается, останется только потыкать в него, но это не приведет к решению проблемы.
Другой вариант решения вопроса — автоматизировать все это с помощью ansible. Я пробовал что-то делать в этом направлении, но реально написать хороший плейбук занимает много времени. Если работаешь не на однотипном потоке, это не оправдывает затраты времени. С докером быстрее и проще получается.
Онлайн курс «SRE практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «SRE практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и Linux. Обучение длится 3 месяц, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
На курсе вы узнаете как:
- Внедрить SRE практики в своей организации
- Управлять надежностью, доступностью и эффективностью сервисов
- Управлять изменениями
- Осуществлять мониторинг
- Реагировать на инциденты и производительность
- Работать со следующим технологическим стеком: Linux, AWS, GCP, Kubernetes, Ansible, Terraform, Prometheus, Go, Python.
Проверьте себя на вступительном тесте и смотрите подробнее программу по .
Онлайн курс по Kubernetes
Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.
Если вы ответите «да» хотя бы на один вопрос, то это ваш курс:
- устали тратить время на автоматизацию?
- хотите единообразные окружения?;
- хотите развиваться и использовать современные инструменты?
- небезразлична надежность инфраструктуры?
- приходится масштабировать инфраструктуру под растущие потребности бизнеса?
- хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?
Сдавайте вступительный тест по и присоединяйтесь к новому набору!.