Установить laravel docker windows

Настраиваем Docker для Laravel за 15 минут

В этой статье я расскажу, как можно запустить приложение Laravel внутри контейнера Docker за 15 минут. Пропущу объяснения, что такое Docker и почему нужно докеризировать своё приложение, про всё это есть множество статей в интернете. Если вы еще не установили Docker и Docker Compose, то сделайте это.

Образы Docker могут быть собраны на основе широкого спектра базовых образов, таких как Ubuntu или (предпочтительно) Alpine Linux. Несмотря на то, что сборка собственного образа с нуля гарантирует его соответствие вашим нуждам, но это может быть довольно сложным. Особенно, если вы хотите начать побыстрее начать работу над своим проектом. Поэтому я создал образ под названием Alpine Artisan на основе замечательного Docker Webstack, содержащего Alpine Linux, PHP-FPM и Nginx. Alpine Artisan можно найти на Docker Hub и GitHub.

Я уже установил в него несколько PHP-расширений, чтобы вы могли работать с MySQL и Redis (включая Laravel Horizon). Я предполагаю, что вы используете дефолтную структуру Laravel и что корневой каталог вашего приложения напоминает структуру свежесозданного приложения Laravel. То, что происходит внутри каталогов app или resources, не имеет значения, важно только то, что они там есть.

Итак, запускаем таймер!

Шаг первый: Dockerfile

Создайте новый файл Dockerfile в корне вашего приложения. Обратите внимание, что у файла нет расширения Добавьте в него следующее:

FROM — это, в основном, оператор подключения, он подтягивает образ, на котором построится ваш текущий. Вся магия происходит внутри образа Alpine Artisan, поэтому здесь вам больше ничего не нужно делать. Двигаемся дальше!

Шаг второй: файл docker-compose.yml

Создайте файл docker-compose.yml рядом с Dockerfile . Docker Compose — отличный инструмент для создания контейнеров Docker, и он, безусловно, делает всё это значительно более фановым. В файл docker-compose.yml добавьте следующее:

Если вы не знакомы с Docker Compose, это нижеследующее может быть вам очень полезным! Давайте разбираться. В этом файле мы просим создать три службы: приложение, базу данных и экземпляр Redis. Если последние две вам не нужны, можете их исключить. Каждый сервис будет контейнером основанным на локальном Dockerfile или образе в Docker Hub. Наконец, мы будем хранить данные в базе данных в томе (volume) (для этого не требуется дополнительная настройка). Если вы хотите хранить и другие данные, то вы можете создать дополнительные тома и смонтировать их в соответствующие контейнеры.

Контейнеру app целью build назначен файл Dockerfile , который мы только что создали и который находится в той же папке. После запуска, мы можем увидеть наше приложение по адресу localhost:80 , Контейнер базы данных настраивается из образа MySQL, а переменные окружения, которые мы задаем, используются для root-пользователя. Контейнер redis очень прост и не требует дополнительной настройки.

Шаг третий: файл .env

Чтобы ваше приложение могло взаимодействовать с Redis и базой данных, вы должны задать следующие переменные в вашем .env . Необходимо, чтобы они соответствовали значениям в docker-compose.yml

Шаг четвертый: запуск!

Если вы не знакомы с Docker и Docker Compose, то вам необходимо запомнить следующие основные команды:
— docker-compose up — запуск собранных образов. Добавьте параметр -d , чтобы запускать их в фоне.
— docker-compose build — для сборки или перестройки контейнеров. Альтернативой является параметр —build для команды up .
— docker-compose ps — список текущих (запущенных) контейнеров.
— docker-compose down — остановка и удаление контейнеров.

Читайте также:  Linux не видит сетевой кабель

Поскольку это первый раз для этой конфигурации, то нам нужно будет наши контейнеры собрать и запустить. Для этого я использую команду up с дополнительными параметрами:

Шаг пятый: останавливаем таймер!

