*Автор выбрал фонд FreeBSD Foundation для получения пожертвования в рамках программы Write for DOnations.*

Введение

В последние несколько лет Docker стали часто использовать для развертывания приложений, поскольку он упрощает запуск и развертывание приложений в виртуальных контейнерах. При использовании набора приложений LEMP, например в системе с PHP, Nginx, MySQL и Laravel, Docker может значительно ускорить процедуру настройки.

Docker Compose упрощает процесс разработки, позволяя разработчикам определять свою инфраструктуру в одном файле, включая службы приложений, сети и томы. Docker Compose предлагает эффективную альтернативу запуску нескольких команд docker container create и docker container run.

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

Предварительные требования

docker illustration for: Предварительные требования

Перед началом работы вам потребуется следующее:

  • Один сервер Ubuntu 18.04 и пользователь без привилегий root с привилегиями sudo. Его настройка должна быть выполнена в соответствии с указаниями обучающего модуля Начальная настройка сервера Ubuntu 18.04.

Шаг 1 — Загрузка Laravel и установка зависимостей

На первом шаге мы загрузим последнюю версию Laravel и установим зависимости проекта, включая Composer, диспетчер пакетов PHP на уровне приложения. Мы установим эти зависимости с помощью Docker, чтобы не выполнять глобальную установку Composer.

Перейдите в домашний каталог и клонируйте последнюю версию Laravel в каталог с именем <^>laravel-app<^>:

				
					
cd ~

git clone https://github.com/laravel/laravel.git &lt;^&gt;laravel-app&lt;^&gt;

				
			

Перейдите в каталог <^>laravel-app<^>:

				
					
cd ~/&lt;^&gt;laravel-app&lt;^&gt;

				
			

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

				
					
docker run --rm -v $(pwd):/app composer install

				
			

Флаги -v и --rm команды docker run создают виртуальный контейнер, который привязывается к текущему каталогу вплоть до его удаления. Содержимое вашего каталога ~/<^>laravel-app<^> будет скопировано в контейнер, а содержимое создаваемой Composer внутри контейнера папки vendor будет скопировано в текущий каталог.

В заключение установите в каталоге проекта такой уровень разрешений, чтобы ее владельцем был пользователь без привилегий root:

				
					
sudo chown -R $USER:$USER ~/laravel-app

				
			

Это будет важно, когда вы будете записывать Dockerfile для образа вашего приложения на шаге 4, поскольку позволит работать с кодом прложения и запускать процессы в контейнере, не имея привилегий root.

Теперь вы разместили код приложения и можете переходить к определению служб с помощью Docker Compose.

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

Построение приложений с помощью Docker Compose упрощает процесс настройки и контроля версий в вашей инфраструктуре. Чтобы настроить наше приложение Laravel, мы создадим файл docker-compose с определением служб веб-сервера, базы данных и приложения.

Откройте файл:

				
					
nano ~/laravel-app/docker-compose.yml

				
			

В файле docker-compose определяются три службы: app, webserver и db. Добавьте в файл следующий код, при этом замените пароль root для MYSQL_ROOT_PASSWORD, определяемый как переменная среды службы db, надежный паролем по своему выбору:

				
					
[label ~/laravel-app/docker-compose.yml]

version: '3'

services:



 #PHP Service

 app:

 build:

 context: .

 dockerfile: Dockerfile

 image: www.progressiverobot.com/php

 container_name: app

 restart: unless-stopped

 tty: true

 environment:

 SERVICE_NAME: app

 SERVICE_TAGS: dev

 working_dir: /var/www

 networks:

 - app-network



 #Nginx Service

 webserver:

 image: nginx:alpine

 container_name: webserver

 restart: unless-stopped

 tty: true

 ports:

 - "80:80"

 - "443:443"

 networks:

 - app-network



 #MySQL Service

 db:

 image: mysql:5.7.22

 container_name: db

 restart: unless-stopped

 tty: true

 ports:

 - "3306:3306"

 environment:

 MYSQL_DATABASE: &lt;^&gt;laravel&lt;^&gt;

 MYSQL_ROOT_PASSWORD: &lt;^&gt;your_mysql_root_password&lt;^&gt;

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 networks:

 - app-network



#Docker Networks

networks:

 app-network:

 driver: bridge

				
			

