Tutorial

Настройка Laravel, Nginx и MySQL с Docker Compose

Published on January 8, 2020
Русский
Настройка Laravel, Nginx и MySQL с Docker Compose

Автор выбрал фонд 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.

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

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

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

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

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

  1. cd ~
  2. git clone https://github.com/laravel/laravel.git laravel-app

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

  1. cd ~/laravel-app

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

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

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

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

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

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

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

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

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

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

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

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

~/laravel-app/docker-compose.yml
version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.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: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

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

  • app: это определение службы содержит приложение Laravel и запускает персонализированный образ Docker, digitalocean.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 имеются мощные и удобные средства для постоянного сохранения данных. В нашем приложении мы будем использовать тома и монтируемые образы для постоянного сохранения файлов базы данных, приложения и конфигурации. Тома обеспечивают гибкость резервного копирования и сохранение по прекращении жизненного цикла контейнера, а привязываемые монтируемые образы упрощают изменение кода во время разработки с немедленным отражением изменений файлов или каталогов хоста в контейнерах. Мы используем оба варианта.

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

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

~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
  ...

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

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

~/laravel-app/docker-compose.yml
...
#Volumes
volumes:
  dbdata:
    driver: local

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

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

~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
  ...

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

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

~/laravel-app/docker-compose.yml
#Nginx Service
webserver:
  ...
  volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
  networks:
      - app-network

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

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

~/laravel-app/docker-compose.yml
#PHP Service
app:
  ...
  volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
  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 будет выглядеть следующим образом:

~/laravel-app/docker-compose.yml
version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.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: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      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. Создайте файл:

  1. nano ~/laravel-app/Dockerfile

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

~/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 && 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 && 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:

  1. mkdir ~/laravel-app/php

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

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

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

~/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/:

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

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

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

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

~/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:

  1. mkdir ~/laravel-app/mysql

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

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

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

~/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 использует такой файл для определения среды:

  1. cp .env.example .env

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

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

  1. nano .env

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

  • DB_HOST будет вашим контейнером базы данных db.
  • DB_DATABASE будет базой данных laravel.
  • DB_USERNAME будет именем пользователя для вашей базы данных. В этом случае мы будем использовать laraveluser.
  • DB_PASSWORD будет защищенным паролем для этой учетной записи пользователя.
/var/www/.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

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

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

  1. docker-compose up -d

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

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

  1. docker ps

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

Output
CONTAINER ID NAMES IMAGE STATUS PORTS c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp 5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

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

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

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

  1. docker-compose exec app php artisan key:generate

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

  1. docker-compose exec app php artisan config:cache

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

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

Главная страница Laravel

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

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

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

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

  1. docker-compose exec db bash

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

  1. mysql -u root -p

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

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

  1. show databases;

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

Output
+--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)

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

  1. GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

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

  1. FLUSH PRIVILEGES;

Закройте MySQL:

  1. EXIT;

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

  1. exit

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

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

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

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

  1. docker-compose exec app php artisan migrate

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

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:

  1. docker-compose exec app php artisan tinker

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

  1. \DB::table('migrations')->get();

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

Output
=> 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».

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Cloud Architect

Principal Engineer | Cloud Architect | Adventurer



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
3 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Good article. I found an easier way to install composer. Simply use:

COPY --from=composer /usr/bin/composer /usr/bin/composer

in php-fpm Dockerfile. This line will add the ready-made composer to your image, and you do not need to install it manually from git (and you will not need git and curl in depencies, so it will make image size smaller).

At step 10 throws an error after the command, please help what is the reason? mac os version 10.15.5 (19F101)

 Illuminate\Database\QueryException 

  could not find driver (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +34 vendor frames 
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

This comment has been deleted

    Try DigitalOcean for free

    Click below to sign up and get $200 of credit to try our products over 60 days!

    Sign up

    Join the Tech Talk
    Success! Thank you! Please check your email for further details.

    Please complete your information!

    Become a contributor for community

    Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

    DigitalOcean Documentation

    Full documentation for every DigitalOcean product.

    Resources for startups and SMBs

    The Wave has everything you need to know about building a business, from raising funding to marketing your product.

    Get our newsletter

    Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

    New accounts only. By submitting your email you agree to our Privacy Policy

    The developer cloud

    Scale up as you grow — whether you're running one virtual machine or ten thousand.

    Get started for free

    Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

    *This promotional offer applies to new accounts only.