Автор выбрал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.
Предпосылки
Перед началом вам понадобится:
-
Один сервер Ubuntu 18.04 и пользователь без полномочий root с привилегиями
sudo
. Следуйте инструкциям по настройкеInitial Server Setup with Ubuntu 18.04. -
Докер установлен, выполнив шаги 1 и 2How To Install and Use Docker on Ubuntu 18.04.
-
Docker Compose установлен после шага 1How To Install Docker Compose on Ubuntu 18.04.
[[шаг-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
в контейнере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 будет подходящим ресурсом.