Сюда включены следующие службы:

  • app: это определение службы содержит приложение Laravel и запускает персонализированный образ Docker, www.progressiverobot.com/php, который вы определите на шаге 4. Также оно устанавливает для параметра working_dir в контейнере значение /var/www.
  • webserver: это определение службы берет образ nginx:alpine из Docker и открывает порты 80 и 443.
  • db: это определение службы извлекает образ mysql:5.7.22 из Docker и определяет новые переменные среды, в том числе базу данных <^>laravel<^> для вашего приложения и пароль пользователя root для базы данных. Вы можете использовать любое имя базы данных, которое захотите, также вам следует заменить <^>your_mysql_root_password<^> собственным надежным паролем. Это определение службы также сопоставляет порт хоста 3306 и порт контейнера 3306.

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

Для упрощения взаимодействия между контейнерами службы подключаются к соединительной сети с именем app-network. Соединительная сеть использует программный мост, позволяющий подключенным к этой сети контейнерам взаимодействовать друг с другом. Драйвер моста автоматически устанавливает правила хоста, чтобы контейнеры в разных соединительных сетях не могли напрямую взаимодействовать друг с другом. Это повышает уровень безопасности приложений, поскольку друг с другом могут взаимодействовать только связанные службы. Также это означает, что вы сможете задавать разные сети и службы, подключающиеся к связанным функциям: например, клиентские службы приложения могут использовать сеть frontend, а серверные — сеть backend.

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

Шаг 3 — Постоянное сохранение данных

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

[warning]

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

Определите в файле docker-compose том с именем dbdata в определении службы db для постоянного сохранения базы данных MySQL:

				
					
[label ~/laravel-app/docker-compose.yml]

...

#MySQL Service

db:

 ...

 &lt;^&gt;volumes:&lt;^&gt;

 &lt;^&gt;- dbdata:/var/lib/mysql&lt;^&gt;

 networks:

 - app-network

 ...

				
			

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

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

				
					
[label ~/laravel-app/docker-compose.yml]

...

#Volumes

volumes:

 dbdata:

 driver: local

				
			

С этим определением вы сможете использовать этот том для разных служб.

Затем добавьте привязку монтируемого образа к службе db для файлов конфигурации MySQL, которые вы создадите на шаге 7:

				
					
[label ~/laravel-app/docker-compose.yml]

...

#MySQL Service

db:

 ...

 volumes:

 - dbdata:/var/lib/mysql

 &lt;^&gt;- ./mysql/my.cnf:/etc/mysql/my.cnf&lt;^&gt;

 ...

				
			

Этот монтируемый образ привязывает файл ~/laravel-app/mysql/my.cnf к каталогу /etc/mysql/my.cnf в контейнере.

Затем добавьте монтируемые образы в службу веб-сервера. Их будет два: один для кода приложения, а другой — для определения конфигурации Nginx, которое вы создадите на шаге 6:

				
					
[label ~/laravel-app/docker-compose.yml]

#Nginx Service

webserver:

 ...

 &lt;^&gt;volumes:&lt;^&gt;

 &lt;^&gt;- ./:/var/www&lt;^&gt;

 &lt;^&gt;- ./nginx/conf.d/:/etc/nginx/conf.d/&lt;^&gt;

 networks:

 - app-network

				
			

Первый монтируемый образ привязывает код приложения в каталоге ~/laravel-app к каталогу /var/www внутри контейнера. Файл конфигурации, добавляемые в ~/laravel-app/nginx/conf.d/, также монтируется в /etc/nginx/conf.d/ в контейнере, что позвоялет добавлять и изменять содержимое каталога конфигурации по мере необходимости.

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

				
					
[label ~/laravel-app/docker-compose.yml]

#PHP Service

app:

 ...

 &lt;^&gt;volumes:&lt;^&gt;

 &lt;^&gt;- ./:/var/www&lt;^&gt;

 &lt;^&gt;- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini&lt;^&gt;

 networks:

 - app-network

				
			

Служба app привязывает монтируемый образ папки ~/laravel-app, который содержит код приложения, к папке /var/www. Это ускорит процесс разработки, поскольку любые изменения в локальном каталоге приложения будут немедленно отражаться в контейнере. Также вы привязываете файл конфигурации PHP ~/laravel-app/php/local.ini к файлу /usr/local/etc/php/conf.d/local.ini в контейнере. На шаге 5 вы создадите локальный файл конфигурации PHP.

Теперь ваш файл docker-compose будет выглядеть следующим образом:

				
					
[label ~/laravel-app/docker-compose.yml]

