Создать папки для базы данных, чтобы не вызвало ошибок:
mkdir src mysql mysql_test
или (если на винде)
mkdir src
mkdir mysql
mkdir mysql_test
Копировать .env.example в .env для докера
cp .env.example .env
Сконфигурировать .env
файл по своему усмотрению, назвать APP_NAME
проект по-своему, для того, чтобы не путались имена контейнеров
И уже после всего этого создать контейнеры
docker compose up -d --build
Проблема: после установки иногда появляется ошибка docker endpoint for "default" not found
- решается удалением .docker
папки в пользователи/имя пользователя
Далее можно использовать как этот образ, так и просто скопировать конфигурацию с необходимым .env
и скопировать или установить laravel проект в папку src
со своим .git
, они не будут пересекаться.
Нужно учитывать конфликт портов.
Для создания проекта с нуля, просто выполнить команду (точка в конце обязательна, чтобы проект установился именно в директорию src)
docker compose run --rm composer create-project laravel/laravel .
todo перейти с alpine на нормальные версии (пока сборка неверная) todo переписать все команды с версии docker-compose 1 на docker compose 2 todo сделать пояснения по работе с контейнерами, с флагами и как управлять контейнерами.
- php:8.2-fpm (build)
- mysql:8 (image)
- nginx:stable-alpine (image)
- phpmyadmin/phpmyadmin (image)
- composer как php:8.2-fpm (build as php but +)
- library/node (image, npm)
docker-compose up -d --build
- создание контейнера (его запуск и по этой команде можно пересоздавать(после изменений))docker-compose down
- удаляет контейнеры
По сути одинаковые действия, но реализация и работа разная:
-
docker exec -it имя_контейнера команда контейнера
- команда внутри работающего контейнера -
docker-compose run --rm имя_контейнера команда контейнера
- команда, которая создает временный контейнер и выполняет команду в существующем контейнере, уничтожается.
docker exec -it php sh
- запуск консоли внутри контейнераdocker-compose run --rm npm -v
версия npmdocker-compose run --rm php -v
версия phpdocker-compose run --rm artisan -V
версия laraveldocker-compose run --rm composer -V
версия composer
Команды внутри контейнера
ls -l
-список директорий по разрешению
Исполнители для работы:
docker-compose run --rm npm -i
установка пакета npm в папкуsrc
При работе с разработкой пакетов и библиотек для laravel не добавлять в src/composer.json
этот код (как советуют, это приведет к тому что симлинк не находится внутри контейнера): ещё раз НЕ ПРИМЕНЯТЬ ЭТОТ КОД, УБРАТЬ
"options": {
"symlink": true
}
- Для того чтобы собирать данные контейнеры для разных приложений в
.env
стоит назватьAPP_NAME
, чтобы для каждого проекта были свои контейнеры. Лучше называть с нижним подчеркиванием в начале - Если нужно запустить разные сборки контейнеров одновременно - нужно поменять порты сервисов (контейнеров) во избежание конфликтов
- Возможности общего шаблона будут дополнены после проверки его на всех моих проектах (дополнительные либы для php и дополнительные контейнеры (типо phpmyadmin))
- Данный контейнер собирается, как группа контейнеров, которые описаны в
docker-compose.yml
- Код фреймворка (Laravel) находится в папке
src
и.gitignore
игнорирует то, что внутри, так как внутри данной папки - репозиторийgit
фреймворка (как проекта) - В данной сборке используется
nginx
, но можно использовать и настроитьapache
- механизм не будет отличаться, при обновлении файлов внутриsrc
не нужно перезапускать контейнеры. - ВАЖНО: все эти настройки - для локальной работы с проектом, для боевой версии немного другая конфигурация. (возможно, для каждого сервера своя)
- Вместо
image
вdocker-compose.yml
используется синтаксисbuild
и внутриbuild:
2 переменныеcontext
- где этот файл искать (./php
) иdockerfile
- название докерфайла. (лучше это сделать в отдельной папке)
-
База данных работает сначала с одной таблицей, с одним пользователем, который имеет доступ на чтение только одной базы
-
При конфигурации базы данных в проекте необходимо указать начальную базу данных как в настройках
.env
проекта (в папкеsrc
) и изменить подключение сlocalhost
или с127.0.0.1
на название базы контейнера (в данном случаеmysql
) и это выглядит так:DB_HOST=mysql DB_USERNAME=mysql DB_PASSWORD=mysql
-
для тестирования нужно в
phpunit.xml
указать<env name="DB_HOST" value="mysql-tests"/>
в<php>
тэге, что соответствует бд с тестовым контейнером. Не забыть указатьphpunit.xml
как конфигурационный файл для тестирования в phpstorm в настройкахPhp/Test Frameworks
-
Если проект содержит несколько баз данных, их надо создать или копировать (если проект переносится на docker) и добавить права стандартному пользователю (в данном случае пользователю
mysql
) -
дополнительные параметры находятся в
./mysqlconf/my.cnf
- при их изменении достаточно просто перезапустить контейнерmysql
-
долго не мог решить проблему того, что не используется файл
my.cnf
решение оказалось простое -command: --innodb_use_native_aio=0
в настройках контейнера -
mysql -uroot -pmysql -hlocalhost -P3306 -e 'show global variables like "max_allowed_packet"';
- полезная команда выполняется внутри контейнера
- Создается отдельный файл конфигурации в папке
./nginx
с названиемdefault.conf
- данные об этом указываются в настройке контейнера вdocker-compose.yml
в настройках nginx вvolumes
- После билда этот контейнер в состоянии отключенного.
- Выполнять команды для composer нужно с префиксом
--rm
- так как composer создает команду, по выполнении которой - команда должна быть удалена. Иначе будет создан ещё один контейнер. Пример - узнать версиюdocker-compose run --rm composer -V
- Данный контейнер в стандартной сборке использует совсем урезанную версию
php
с которой невозможны большинство моих проектов, поэтому я собираю билд. - Важно понимать что
php
, который используется внутри стандартной сборкиcomposer
это не тот же самый, что используется в текущем контейнереphp
, ещё раз повторю, это причина почему я собираю билд. - Внутри папки
./php/composer
есть файлphp.ini
он нужен для настроек всех образовphp
в данной группе контейнеров
-
не достаточно просто изменить порты и обращаться по имени контейнера вместо url
-
Для создания моста между 2 группами контейнеров нужно создать новый
network
, это будет выглядеть такnetworks: laravel: app-shared: driver: bridge
-
Данный
network
нужно указать вnetworks
контейнеровnginx
иphp
-
Для того чтобы использовать этот
network
в другом приложении необходимо узнать его точно имя, оно указывается при создании контейнера, в моём случае этоlaravel_example_container_app-shared
, можно проследить и предугадать как именно создается имя, но учитывая синтаксис (без точек и символов в верхнем регистре) -
Вот так это будет выглядеть в проекте
приемнике
запросов (не забыть присвоитьnetworks: laravel: laravel_example_container_app-shared: external: true
- Нет прав на запись в директории storage. Как решить? в создании образа docker нужно чтобы в директории с проектом устанавливать права
www-data
при формировании контейнера, если это не получается, пока обходиться временными костылями - заходить в контейнер php (напримерdocker exec -it php sh
, затем присваивать роль с помощью командыchown -R www-data storage/
Пока всё.