Когда команда выполнится, то ваше приложение должно быть доступно по адресу localhost:80 . Если этот порт конфликтует с другими сервисами, то нужно его изменить в в docker-compose.yml , например, на 9000:80 . Последний порт всегда находится внутри сети Docker (то есть между контейнерами), а первый — вне её.

Если вам нужен shell-доступ к любому из ваших контейнеров, то используйте команду docker-compose exec app sh

Вот и всё, я надеюсь, что вы проделали всё это за 15 минут, что я и обещал в начале урока 😉

Наш Телеграм-канал — следите за новостями о Laravel.

Задать вопросы по урокам можно на нашем форуме.

Настраиваем Laravel в контейнере Docker

Сегодня я расскажу вам, как сделать своё первое приложение Laravel в контейнере Docker.

Необходимые условия

  • Ubuntu 18.04
  • Установленный Composer
  • Установленный Docker — https://docs.docker.com/install/linux/docker-ce/ubuntu/
  • Установленный Docker Compose — https://docs.docker.com/compose/install/

Шаг 1. Установка Laravel

Создаём приложение Laravel при помощи команды composer create-project

Переходим в каталог проекта

Прописываем разрешение на запись для папки storage, и папки cache внутри папки bootstrap.

Затем используем образ Docker composer, чтобы смонтировать каталоги, нужные для Laravel, и чтобы избежать глобальной установки Composer.

Шаг 2. Создание файла Docker Compose

Для веб-сервера я использовал порты 8080 и 844, так как у меня уже есть на компьютере установленный Apache. И я использовал порт 33061 для MySQL — уже есть установленный сервер MySQL.

Шаг 3. Сохранение данных

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

В переменной db файла docker-compose.yml задан том под именем dbdata для хранения базы данных MySQL.

Том dbdata хранит содержимое папки var/lib/mysql внутри контейнера. Это позволяет остановливать и перезапускать службу db без потери данных.

В конце файла compose добавлено определение тома dbdata:

Добавим монтирование файлов конфигурации MySQL в службу db.

Добавим монтирование к сервису webserver. Их будет два: один для кода вашего приложения, а другой для конфигурации Nginx.

И, наконец, добавим монтирование к службе app для файлов конфигурации и кода приложения:

Служба app монтирует папку laradock, содержащую код приложения в папку /var/www в контейнере.

В итоге docker-compose.yml должен выглядеть так:

Шаг 4. Создание Dockerfile

Устанавливает базовый образ и задает необходимые команды и инструкции.

Шаг 5. Настройка PHP

Для настройки PHP создается файл local.ini.

Я добавил следующие настройки в этот файл.

Это файл, который я подмонтировал к /usr/local/etc/php/conf.d/local.ini внутри контейнера в шаге 2.

Шаг 6. Настройка NGINX

Для настройки Nginx я создал файл app.conf в папке nginx/conf.d

И добавил в него:

Шаг 7. Настройка MySQL

Для настройки MySQL был создан файл my.cnf внутри папки mysql.

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

Шаг 8 — Запуск контейнеров

Я определил все сервисы в файле docker-compose и создал файлы конфигурации для этих сервисов. Теперь я запускаю контейнеры командой:

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

Шаг 9. Создание пользователя MySQL

Чтобы создать нового пользователя, запустите оболочку bash для контейнера db:

Затем создаю пользователя и даю ему все привилегии.

Сбрасываю привилегии для применения изменений.

Шаг 10. Обновление настроек окружения

Отредактируем настройки Laravel.

Обновим учетные данные базы данных и URL приложения.

Шаг 11. Перенос базы данных

Теперь у нас есть доступ к нашему приложению Laravel по адресу http://0.0.0.0:8080/

Автор: Sreejith Ezhakkad
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.

Задать вопросы по урокам можно на нашем форуме.

Читайте также:  Google play market установить windows

Запуск проекта на Laravel с использованием docker-compose

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

Первым делом давайте разберемся: какие сервисы нам потреубуются?

  • php-fpm 7.4+ with xdebug
  • mysql | postgresql | sqlite
  • nginx | apache
  • redis | … etc…