version: '3'

services:



 #PHP Service

 app:

 build:

 context: .

 dockerfile: Dockerfile

 image: www.progressiverobot.com/php

 container_name: app

 restart: unless-stopped

 tty: true

 environment:

 SERVICE_NAME: app

 SERVICE_TAGS: dev

 working_dir: /var/www

 volumes:

 - ./:/var/www

 - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini

 networks:

 - app-network



 #Nginx Service

 webserver:

 image: nginx:alpine

 container_name: webserver

 restart: unless-stopped

 tty: true

 ports:

 - "80:80"

 - "443:443"

 volumes:

 - ./:/var/www

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

 networks:

 - app-network



 #MySQL Service

 db:

 image: mysql:5.7.22

 container_name: db

 restart: unless-stopped

 tty: true

 ports:

 - "3306:3306"

 environment:

 MYSQL_DATABASE: &lt;^&gt;laravel&lt;^&gt;

 MYSQL_ROOT_PASSWORD: &lt;^&gt;your_mysql_root_password&lt;^&gt;

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 volumes:

 - dbdata:/var/lib/mysql/

 - ./mysql/my.cnf:/etc/mysql/my.cnf

 networks:

 - app-network



#Docker Networks

networks:

 app-network:

 driver: bridge

#Volumes

volumes:

 dbdata:

 driver: local

				
			

Когда закончите вносить изменения, сохраните файл и закройте редактор.

Записав файл docker-compose, вы сможете создать персонализированный образ вашего приложения.

Шаг 4 — Создание файла Dockerfile

Docker позволяет задавать среду внутри отдельных контейнеров с помощью файла *Dockerfile*. Файл Dockerfile позволяет создавать персонализированные образы. которые можно использовать для установки требуемого программного обеспечения приложения и изменения настроек в соответствии с требованиями. Вы можете передавать созданные образы в Docker Hub или любой частный реестр.

Файл Dockerfile будет располагаться в каталоге ~/laravel-app. Создайте файл:

				
					
nano ~/laravel-app/Dockerfile

				
			

Этот файл Dockerfile будет задавать базовый образ и необходимые команды и инструкции для построения образа приложения Laravel. Добавьте в файл следующий код:

				
					
[label ~/laravel-app/php/Dockerfile]

FROM php:7.2-fpm



# Copy composer.lock and composer.json

COPY composer.lock composer.json /var/www/



# Set working directory

WORKDIR /var/www



# Install dependencies

RUN apt-get update &amp;&amp; apt-get install -y \

 build-essential \

 libpng-dev \

 libjpeg62-turbo-dev \

 libfreetype6-dev \

 locales \

 zip \

 jpegoptim optipng pngquant gifsicle \

 vim \

 unzip \

 git \

 curl



# Clear cache

