Для начала вам необходимо создать контейнерную среду, способную выполнять PHP и Composer, инструмент управления зависимостями PHP. После этого вы сможете загрузить новое приложение Laravel с нуля без необходимости устанавливать локальную среду PHP на локальном компьютере или сервере разработки.
В этом руководстве будут представлены упрощенные инструкции по настройке этой среды на основе нашего руководства «Как установить Laravel с помощью Docker Compose в Ubuntu 20.04». Обратитесь к этому руководству для получения более подробных инструкций по каждому из параметров, используемых в файле Docker Compose, который будет представлен в этом руководстве.
Создайте новый каталог для вашего приложения в вашей домашней папке:
1 |
<ol><li data-prefix="$"> <span class="token function">мкдир</span> ~/<mark> посадка-laravel</mark></li><li data-prefix="$"> <span class="token builtin class-name">компакт-диск</span> ~/<mark> посадка-laravel</mark></li></ol> |
Далее вы создадите файл docker-compose.yml
, который будет определять контейнерную среду. В этом файле вы настроите службу с именем app
, которая будет основана на пользовательском образе Docker, созданном с помощью файла Dockerfile, который вы настроите позже.
Аргументы сборки user
и uid
, определенные в файле docker-compose.yml
и используемые в Dockerfile во время сборки, должны быть изменены, чтобы отразить ваше собственное имя пользователя и uid на вашем локальном компьютере или сервере разработки. Чтобы узнать идентификатор текущего пользователя, введите:
1
<ol><li data-prefix="$"> <span class="token builtin class-name">эхо</span> <span class="token environment constant">$UID</span></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> 1000
Переменные user
и uid
будут доступны во время сборки и будут использоваться в Dockerfile для создания нового пользователя в службе app
с тем же именем пользователя и uid, что и у текущего пользователя системы на локальном компьютере или сервере разработки. Это позволит избежать проблем с разрешениями и владением при работе с файлами приложения как из контейнера, так и с хоста, на котором выполняется Docker.
Создайте новый файл docker-compose.yml
используя любой текстовый редактор. Здесь используется nano
:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> docker-compose.yml</li></ol>
Скопируйте в этот файл следующее содержимое и не забудьте заменить выделенные значения соответствующими значениями в зависимости от вашего имени пользователя и uid в системе, на которой работает Docker:
~/landing-laravel/docker-compose.yml
1
<span class="token key atrule">version</span> <span class="token punctuation">:</span> <span class="token string">"3.7"</span> <span class="token key atrule">services</span> <span class="token punctuation">:</span> <span class="token key atrule">app</span> <span class="token punctuation">:</span> <span class="token key atrule">build</span> <span class="token punctuation">:</span> <span class="token key atrule">args</span> <span class="token punctuation">:</span> <span class="token key atrule">user</span> <span class="token punctuation">:</span></code> Сэмми <span class="token key atrule">идентификатор</span> <span class="token punctuation">:</span><mark> <span class="token number">1000</span></mark> <span class="token key atrule">контекст</span> <span class="token punctuation">:</span> <span class="token key atrule">./dockerfile</span> <span class="token punctuation">:</span> <span class="token key atrule">изображение</span> Dockerfile <span class="token punctuation">:</span><mark> лендинг <span class="token punctuation">-</span> приложение</mark> <span class="token key atrule">перезапуск</span> <span class="token punctuation">:</span> если <span class="token punctuation">-</span> не прекратил <span class="token key atrule">работу_dir</span> <span class="token punctuation">:</span> /var/www/ <span class="token key atrule">тома</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> ./ <span class="token punctuation">:</span> /var/www <span class="token key atrule">сети</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span><mark> приземление</mark> <span class="token key atrule">сети</span> <span class="token punctuation">:</span><mark> <span class="token key atrule">приземление</span></mark> <span class="token punctuation">:</span> <span class="token key atrule">водитель</span> <span class="token punctuation">:</span> мост
Сохраните и закройте файл, когда закончите. Если вы используете nano
, вы можете сделать это, нажав CTRL
+ X
, затем Y
и ENTER
для подтверждения.
Далее вы настроите Dockerfile, на который есть ссылка в файле docker-compose.yml
, который настроит собственный образ для службы app
:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> Dockerfile</li></ol>
Этот файл Dockerfile является продолжением образа Docker php:7.4-fpm
по умолчанию. Он использует переменные user
и uid
для создания нового пользователя, способного выполнять команды Artisan и Composer. Он также устанавливает несколько зависимостей PHP, необходимых для Laravel, и исполняемый файл Composer.
Скопируйте следующий контент в свой Dockerfile:
~/мой-список-задач/Dockerfile
1
FROM php <span class="token punctuation">:</span> 7.4 <span class="token punctuation">-</span> fpm <span class="token comment"># Arguments defined in docker-compose.yml</span> ARG</code> АРГ<mark> жидкость</mark> <span class="token comment"># Установить системные зависимости</span> RUN apt <span class="token punctuation">-</span> get update <span class="token important">&&</span> apt <span class="token punctuation">-</span> get install <span class="token punctuation">-</span> y git Curl libpng <span class="token punctuation">-</span> dev libonig <span class="token punctuation">-</span> dev libxml2 <span class="token punctuation">-</span> dev zip unzip <span class="token comment"># Очистить кэш</span> RUN apt <span class="token punctuation">-</span> get clean <span class="token important">&&</span> rm <span class="token punctuation">-</span> rf /var /lib/apt/lists/* <span class="token comment"># Установить расширения PHP</span> RUN docker <span class="token punctuation">-</span> php <span class="token punctuation">-</span> ext <span class="token punctuation">-</span> install pdo_mysql mbstring exif pcntl bcmath gd <span class="token comment"># Получить последнюю версию Composer</span> COPY <span class="token punctuation">-</span> <span class="token punctuation">-</span> from=composer <span class="token punctuation">:</span> последний /usr/bin/composer /usr/bin/composer <span class="token comment"># Создайте системного пользователя для запуска команд Composer и Artisan</span> RUN useradd <span class="token punctuation">-G</span> www <span class="token punctuation">-</span> data <span class="token punctuation">,</span> root <span class="token punctuation">-</span> u $uid <span class="token punctuation">-</span> d /home/$user $user RUN mkdir <span class="token punctuation">-</span> p /home/$user/.composer <span class="token important">&&</span> chown <span class="token punctuation">-</span> R $ user <span class="token punctuation">:</span> $user /home/$user <span class="token comment"># Установить рабочий каталог</span> WORKDIR /var/www USER $user
Сохраните и закройте файл, когда закончите. Далее вы можете создать свою среду с помощью:
1
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol>
Эта команда выполнит Docker Compose в автономном режиме, то есть в фоновом режиме. Когда вы впервые создаете среду с пользовательским образом, Docker Compose автоматически создаст для вас образ перед созданием необходимых контейнеров. Это может занять несколько минут. Вы увидите вывод, похожий на этот:
1
<div class="secondary-code-label" title="Выход"> Выход</div> Создание сети «landing-laravel_landing» с драйвером «bridge». Создание приложения. Шаг 1/11: ИЗ php:7.4-fpm ---> fa37bd6db22a ... Шаг 10/11: WORKDIR /var/www ---> Использование кеша – --> 769afd5d44d8 Шаг 11 из 11: ПОЛЬЗОВАТЕЛЬ $user ---> Использование кеша ---> 841eb5852b69 Успешно создано 841eb5852b69 Успешно помечено Landing-app:latest ВНИМАНИЕ: Образ для сервисного приложения был создан, поскольку он еще не существовал. Чтобы пересобрать этот образ, вы должны использовать docker-compose build или docker-compose up --build. Создание Landing-laravel_app_1... готово
Вы можете убедиться, что ваша среда запущена и работает с помощью:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> <span class="token function">PS</span></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Имя Состояние команды Порты ---------------------------------------------- -------------------------- Landing-laravel_app_1 docker-php-entrypoint php-fpm Up 9000/tcp
После запуска службы app
вы можете запустить Composer, инструмент управления зависимостями PHP, чтобы загрузить новое приложение Laravel. Для этого вы будете использовать docker compose exec
для запуска команд в службе app
, где установлен PHP.
Следующая команда будет использовать Docker Compose для выполнения composer create-project
, который загрузит новую установку Laravel на основе пакета laravel/laravel
:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> <span class="token builtin class-name">exec</span> app <span class="token function">композитор</span> create-project laravel/laravel --prefer-dist application</li></ol>
1
Creating a "laravel/laravel" project at "./application" Installing laravel/laravel (v8.4.0) - Downloading laravel/laravel (v8.4.0) - Installing laravel/laravel (v8.4.0): Extracting archive Created project in /var/www/application > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies Lock file operations: 104 installs, 0 updates, 0 removals … Package manifest generated successfully. 71 packages you are using are looking for funding. Use the `composer fund` command to find out more! > @php artisan key:generate --ansi Application key set successfully.
Эта установка создает новый файл .env
на основе файла .env.example
по умолчанию, который поставляется с Laravel. Файл .env
содержит учетные данные базы данных и другие конфиденциальные параметры приложения и должен быть уникальным для каждой среды, в которой работает приложение. Вы вернетесь для редактирования этого файла после завершения настройки среды разработки.
Затем скопируйте файлы приложения в тот же каталог, что и файл docker-compose.yml
, чтобы вы могли поделиться файлом переменных среды Laravel с Docker Compose. Затем вы можете удалить каталог application
, созданный Composer:
1
<ol><li data-prefix="$"> приложение <span class="token function">cp</span> <span class="token parameter variable">-rT</span> <span class="token builtin class-name">.</span></li><li data-prefix="$"> приложение <span class="token function">rm</span> <span class="token parameter variable">-rfv</span></li></ol>
Ваше приложение теперь загружено, но вам нужно будет включить пару сервисов в файл Docker Compose, чтобы иметь возможность доступа к приложению из браузера. Служба nginx
будет обслуживать приложение с помощью веб-сервера Nginx, а служба db
будет размещать базу данных MySQL приложения.
Во-первых, down свою среду с помощью:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> вниз</li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Остановка Landing-laravel_app_1 ... готово Удаление Landing-laravel_app_1 ... готово Удаление сети Landing-laravel_landing
Это приведет к удалению всех контейнеров и сетей, связанных с этой средой. Прежде чем редактировать файл docker-compose.yml
для добавления новых служб, создайте новый каталог для совместного использования файлов конфигурации с контейнерами. Это понадобится вам, чтобы правильно настроить Nginx для работы с PHP-приложением Laravel.
1
<ol><li data-prefix="$"> <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> docker-compose/nginx</li></ol>
Затем создайте новый файл landing-laravel.conf
, содержащий пользовательский блок сервера Nginx. Позже вы настроите том для совместного использования этого файла в сервисном контейнере nginx
.
Откройте новый файл конфигурации Nginx с помощью:
1
<ol><li data-prefix="$"> <span class="token function">nano</span> docker-compose/nginx/landing-laravel.conf</li></ol>
Следующий блок сервера настраивает Nginx для обслуживания приложения Laravel с использованием внешнего сервиса ( app
) для обработки PHP-кода. Скопируйте это содержимое в свой файл конфигурации Nginx:
docker-compose/nginx/landing-laravel.conf
1
server <span class="token punctuation">{</span> listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ .php$ <span class="token punctuation">{</span> try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass app <span class="token punctuation">:</span> 9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; <span class="token punctuation">}</span> location / <span class="token punctuation">{</span> try_files $uri $uri/ /index.php <span class="token punctuation">?</span> $query_string; gzip_static on; <span class="token punctuation">}</span> <span class="token punctuation">}</span>
Сохраните и закройте файл, когда закончите.
Затем откройте файл docker-compose.yml
:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> docker-compose.yml</li></ol>
Включите следующую конфигурацию для службы nginx
на том же уровне, что и ранее настроенная служба app
. Это создаст новый сервис на основе образа nginx:alpine
, и все запросы на порт 8000
хоста, на котором работает Docker, будут перенаправлены на порт 80
в контейнере сервиса. Помимо файлов приложения, вы также предоставите общий доступ к тому, содержащему файл конфигурации Nginx для приложения Laravel:
1
<span class="token key atrule">nginx</span> <span class="token punctuation">:</span> <span class="token key atrule">image</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">:</span> alpine <span class="token key atrule">restart</span> <span class="token punctuation">:</span> unless <span class="token punctuation">-</span> stopped <span class="token key atrule">ports</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> 8000 <span class="token punctuation">:</span> <span class="token number">80</span> <span class="token key atrule">volumes</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> ./ <span class="token punctuation">:</span> /var/www <span class="token punctuation">-</span> ./docker <span class="token punctuation">-</span> compose/nginx <span class="token punctuation">:</span> /etc/nginx/conf.d/ <span class="token key atrule">networks</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> landing
Затем включите следующий блок конфигурации для службы db
. Это создаст службу на основе образа MySQL 8 по умолчанию и извлечет значения, определенные в файле среды Laravel, для настройки доступа к базе данных:
1
<span class="token key atrule">db</span> <span class="token punctuation">:</span> <span class="token key atrule">image</span> <span class="token punctuation">:</span> mysql <span class="token punctuation">:</span> <span class="token number">8</span> <span class="token key atrule">restart</span> <span class="token punctuation">:</span> unless <span class="token punctuation">-</span> stopped <span class="token key atrule">environment</span> <span class="token punctuation">:</span> <span class="token key atrule">MYSQL_DATABASE</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_DATABASE <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_ROOT_PASSWORD</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_PASSWORD <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_PASSWORD</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_PASSWORD <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_USER</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_USERNAME <span class="token punctuation">}</span> <span class="token key atrule">networks</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> landing
Вот как должен выглядеть обновленный файл docker-compose.yml
после завершения:
~/landing-laravel/docker-compose.yml
1
<span class="token key atrule">version</span> <span class="token punctuation">:</span> <span class="token string">"3.7"</span> <span class="token key atrule">services</span> <span class="token punctuation">:</span> <span class="token key atrule">app</span> <span class="token punctuation">:</span> <span class="token key atrule">build</span> <span class="token punctuation">:</span> <span class="token key atrule">args</span> <span class="token punctuation">:</span> <span class="token key atrule">user</span> <span class="token punctuation">:</span></code> Сэмми <span class="token key atrule">пользовательский идентификатор</span> <span class="token punctuation">:</span><mark> <span class="token number">1000</span></mark> <span class="token key atrule">контекст</span> <span class="token punctuation">:</span> <span class="token key atrule">./dockerfile</span> <span class="token punctuation">:</span> Dockerfile <span class="token key atrule">изображение</span> <span class="token punctuation">:</span> приземление <span class="token punctuation">-</span> <span class="token key atrule">перезапуск</span> приложения <span class="token punctuation">:</span> если <span class="token punctuation">-</span> не прекращено <span class="token key atrule">рабочий_каталог</span> <span class="token punctuation">:</span> /var/www/ <span class="token key atrule">тома</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> ./ <span class="token punctuation">:</span> /var/www <span class="token key atrule">network</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> приземление <span class="token key atrule">nginx</span> <span class="token punctuation">:</span> <span class="token key atrule">изображение</span> <span class="token punctuation">:</span> nginx <span class="token punctuation">:</span> альпийский <span class="token key atrule">перезапуск</span> <span class="token punctuation">:</span> если <span class="token punctuation">-</span> остановлен <span class="token key atrule">порты</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> 8000 <span class="token punctuation">:</span> <span class="token number">80</span> <span class="token key atrule">томов</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> ./ <span class="token punctuation">:</span> /var/www <span class="token punctuation">-</span> ./docker <span class="token punctuation">-</span> compose/nginx <span class="token punctuation">:</span> /etc/nginx/conf.d/ <span class="token key atrule">network</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> посадка <span class="token key atrule">db</span> <span class="token punctuation">:</span> <span class="token key atrule">image</span> <span class="token punctuation">:</span> mysql <span class="token punctuation">:</span> <span class="token number">8</span> <span class="token key atrule">перезапуск</span> <span class="token punctuation">:</span> если <span class="token punctuation">-</span> не остановлен <span class="token key atrule">среда</span> <span class="token punctuation">:</span> <span class="token key atrule">MYSQL_DATABASE</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_DATABASE <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_ROOT_PASSWORD</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_PASSWORD <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_PASSWORD</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_PASSWORD <span class="token punctuation">}</span> <span class="token key atrule">MYSQL_USER</span> <span class="token punctuation">:</span> $ <span class="token punctuation">{</span> DB_USERNAME <span class="token punctuation">}</span> <span class="token key atrule">сети</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">сети</span> посадки <span class="token punctuation">:</span> <span class="token key atrule">посадка</span> <span class="token punctuation">:</span> <span class="token key atrule">драйвер</span> <span class="token punctuation">:</span> мост
Note . Для получения более подробной информации о контейнеризации сред Laravel, включая пояснения об общих томах и сетях, обратитесь к нашему полному руководству «Как установить Laravel с помощью Docker Compose в Ubuntu 20.04».
Сохраните и закройте файл, когда закончите редактирование. Наконец, обновите ваш точечный env-файл Laravel ( .env
), чтобы указать конфигурацию хоста базы данных MySQL на хост, на котором будет работать служба MySQL, называемый db
:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> .env</li></ol>
Файл .env
, который автоматически создается Composer при установке, содержит некоторые значения по умолчанию, которые вы, возможно, захотите изменить, например APP_NAME
и APP_URL
. Переменную базы данных DB_HOST
необходимо изменить, чтобы она указывала на службу, в которой будет работать MySQL, и вы можете ссылаться на нее по имени службы, как определено в файле docker-compose.yml
. В этом примере вы использовали db
в качестве имени службы базы данных, поэтому она будет доступна в контейнерной сети как хост с именем db
.
Измените свой .env
соответствующим образом, используя следующий пример в качестве основы. Выделенные значения были обновлены здесь, чтобы отразить состояние разрабатываемого приложения:
~/landing-laravel/.env
1
<span class="token key attr-name">APP_NAME</span> <span class="token punctuation">=</span></code><mark> <span class="token value attr-value">ЛендингLaravel</span></mark> <span class="token key attr-name">APP_ENV</span> <span class="token punctuation">=</span> <span class="token value attr-value">локальный</span> <span class="token key attr-name">APP_KEY</span> <span class="token punctuation">=</span> <span class="token value attr-value">base64:ffYPNP8kPeQDf8gE/qh3kWjk59p6gFY66kCKhhKUa2w =</span> <span class="token key attr-name">APP_DEBUG</span> <span class="token punctuation">=</span> <span class="token value attr-value">true</span> <span class="token key attr-name">APP_URL</span> <span class="token punctuation">=</span><mark> <span class="token value attr-value">http://локальный хост:8000</span></mark> <span class="token key attr-name">LOG_CHANNEL</span> <span class="token punctuation">=</span> <span class="token value attr-value">стек</span> <span class="token key attr-name">LOG_LEVEL</span> <span class="token punctuation">=</span> <span class="token value attr-value">отладка</span> <span class="token key attr-name">DB_CONNECTION</span> <span class="token punctuation">=</span> <span class="token value attr-value">mysql</span> <span class="token key attr-name">DB_HOST</span> <span class="token punctuation">=</span><mark> <span class="token value attr-value">БД</span></mark> <span class="token key attr-name">DB_PORT</span> <span class="token punctuation">=</span> <span class="token value attr-value">3306</span> <span class="token key attr-name">DB_DATABASE</span> <span class="token punctuation">=</span><mark> <span class="token value attr-value">Landing-DB</span></mark> <span class="token key attr-name">DB_USERNAME</span> <span class="token punctuation">=</span><mark> <span class="token value attr-value">пользователь лендинга</span></mark> <span class="token key attr-name">БД_ПАРОЛЬ</span> <span class="token punctuation">=</span><mark> <span class="token value attr-value">пароль разработчика</span></mark> ...
Вам не нужно изменять какие-либо другие разделы этого файла, но вы можете настроить его в соответствии с вашим конкретным вариантом использования.
Сохраните и закройте файл, когда закончите редактировать его содержимое.
Теперь вы можете запустить обновленную среду с помощью:
1
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Создание сети "landing-laravel_landing" с драйвером "bridge" Создание Landing-laravel_app_1... сделано Создание Landing-laravel_db_1... готово Создание Landing-laravel_nginx_1... готово
После полной настройки среды вы можете теперь указать в своем браузере localhost
или IP-адрес вашего удаленного сервера через порт 8000
:
1
http://</code> локальный хост :8000
Если все работает как положено, вы увидите такую страницу:
В следующей части этой серии вы создадите миграцию базы данных для настройки таблицы links .