Давайте попробуем на примере php-fpm 7.4 + mysql + nginx

Создадим папку нашего проекта /var/www/example.loc/ и создадим в ней файл docker-compose.yml , также нам понадобится папка ./docker где будем хранить конфигурации наших сервисов.

Внутренняя сеть

В нашей сборке ничего, кроме nginx не будет смотреть наружу. Ни какие порты, кроме 80. Нам не требуется извне иметь доступ к 9000 порту php или 3306 бд. Все контейнеры будут залинкованы между собой внутренней сетью, которую можно описать следующим образом:

База данных

Нам необходимо в корне папки создать файл .env, в котором будут наши настройки БД

Эти данные в дальнейшем будут в .env файле нашего проекта на Laravel.

Стоит обратить внимание на DB_HOST=db . Здесь нельзя указывать localhost или еще какой ip. За счет удобной внутренней сети докера мы можем использовать имя сервиса в качестве пути к серверу базы данных. в нашем случае это db

Т.к. после перезапуска контейнера все данные удаляются, то нам необходимо вынести файлы таблиц базы данных. Поэтому помещаем их в папку docker/mysql

Если вдруг вам потребуется mariadb, то вместо image: mysql , впишите image: mariadb . Конфигурация остается та же.

А что, если мы захотим использовать postgresql? Все так же просто:

С базами данных закончили.

php-fpm

Будем использовать кастомную сборку php-fpm , т.к. нам необходимо добавить поддержку работы с базой данных, поддержку xdebug и пр.

Для начала опишем сервис. Условимся, что наш docker-compose.yml и папка docker будет лежать в корне laravel проекта на одном уровне с папкой app

Т.к. наша сборка кастомная, то вместо image секции, нам необходимо указать путь к настройкам:

Создаем папку ./docker/php-fpm и в ней два файла php.ini и Dockerfile , в котором далее будем описывать процесс сборки php-fpm

В php.ini мы можем указать желаемые нами параметры, например:

Перейдем к Dockerfile. В этом файле (с большой буквы) хранятся построчно все инструкции по установке php внутри контейнера.

В первой строке (команда FROM ) мы указали какую версию image файла нам использовать. В данном случае php:7.4-fpm

Следующая команда RUN устанавливает требуемые зависимости

Далее, мы указываем контейнеру, что php.ini необходимо брать из нашей текущей папки.
Далее, Устанавливаем composer . Он нужен нам только на уровне php-fpm контейнера.

Ну и наконец указываем контейнеру, где лежат все наши файлы со стороны контейнера. В нашем случае, мы указали, что корень нашего сервера это /var/www

Вы можете с легкостью указать любую другую версию php, например php:7.3-fpm , но учтите, для этой версии может потребуется xdebug более низкой версии, например 2.7.1

Nginx

Обратите внимание, что папку storage мы пробрасываем на уровне конфигурации. Симлинки не работают между контейнерами. В нашем случае nginx и php-fpm

Nginx у нас так же имеет кастомную сборку, потому указываем путь к файлу Dockerfile как в прошлом примере.

Создаем папку ./docker/nginx и там файл Dockerfile и папку conf.d
В conf.d у нас будут храниться виртуальные хосты, обычно 1-2 достаточно. Обрабатываются только файлы с расширением .conf. Например, default.conf:

Настроим Dockerfile следующим образом:

На этом настройка окружения для нашего проекта закончена. Нам остается только запустить контейнеры командой

Если все ок, то наше приложение теперь доступно по адресу http://localhost

Одна из возможных причин, почему не запустилось, может крыться в том, что 80 порт может быть уже занят. В любом случае, понять причину ошибки можно запустив команду docker-compose logs и проанализировав ее.

Установка Laravel

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

И скопировать все файлы в папке laravelapp в корень нашего сервера.