RUN apt-get clean &amp;&amp; rm -rf /var/lib/apt/lists/*



# Install extensions

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl

RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/

RUN docker-php-ext-install gd



# Install composer

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer



# Add user for laravel application

RUN groupadd -g 1000 www

RUN useradd -u 1000 -ms /bin/bash -g www www



# Copy existing application directory contents

COPY . /var/www



# Copy existing application directory permissions

COPY --chown=www:www . /var/www



# Change current user to www

USER www



# Expose port 9000 and start php-fpm server

EXPOSE 9000

CMD ["php-fpm"]

				
			

Сначала Dockerfile создает образ поверх образа php:7.2-fpm Docker. Это образ на базе с установленным экземпляром PHP FastCGI PHP-FPM. Также этот файл устанавливает требуемые пакеты для Laravel: mcrypt, pdo_mysql, mbstring и imagick с composer.

Директива RUN задает команды для обновления, установки и настройки параметров внутри контейнера, включая выделенного пользователя и группу с именем www. Инструкция WORKDIR задает каталог /var/www как рабочий каталог приложения.

Создание отдельного пользователя и группы с ограниченными правами доступа снижает уязвимость при запуске контейнеров Docker, которые по умолчанию запускаются с привилегиями root. Вместо запуска этого контейнера с привилегиями root мы создали пользователя www с правами чтения и записи для папки /var/www с помощью команды COPY с флагом --chown для копирования разрешений папки приложения.

Команда EXPOSE открывает порт 9000 в контейнере для сервера php-fpm. CMD указывает команду, которая должна запускаться после создания контейнера. Здесь CMD указывает команду php-fpm, которая запускает сервер.

Когда закончите вносить изменения, сохраните файл и закройте редактор.

Теперь вы можете перейти к определению конфигурации PHP.

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

Вы определили инфраструктуру в файле docker-compose, и теперь можете настроить службу PHP для работы в качестве процессора PHP для входящих запросов Nginx.

Для настройки PHP вы создадите файл local.ini в папке php. Это файл, который вы привязали к файлу /usr/local/etc/php/conf.d/local.ini в контейнере на шаге 2. Создание этого файла позволит вам игнорировать файл по умолчанию php.ini, который PHP считывает при запуске.

Создайте каталог php:

				
					
mkdir ~/laravel-app/php

				
			

Затем откройте файл local.ini:

				
					
nano ~/laravel-app/php/local.ini

				
			

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

				
					
[label ~/laravel-app/php/local.ini]

upload_max_filesize=40M

post_max_size=40M

				
			

Директивы upload_max_filesize и post_max_size задают максимальный разрешенный размер выгружаемых файлов и показывают, как задавать конфигурации php.ini из файла local.ini. Вы можете вставить любой параметр конфигурации PHP, который хотите игнорировать в файле local.ini.

Сохраните файл и закройте редактор.

С сохраненным файлом PHP local.ini можно перейти к настройке Nginx.

Шаг 6 — Настройка Nginx

При настройке службы PHP вы можете изменять службу Nginx для использования PHP-FPM как сервера FastCGI для обслуживания динамического контента. Сервер FastCGI основан на двоичном протоколе для взаимодействия интерактивных программ с веб-сервером. Дополнительную информацию можно найти в статье «Понимание и реализация прокси FastCGI в Nginx».

Для настройки Nginx вы создадите файл app.conf с конфигурацией служб в папке ~/laravel-app/nginx/conf.d/.

Вначале создайте каталог nginx/conf.d/:

				
					
mkdir -p ~/laravel-app/nginx/conf.d

				
			

Затем создайте файл конфигурации app.conf:

				
					
nano ~/laravel-app/nginx/conf.d/app.conf

				
			

Добавьте в файл следующий код, чтобы задать конфигурацию Nginx:

				
					
[label ~/laravel-app/nginx/conf.d/app.conf]

server {

 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$ {

 try_files $uri =404;

 fastcgi_split_path_info ^(.+\.php)(/.+)$;

 fastcgi_pass app:9000;

 fastcgi_index index.php;

 include fastcgi_params;

 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

 fastcgi_param PATH_INFO $fastcgi_path_info;

 }

 location / {

 try_files $uri $uri/ /index.php?$query_string;

 gzip_static on;

 }

}

				
			

Серверный блок задает конфигурацию веб-сервера Nginx с помощью следующих директив:

  • listen: эта директива определяет порт, который сервер прослушивает для получения входящих запросов.
  • error_log и access_log: эти директивы определяют файлы для записи журналов.
  • root: эта директива задает путь к корневой папке, формируя полный путь для любого запрошенного файла в локальной файловой системе.

В блоке расположения php директива fastcgi_pass указывает, что служба app прослушивает сокет TCP на порту 9000. С ней сервер PHP-FPM выполняет прослушивание через сеть, а не через сокет Unix. Хотя сокет Unix дает небольшое преимущество в скорости по сравнению с сокетом TCP, у него нет сетевого протокола и он пропускает сетевой стек. В случаях расположения хостов в одной системе использование сокета Unix может иметь смысл, но если службы работают на разных хостах, сокет TCP дает преимущество, позволяя подключаться к распределенным службам. Поскольку наши контейнеры app и webserver работают на разных хостах, в нашей конфигурации эффективнее использовать сокет TCP.

Когда закончите вносить изменения, сохраните файл и закройте редактор.

Благодаря привязке, созданной на шаге 2, любые изменения в папке nginx/conf.d/ прямо отражаются в контейнере webserver.

Теперь посмотрим на параметры MySQL.

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

После настройки PHP и Nginx вы можете активировать MySQL как базу данных для вашего приложения.

Для настройки MySQL нужно создать файл my.cnf в папке mysql. Это файл, который вы привязали к файлу /etc/mysql/my.cnf внутри контейнера на шаге 2. Привязка монтируемого образа позволяет игнорировать любые параметры my.cnf, если и когда это требуется.

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

Создайте каталог mysql:

				
					
mkdir ~/laravel-app/mysql

				
			

Создайте файл my.cnf:

				
					
nano ~/laravel-app/mysql/my.cnf

				
			

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

				
					
[label ~/laravel-app/mysql/my.cnf]

[mysqld]

general_log = 1

general_log_file = /var/lib/mysql/general.log

				
			

Файл my.cnf поддерживает журналы, задавая для параметра general_log значение 1, разрешающее общие журналы. Параметр general_log_file указывает, где будут храниться журналы.

Сохраните файл и закройте редактор.

На следующем шаге мы запустим контейнеры.

Шаг 8 — Изменение настроек среды и запуск контейнеров

Вы определили все службы в файле docker-compose и создали файлы конфигурации для этих служб. Теперь вы можете запускать контейнеры. В заключение мы создадим копию файла .env.example, которую Laravel включает по умолчанию, и назовем ее .env, поскольку Laravel использует такой файл для определения среды:

				
					
cp .env.example .env

				
			

Теперь вы можете изменить файл .env в контейнере app, чтобы добавить определенные параметры вашей системы.

Откройте этот файл с помощью nano или другого текстового редактора на ваш выбор:

				
					
nano .env

				
			

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

  • DB_HOST будет вашим контейнером базы данных db.
  • DB_DATABASE будет базой данных <^>laravel<^>.
  • DB_USERNAME будет именем пользователя для вашей базы данных. В этом случае мы будем использовать <^>laraveluser<^>.
  • DB_PASSWORD будет защищенным паролем для этой учетной записи пользователя.
				
					
[label /var/www/.env]

DB_CONNECTION=mysql

DB_HOST=&lt;^&gt;db&lt;^&gt;

DB_PORT=3306

DB_DATABASE=&lt;^&gt;laravel&lt;^&gt;

DB_USERNAME=&lt;^&gt;laraveluser&lt;^&gt;

DB_PASSWORD=&lt;^&gt;your_laravel_db_password&lt;^&gt;

				
			

Сохраните изменения и закройте редактор.

Теперь все ваши службы определены в файле docker-compose, и вам просто нужно запустить одну команду для запуска всех контейнеров, создания томов и настройки и подключения сетей:

				
					
docker-compose up -d

				
			

При первом запуске docker-compose up будут загружены все необходимые образы Docker, что может занять некоторое время. После загрузки образов и их сохранения на локальном компьютере Compose создаст ваши контейнеры. Флаг -d преобразует процесс в демона, с которым контейнеры остаются запущенными в фоновом режиме.

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

				
					
docker ps

				
			

Вы увидите следующие результаты с данными о контейнерах app, webserver и db:

				
					
[secondary_label Output]

CONTAINER ID NAMES IMAGE STATUS PORTS

c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306-&gt;3306/tcp

ed5a69704580 app www.progressiverobot.com/php Up 2 seconds 9000/tcp

5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80-&gt;80/tcp, 0.0.0.0:443-&gt;443/tcp

				
			

В этих результатах CONTAINER ID — это уникальный идентификатор каждого контейнера, а NAMES перечисляет имена служб для каждого контейнера. Вы можете использовать для доступа к контейнерам оба эти идентификатора. IMAGE определяет имя образа каждого контейнера, а STATUS предосавляет информацию о состоянии контейнера: запущен, перезапускается или остановлен.

Сейчас мы воспользуемся docker-compose exec​​​, чтобы задать ключ приложения для приложения Laravel. Команда docker-compose exec позволяет запускать конкретные команды в контейнерах.

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

				
					
docker-compose exec &lt;^&gt;app&lt;^&gt; php artisan key:generate

				
			

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

				
					
docker-compose exec &lt;^&gt;app&lt;^&gt; php artisan config:cache

				
			

Настройки конфигурации будут загружены в файл /var/www/bootstrap/cache/config.php в контейнере.

В заключение откройте в браузере сайт http://<^>your_server_ip<^>. Откроется главная страница приложения Laravel:

Когда контейнеры будут работать, и данные конфигурации будут размещены на месте, вы сможете перейти к настройке данных пользователя базы данных <^>laravel<^> в контейнере db.

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

При установке MySQL по умолчанию создается только административная учетная запись root с неограниченными привилегиями доступа к серверу баз данных. Обычно при работе с базой данных лучше избегать использования административной учетной записи root. Вместо этого мы создадим специального пользователя базы данных для базы данных Laravel нашего приложения.

Чтобы создать нового пользователя, запустите интерактивную оболочку bash в контейнере db с помощью команды docker-compose exec:

				
					
docker-compose exec &lt;^&gt;db&lt;^&gt; bash

				
			

Выполните внутри контейнера вход в административную учетную запись MySQL root:

				
					
[environment second]

mysql -u root -p

				
			

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

Для начала проверьте наличие базы данных <^>laravel<^>, определенной в файле docker-compose. Запустите команду show databases для проверки существующих баз данных:

				
					
[environment second]

show databases;

				
			

В результатах вы должны увидеть базу данных <^>laravel<^>:

				
					
[secondary_label Output]

[environment second]

+--------------------+

| Database |

+--------------------+

| information_schema |

| &lt;^&gt;laravel&lt;^&gt; |

| mysql |

| performance_schema |

| sys |

+--------------------+

5 rows in set (0.00 sec)

				
			

Затем создайте учетную запись пользователя, которой будет разрешен доступ к этой базе данных. Мы используем имя пользователя <^>laraveluser<^>, но вы можете заменить его любым предпочитаемым именем. Просто убедитесь, что имя пользователя и пароль соответствуют заданным в файле .env на предыдущем шаге:

				
					
[environment second]

GRANT ALL ON laravel.* TO '&lt;^&gt;laraveluser&lt;^&gt;'@'%' IDENTIFIED BY '&lt;^&gt;your_laravel_db_password&lt;^&gt;';

				
			

Обновите привилегии, чтобы уведомить сервер MySQL об изменениях:

				
					
[environment second]

FLUSH PRIVILEGES;

				
			

Закройте MySQL:

				
					
[environment second]

EXIT;

				
			

Выйдите из контейнера:

				
					
[environment second]

exit

				
			

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

Шаг 10 — Миграция данных и работа с консолью Tinker

Теперь ваше приложение запущено, и вы можете провести миграцию данных и поэкспериментировать с командой tinker, которая запускает консоль _PsySH_ с предварительно загруженным приложением Laravel. PsySH — это консоль времени исполнения для разработчика и интерактивный отладчик для PHP, а Tinker — это REPL для Laravel. Команда tinker позволяет взаимодействовать с приложением Laravel из командной строки в интерактивной оболочке.

Сначала протестируйте соединение с MySQL с помощью команды Laravel artisan migrate, которая создает в базе данных таблицу migrations изнутри контейнера:

				
					
docker-compose exec &lt;^&gt;app&lt;^&gt; php artisan migrate

				
			

Эта команда выполняет миграцию таблиц Laravel по умолчанию. Результаты подтверждения миграции выглядят следующим образом:

				
					
[secondary_label Output]



Migration table created successfully.

Migrating: 2014_10_12_000000_create_users_table

Migrated: 2014_10_12_000000_create_users_table

Migrating: 2014_10_12_100000_create_password_resets_table

Migrated: 2014_10_12_100000_create_password_resets_table

				
			

После завершения миграции вы можете отправить запрос для проверки правильности подключения к базе данных с помощью команды tinker:

				
					
docker-compose exec &lt;^&gt;app&lt;^&gt; php artisan tinker

				
			

Проверьте соединение MySQL, получив данные, миграцию которых вы только что произвели:

				
					
\DB::table('migrations')-&gt;get();

				
			

Вы получите следующий результат:

				
					
[secondary_label Output]

=&gt; Illuminate\Support\Collection {#2856

 all: [

 {#2862

 +"id": 1,

 +"migration": "2014_10_12_000000_create_users_table",

 +"batch": 1,

 },

 {#2865

 +"id": 2,

 +"migration": "2014_10_12_100000_create_password_resets_table",

 +"batch": 1,

 },

 ],

 }

				
			

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

Теперь ваше приложение Laravel завершено и вы готовы к дальнейшей разработке и экспериментам.

Заключение

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

Главный фактор для простоты установки — Docker Compose, позволяющий создавать группу контейнеров Docker, определенную в одном файле, с помощью одной команды. Если вы хотите узнать больше о постоянной интеграции с Docker Compose, ознакомьтесь с обучающим модулем «Настройка среды постоянного тестирования интеграции с Docker и Docker Compose в Ubuntu 16.04». Если вы хотите ускорить процесс развертывания вашего приложения Laravel, вам поможет ресурс «Автоматическое развертывание приложений Laravel с помощью Deployer в Ubuntu 16.04».