Как настроить Laravel, Nginx и MySQL с помощью Docker Compose

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

Вступление

За последние несколько летDocker стал часто используемым решением для развертывания приложений благодаря тому, как он упрощает запуск и развертывание приложений в эфемерныхcontainers. При использовании стека приложений 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-and-install-dependencies]] == Шаг 1. Загрузка Laravel и установка зависимостей

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

Сначала убедитесь, что вы находитесь в своем домашнем каталоге, и клонируйте последнюю версию Laravel в каталог с именемlaravel-app:

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

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

cd ~/laravel-app

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

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

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

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

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

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

Имея код приложения, вы можете перейти к определению своих сервисов с помощью Docker Compose.

[[step-2 -—- created-the-docker-compose-file]] == Шаг 2 - Создание файла Docker Compose

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

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

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

В файлеdocker-compose вы определите три службы:app,webserver иdb. Добавьте в файл следующий код, обязательно заменив парольroot дляMYSQL_ROOT_PASSWORD, определенный какenvironment variable в службе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 image из Docker и предоставляет порты80 и443.

  • db: это определение службы извлекаетmysql:5.7.22 image из Docker и определяет несколько переменных среды, включая базу данных с именемlaravel для вашего приложения и парольroot для базы данных. Вы можете называть базу данных как хотите, и вам следует заменитьyour_mysql_root_password своим собственным надежным паролем. Это определение службы также сопоставляет порт3306 на хосте с портом3306 на контейнере.

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

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

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

[[step-3 -—- persisting-data]] == Шаг 3 - Сохранение данных

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

[.warning] #Warning: Используя привязку монтирования, вы даете возможность изменять файловую систему хоста с помощью процессов, запущенных в контейнере, включая создание, изменение или удаление важных системных файлов или каталогов. Это мощная возможность с последствиями для безопасности и может повлиять на процессы, не относящиеся к 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 в контейнере.

Затем добавьте привязку к сервисуwebserver. Их будет два: один для кода вашего приложения и другой для определения конфигурации 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 внутри контейнера. Вы создадите локальный файл конфигурации PHP на шаге 5.

Ваш файл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 вы можете создать собственный образ для своего приложения.

[[step-4 -—- created-the-dockerfile]] == Шаг 4. Создание файла Docker

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

НашDockerfile будет находиться в нашем каталоге~/laravel-app. Создайте файл:

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 \
    mysql-client \
    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 image. Это образ на основе Debian, в котором установлена ​​реализация PHP FastCGIPHP-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.

[[step-5 -—- configuring-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, добавим следующий код, чтобы установить ограничения на размер загружаемых файлов:

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

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

Создав файл PHPlocal.ini, вы можете перейти к настройке Nginx.

[[step-6 -—- configuring-nginx]] == Шаг 6. Настройка Nginx

С настроенной службой PHP вы можете изменить службу Nginx для использования PHP-FPM в качестве сервера FastCGI для обслуживания динамического содержимого. Сервер FastCGI основан на двоичном протоколе для взаимодействия интерактивных программ с веб-сервером. Для получения дополнительной информации, пожалуйста, обратитесь к этой статье оUnderstanding and Implementing FastCGI Proxying in 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:

~/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;
    }
}

server block определяет конфигурацию веб-сервера 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.

[[step-7 -—- configuring-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

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

~/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 указывает, где будут храниться журналы.

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

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

[[step-8 -—- running-the-container-and-modifying-environment-settings]] == Шаг 8. Запуск контейнеров и изменение настроек среды

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

cp .env.example .env

Мы настроим конкретные детали нашей настройки в этом файле после того, как запустим контейнеры.

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

docker-compose up -d

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

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

docker ps

Вы увидите следующий вывод с подробной информацией о ваших контейнерахapp,webserver иdb:

OutputCONTAINER 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 предоставляет информацию о состоянии контейнера: запущен ли он, перезапускается или остановлен.

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

Откройте файл с помощьюdocker-compose exec, что позволяет запускать определенные команды в контейнерах. В этом случае вы открываете файл для редактирования:

docker-compose exec app 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

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

Затем установите ключ приложения для приложения Laravel с помощью командыphp artisan key:generate. Эта команда сгенерирует ключ и скопирует его в ваш файл.env, гарантируя, что ваши пользовательские сеансы и зашифрованные данные останутся в безопасности:

docker-compose exec app php artisan key:generate

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

docker-compose exec app php artisan config:cache

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

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

Laravel Home Page

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

[[step-9 -—- created-a-user-for-mysql]] == Шаг 9 - Создание пользователя для MySQL

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

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

docker-compose exec db bash

Внутри контейнера войдите в административную учетную запись MySQLroot:

mysql -u root -p

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

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

show databases;

Вы увидите базу данныхlaravel, указанную в выводе:

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

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

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

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

FLUSH PRIVILEGES;

Выход из MySQL:

EXIT;

Наконец, выйдите из контейнера:

exit

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

[[step-10 -—- migrating-data-and-working-with-the-tinker-console]] == Шаг 10. Перенос данных и работа с Tinker Console

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

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

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:

docker-compose exec app php artisan tinker

Протестируйте соединение MySQL, получив только что перенесенные данные:

\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, определенных в одном файле, с помощью одной команды. Если вы хотите узнать больше о том, как выполнять CI с помощью Docker Compose, взгляните наHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04. Если вы хотите упростить процесс развертывания приложения Laravel, тоHow to Automatically Deploy Laravel Applications with Deployer on Ubuntu 16.04 будет подходящим ресурсом.

Related