Для того, чтобы можно было использовать artisan, нам необходимо обращаться к нему внутри контейнера, а именно docker-compose exec php-fpm php artisan make:controller , либо запускать команды внутри контейнера запустив команду docker-compose exec php-fpm bash , а затем уже использовать php artisan make:controller

Часто у новичков и не только, у кого локально установлен php? возникает ошибка подключения к базе данных, при использовании команд artisan. Для решения которой, как бы не было это глупо и банально, предлагаю проверить как вы запускаете команду. Возможно вы запускаете ее локально, а не в контейнере. =)

Здравствуйте, что-то у меня не так
в конце выполнения docker-compose up -d –build возникают ошибки

Читайте также:  Windows 10 ltsc 2019 x64 32 bit

Creating db … done
Creating php-fpm … error

ERROR: for php-fpm Cannot start service php-fpm: OCI runtime create failed: container_linux.go:345: starting container process caused “chdir to cwd (\”/var/www\”) set in config.json failed: permission denied”: unknown
ERROR: Encountered errors while bringing up the project.

Потом смотрю в portainer контейнер db вроде running, а php-fpm просто created и при попытке запуска выдаёт ту же ошибку OCI runtime create failed.

В логах db
2020-11-28 15:16:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.,
2020-11-28 15:16:16+00:00 [Note] [Entrypoint]: Switching to dedicated user ‘mysql’,
2020-11-28 15:16:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.,
2020-11-28 15:16:17+00:00 [Note] [Entrypoint]: Initializing database files,
mysqld: Can’t create directory ‘/var/lib/mysql/’ (OS errno 17 – File exists),
2020-11-28T15:16:17.119612Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.22) initializing of server in progress as process 43,
2020-11-28T15:16:17.120948Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.,
2020-11-28T15:16:17.120984Z 0 [ERROR] [MY-010119] [Server] Aborting,
2020-11-28T15:16:17.121088Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.22) MySQL Community Server – GPL.

Привет. Сложно так будет сказать что у вас. У вас что то с правами доступа.
https://youtu.be/9TlXDyoCK10
Я вот попробовал впервые видео записать. Вдруг поможет вместе со мной повторять действия

Привет.
Видео с ошибкой не помогло. Но хорошее – поставил доп компоненты
Creating cache … done
Creating db … done
Creating node … error
Creating backend … error

ERROR: for backend Cannot start service backend: OCI runtime create failed: container_linux.go:345: starting container process caused “chdir to cwd (\”/var/www\”) set in config.json failed: permission denied”: unknown
ERROR: for node Cannot start service node: OCI runtime create failed: container_linux.go:345: starting container process caused “chdir to cwd (\”/home/node/app\”) set in config.json failed: permission denied”: unknown

Похоже действительно были проблемы с правами доступа. Папка проекта выглядела вот так в листинге
drwx——+ 1 schel4ok users 556 Nov 29 20:34 example.loc

Я попробовал изменил права для юзера 1000 вот так
chown -vR 1000:1000 example.loc
chmod 700 example.loc

Теперь стало так.
drwx—— 1 1000 1000 556 Nov 29 20:34 example.loc

И после этого php стартанул. Что это за юзер 1000?
Это типа www-data? У меня просто линукс не чистый, а сборка Synology DSM. Там много изменений.
Например не работают команды make и нет юзера www-data нет, но есть юзер http. Может вместо 1000 использовать id юзера http?

В логе nginx всё ОК
/docker-entrypoint.sh: Configuration complete; ready for start up

В логе php есть вот такие строчки, которые мне не очень ясны. Вроде работает, но первые 2 строки напрягают
NOTICE: [pool www] ‘user’ directive is ignored when FPM is not running as root,
NOTICE: [pool www] ‘group’ directive is ignored when FPM is not running as root
NOTICE: fpm is running, pid 1,
NOTICE: ready to handle connections

В логе db всё ОК
LOG: database system is ready to accept connections

cache вообще никакого лога не выводит

А node какой-то странный. Он стартует, а потом автоматически останавливается со статусом Stopped for a few seconds with exit code 1.

Оцените статью