One place for hosting & domains

      разработки

      Установка Django и настройка среды разработки в Ubuntu 20.04


      Введение

      Django — бесплатная веб-структура с открытым исходным кодом, написанная на Python. Она построена на принципах масштабируемости, многократного использования элементов и быстрой разработки. Также она отличается согласованностью и слабой связанностью компонентов, за счет чего отдельные компоненты не зависят друг от друга.

      В этом обучающем модуле мы выполним настройку среды Django для целей разработки на сервере Ubuntu 20.04. Для общедоступного сайта нужно учитывать и дополнительные аспекты, включая подключение к базе данных, настройку доменного имени и добавление уровней безопасности. Мы предлагаем много разных обучающих модулей Django, которые помогут вам на разных этапах построения приложений. Все они отмечены тегом Django.

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

      Для прохождения этого обучающего модуля вам потребуется следующее:

      Шаг 1 — Установка Django

      Существует несколько способов установки Django, в том числе установка с помощью диспетчера пакетов Python pip в виртуальной среде.

      В домашнем каталоге сервера мы создадим каталог, где будет располагаться наше приложение Django. Используйте следующую команду для создания каталога с именем django-apps или другим предпочитаемым именем. Затем перейдите в каталог.

      • mkdir django-apps
      • cd django-apps

      Создайте виртуальную среду в каталоге django-apps. Мы присвоим ей общее имя env, но вы можете использовать другое имя, имеющее значение для вас и вашего проекта.

      Активируйте виртуальную среду с помощью следующей команды:

      После активации префикс изменится на (env),что будет выглядеть примерно так, в зависимости от каталога, в котором вы находитесь:

      Установите пакет Django в этой среде с помощью pip. Установка Django позволит нам создавать и запускать приложения Django.

      Для подтверждения установки Django следует запустить проверку версии:

      Результат должен выглядеть примерно так:

      Output

      3.0.6

      Мы установили Django на сервере и теперь можем перейти к созданию тестового проекта для проверки его работы. Мы создадим каркас веб-приложения.

      Шаг 2 — Настройка брандмауэра

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

      Если вы используете брандмауэры DigitalOcean, вы можете выбрать HTTP в правилах входящего трафика. Вы можете узнать больше о брандмауэрах DigitalOcean и создании правил для них посредством изменения правил входящего трафика.

      Шаг 3 — Запуск проекта

      Теперь мы можем сгенерировать приложение, используя утилиту командной строки django-admin, предназначенную для выполнения административных задач Python. Затем мы используем команду startproject для создания структуры каталогов проекта для нашего тестового сайта.

      Запустите следующую команду в каталоге django-apps:

      • django-admin startproject testsite

      Примечание. При запуске команды django-admin startproject <projectname> каталогу проекта и пакету проекта будет присвоено имя <projectname>, а сам проект будет создан в каталоге запуска команды. Если указан необязательный параметр <destination>, Django использует указанный в нем каталог в качестве каталога проекта и создаст в нем файл manage.py и пакет проекта.

      Посмотрим, какие файлы проекта были только что созданы. Перейдите в каталог testsite и выведите содержимое каталога, чтобы просмотреть список созданных файлов:

      Output

      manage.py testsite

      Вы увидите на экране, что этот каталог содержит файл manage.py и папку testsite. Файл manage.py аналогичен файлу django-admin и помещает пакет проекта в sys.path. Также он задает переменную среды DJANGO_SETTINGS_MODULE, указывающую на файл settings.py вашего проекта.

      Вы можете просмотреть скрипт manage.py в терминале, запустив команду less следующим образом:

      Закончив чтение скрипта, нажмите q, чтобы закрыть просмотр файла.

      Теперь перейдите в каталог testsite для просмотра других созданных файлов:

      Затем запустите следующую команду для вывода списка содержимого каталога:

      Вы увидите четыре файла:

      Output

      __init__.py asgi.py settings.py urls.py wsgi.py

      Расскажем об этих файлах подробнее:

      • __init__.py выступает как точка входа вашего проекта Python.
      • asgi.py содержит конфигурацию для опционального развертывания на асинхронный интерфейс шлюза сервера ASGI, являющийся стандартным для синхронных или асинхронных приложений и считающийся преемником стандарта WSGI (см. ниже).
      • settings.py описывает конфигурацию установки Django и сообщает Django о том, какие доступны настройки.
      • urls.py содержит список urlpatterns, осуществляющий перенаправление и сопоставление URL с представлениями.
      • wsgi.py содержит конфигурацию интерфейса шлюза веб-сервера WSGI, стандартного варианта для синхронных приложений Python.

      Примечание. Хотя файлы по умолчанию уже сгенерированы, вы можете изменить файл asgi.py или wsgi.py в любое время в зависимости от требований разработки.

      Шаг 4 — Настройка Django

      Теперь мы можем запустить сервер и посмотреть сайт на указанном хосте и порту с помощью команды runserver.

      IP-адрес вашего сервера нужно будет добавить в список ALLOWED_HOSTS в файце settings.py в каталоге ~/test_django_app/testsite/testsite/.

      Как указано в документации по Django, переменная ALLOWED_HOSTS содержит «список строк, представляющих хосты и доменные имена, которые может обслуживать этот сайт Django. Эта мера безопасности предназначена для предотвращения атак через заголовки хоста HTTP, которые возможны даже в кажущихся безопасными конфигурациях веб-серверов».

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

      • nano ~/django-apps/testsite/testsite/settings.py

      После запуска команды перейдите в раздел Allowed Hosts документа и добавьте IP-адрес вашего сервера в квадратных скобках в двойных или одинарных кавычках.

      settings.py

      """
      Django settings for testsite project.
      
      Generated by 'django-admin startproject' using Django 2.0.
      ...
      """
      ...
      # SECURITY WARNING: don't run with debug turned on in production!
      DEBUG = True
      
      # Edit the line below with your server IP address
      ALLOWED_HOSTS = ['your-server-ip']
      ...
      

      Чтобы сохранить изменения и выйти из nano, нажмите CTRL + x, а затем нажмите y. Теперь откроем наше веб-приложение в браузере.

      Шаг 5 — Доступ к веб-приложению Django

      Мы завершили настройку конфигурации, и теперь вы можете вернуться в каталог, где располагается файл manage.py:

      • cd ~/django-apps/testsite/

      Теперь запустите следующую команду, заменяющую your-server-ip на IP-адрес вашего сервера:

      • python manage.py runserver 0.0.0.0:8000

      В заключение вы можете перейти по ссылке ниже, чтобы посмотреть карка сайта. Для этого замените выделенный текст фактическим IP-адресом вашего сервера:

      http://your-server-ip:8000/
      

      После загрузки страницы вы увидите следующее:

      Страница Django по умолчанию

      Это подтверждает, что установка Django выполнена правильно, и наш тестовый проект нормально работает.

      Чтобы получить доступ к интерфейсу администратора, добавьте /admin/ в конец URL:

      http://your_server_ip:8000/admin/
      

      Вы перейдете на экран входа:

      Вход в панель администратора Django

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

      Страница администратора Django

      Дополнительную информацию о работе с интерфейсом администратора Django можно найти в статье «Активация и подключение интерфейса администратора Django».

      Закончив тестирование приложения, нажмите CTRL + C для остановки команды runserver. Вы вернетесь в среду программирования.

      Когда вы будете готовы покинуть вашу среду Python, вы можете запустить команду deactivate:

      После отключения среды программирования вы вернетесь в командную строку терминала.

      Заключение

      В этом обучающем модуле мы успешно выполнили установку Django и настроили среду разработки, чтобы начать работать с вашим приложением Django.

      Теперь у вас есть необходимый фундамент для построения веб-приложений Django.



      Source link

      Использование Visual Studio Code для удаленной разработки с помощью плагина Remote-SSH


      Введение

      Visual Studio Code — популярная интегрированная среда разработки. Большой выбор плагинов, минимальный дизайн и поддержка кросс-платформ делают ее привлекательной для разработчиков всех уровней. В этом обучающем модуле основное внимание уделяется использованию плагина Remote-SSH для обеспечения удаленной разработки программного обеспечения. С этим плагином вы можете изменять файлы на локальной рабочей станции, при этом запуская такие задачи разработки, как выполнение программ, испытания узлов или статичный анализ на удаленном сервере.

      Есть множество причин, по которым это может быть полезно для вас. Например, у вас может быть рабочая станция Windows, и вы хотите разрабатывать в Windows, но ваш код в конечном счете будет запускаться на Linux. Для обработки вам может потребоваться больше оперативной памяти или мощности процессора, чем у вашего текущего компьютера, или вы не захотите хранить код на личном компьютере из-за политики компании или желания оставить вашу рабочую станцию чистой.

      В этом обучающем модуле вы научитесь активировать плагин Remote-SSH, настраивать Visual Studio Code для выполнения кода на удаленном сервере и выполнять код из локальной установки Visual Studio Code на удаленном сервере.

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

      Для прохождения этого обучающего модуля вам потребуется следующее:

      • Локальный компьютер для разработки, работающий под управлением Windows, MacOSX или Linux. Данный обучающий модуль не предназначен для устройств под управлением ChromeOS.
      • Среда разработки Visual Studio Code, которую вы можете загрузить и установить с официального сайта.
      • Сгенерированная пара ключей SSH:
      • Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 18.04, включая пользователя с разрешениями sudo без прав root и брандмауэр.

      Шаг 1 — Установка плагина Remote-SSH

      Extensions Marketplace — возможность загружать поддерживаемые и сторонние расширения для самых разных инструментов и языков программирования. Здесь вы найдете плагин Remote-SSH, после чего установите его.

      С левой стороны IDE находится вертикальный ряд из пяти значков. Нижний значок, который выглядит как четыре квадрата в коробке с раскрывающимся правым верхним квадратом, — это значок Extensions Marketplace:

      Расположение значка Extensions Marketplace

      Также вы можете получить доступ к этому разделу, нажав Ctrl+Shift+X. После открытия этой страницы вы увидите предлагаемые плагины для загрузки и установки.

      После открытия Extensions Marketplace введите Remote-SSH в панели Поиск расширений в Marketplace. Когда найдете плагин, выберите его и нажмите зеленую кнопку Установить для установки расширения.

      Поиск плагина Remote SSH

      Расширение установлено. Далее вы настроите расширение, чтобы подключиться к серверу.

      Шаг 2 — Настройка плагина Remote-SSH и подключение к серверу

      Теперь, когда у вас установлен плагин, вы можете настроить его для подключения к серверу. Для этого вам потребуются следующие сведения:

      • IP-адрес сервера или имя хоста.
      • Имя пользователя для подключения.
      • Закрытый ключ, который вы будете использовать для аутентификации пользователя.

      Вы будете использовать эту информацию для создания файла конфигурации SSH, который Visual Studio Code может использовать для SSH для синхронизации файлов на сервере и выполнения кода от вашего имени. Вы создадите эту конфигурацию, используя Visual Studio Code.

      Теперь, когда у вас установлен плагин Remote-SSH, вы увидите небольшую зеленую коробку в нижнем левом углу интерфейса Visual Studio Code. Если навести указатель мыши на это поле, появится всплывающее сообщение Открыть удаленное окно. Кнопка выглядит как математический знак «больше» чуть ниже знака «меньше» ><, как на следующем изображении:

      Зеленая кнопка пользовательского интерфейса «Открыть удаленное окно»

      Нажмите кнопку, и диалоговое окно отобразится наверху в центре. Выберите Remote-SSH: открыть файл конфигурации… из списка:

      Выбор конфигурации SSH в пользовательском интерфейсе

      Следующая подсказка спросит, какой файл конфигурации вы хотите открыть. Если вы используете Windows, то увидите два местоположения: одно в персональном каталоге пользователя и одно в месте установки SSH. Используйте файл в каталоге пользователя при настройке сервера.

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

      config

      Host my_remote_server
          HostName your_server_ip_or_hostname
          User sammy
          IdentityFile /location/of/your/private/key
      

      Вот как работает этот файл конфигурации:

      • Host: указывает имя вашего хоста. Это позволяет использовать короткое имя или аббревиатуру вместо полного IP-адреса либо имя хоста при подключении к серверу.
      • HostName: фактическое имя хоста сервера, которое представляет собой либо IP-адрес, либо полностью квалифицированное доменное имя.
      • User: пользователь, от имени которого вы хотите выполнить подключение.
      • IdentityFile: путь к вашему закрытому ключу SSH. На системах Mac и Linux вы найдете ее в домашнем каталоге в скрытом каталоге .ssh, обычно id_rsa. Если вы используете Windows, у вас будет указано местоположение для сохранения этого файла при его создании с помощью putty-gen.

      Определите соответствующие значения в вашем файле и сохраните файл.

      Теперь Visual Studio Code настроен и готов подключиться к вашему серверу. Нажмите зеленую кнопку Открыть удаленное окно в нижнем левом углу и выберите Remote-SSH: подключиться к хосту…

      Подключение к серверу из Visual Studio Code

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

      Если вы впервые подключились к этому серверу с компьютера, скорее всего, вы увидите диалог верификации SSH Fingerprint, как на следующем изображении:

      Подтвердите ваш SSH Fingerprint («отпечаток пальца»)

      Это необходимо, чтобы убедиться, что вы действительно подключаетесь к правильному серверу. Вы можете проверить это, войдя на свой сервер вручную и выполнив команду ssh-keygen -l -f /etc/ssh/ssh_host_key.pub для просмотра «отпечатка пальца» сервера. Если отпечаток тот же, что указан в Visual Studio Code, то вы действительно подключаетесь к правильному серверу, т.ч. можете нажать Продолжить.

      Visual Studio Code по умолчанию открывает новое окно после создания нового подключения. Появится новое окно с экраном приветствия. Вы узнаете, что подключение прошло успешно, если увидите SSH: your_ip_address_or_hostname в зеленой коробке в нижнем левом углу. Это означает, что Visual Studio Code подключен и связывается с вашим удаленным сервером.

      Успешное подключение SSH

      Теперь, когда вы подключены, вы можете выполнять команды и код из редактора.

      Шаг 3 — Выполнение кода на удаленном сервере

      Плагин Remote-SSH настроен, и теперь можно запустить какой-нибудь код на вашем удаленном компьютере. Откройте окно терминала, выбрав Терминал из панели навигации в верхней части окна Visual Studio, и нажмите Новый терминал. Также вы можете открыть терминал, нажав CTRL+Shift+​​`. Открывшийся терминал находится на вашем удаленном сервере, а не на локальном компьютере.

      Когда терминал откроется, дайте следующую команду, чтобы посмотреть IP-адрес вашего сервера, чтобы убедиться, что вы подключены к удаленному серверу:

      В своем терминале вы увидите следующее:

      Output

      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 16:cb:05:5b:30:f1 brd ff:ff:ff:ff:ff:ff inet your_server_ip brd your_broadcast_address scope global eth0 valid_lft forever preferred_lft forever ...

      Чтобы протестировать способность запуска удаленного кода, создайте новый файл Python с именем hello.py в редакторе. После подключения к удаленному серверу все файлы, созданные при помощи Visual Studio Code, будут сохранены на этот сервер, а не на локальный компьютер.

      Добавьте в файл следующие строчки:

      hello.py

      print("Hello Sammy!")
      

      Для запуска этой программы на вашем сервере откройте терминал в Visual Studio Code из меню навигации, или нажав CTRL+Shift+`. Поскольку этот терминал подключен к вашему удаленному серверу, выполните в терминале следующую команду для выполнения вашей программы hello.py:

      Отобразится вывод вашей программы.

      Выполнение вашего скрипта Python

      Также вы можете выполнить файл из контекстного меню Отладка​​, выбрав Запуск без отладки.

      Примечание: Если у вас есть какие-либо расширения разработки, установленные в Visual Studio Code, такие как расширение Python, то вам придется повторно установить эти расширения на вашем сервере при помощи Extension Marketplace. Если вы ранее установили эти плагины в Visual Studio Code, то когда вы снова будете искать их, Marketplace укажет Установить на SSH: hostname. Всегда обращайте внимание, в каком контексте разработки вы находитесь, поскольку в этом месте Visual Studio Code установит ваши плагины и создаст ваши файлы. Если вы попробуете запустить ваш код без установки этих плагинов, то в правом нижнем углу экрана будут появляться диалоговые окна сообщений об ошибках, предлагающие установить их на удаленном сервере. После их установки они, скорее всего, потребуют от вас перезагрузки Visual Studio Code. После перезагрузки он будет продолжать работать на удаленном сервере без необходимости повторно подключаться вручную.

      Заключение

      Теперь у вас есть Visual Studio Code, настроенный для разработки на удаленном сервере с помощью SSH. Удаленное исполнение при помощи IDE обеспечивает множество преимуществ, в том числе способность быстро тестировать процесс выполнения вашего кода на различных операционных системах и с различными техническими спецификациями оборудования. Если у вас есть подключение к Интернету, вы можете подключаться к вашему серверу и работать над вашим кодом с любого компьютера, а также можете заниматься разработкой в среде Linux, даже если будете использовать Windows в качестве основной операционной системы.



      Source link

      Контейнеризация приложения Laravel 6 для разработки с помощью Docker Compose в Ubuntu 18.04


      Введение

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

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

      • Служба app с PHP7.4-FPM;
      • Служба db с MySQL 5.7;
      • Служба nginx, использующая службу app для синтаксического анализа кода PHP перед предоставлением приложения Laravel конечному пользователю.

      Чтобы ускорить разработку и упростить отладку приложения, мы обеспечим синхронизацию файлов приложения с использованием общих томов. Также мы узнаем, как использовать команды docker-compose exec для запуска Composer и Artisan в контейнере app.

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

      Шаг 1 — Получение демонстрационного приложения

      Для начала работы мы получим демонстрационное приложение Laravel из его репозитория на Github. Нас интересует раздел tutorial-01, содержащий базовое приложение Laravel, которое мы создали в первом обучающем руководстве этой серии.

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

      • cd ~
      • curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

      Нам потребуется команда unzip для распаковки кода приложения. Если вы еще не установили этот пакет, сделайте это с помощью следующей команды:

      • sudo apt update
      • sudo apt install unzip

      Теперь распакуйте содержимое приложения и переименуйте распакованную директорию для удобства доступа:

      • unzip travellist.zip
      • mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo

      Перейдите в директорию travellist-demo:

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

      Шаг 2 — Настройка файла .env приложения

      Файлы конфигурации Laravel располагаются в директории config внутри корневой директории приложения. Также файл .env используется для настройки конфигурации, зависимой от среды, в том числе учетных данных и любой информации, которая может изменяться между операциями развертывания. Этот файл не включен в систему контроля версий.

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

      Значения в файле .env имеют приоритет по отношению к значениям в обычных файлах конфигурации, расположенных в директории config. Для каждого случая установки в новую среду требуется персонализированный файл среды, где будут определены такие настройки, как параметры подключения к базе данных, параметры отладки, URL приложения и другие параметры, в зависимости от используемой приложением среды.

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

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

      Текущий файл .env из демонстрационного приложения travellist содержит настройки использования локальной базы данных MySQL с адресом хоста базы данных 127.0.0.1. Нам нужно обновить переменную DB_HOST, чтобы она указывала на службу базы данных, которую мы создадим в нашей среде Docker. В этом обучающем руководстве мы присвоим службе базы данных имя db. Замените указанное значение DB_HOST именем службы базы данных:

      .env

      APP_NAME=Travellist
      APP_ENV=dev
      APP_KEY=
      APP_DEBUG=true
      APP_URL=http://localhost:8000
      
      LOG_CHANNEL=stack
      
      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=travellist
      DB_USERNAME=travellist_user
      DB_PASSWORD=password
      ...
      

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

      Сохраните файл после завершения редактирования. Если вы использовали nano, нажмите Ctrl+x, а затем Y и Enter для подтверждения.

      Шаг 3 — Настройка файла Dockerfile для приложения

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

      Наш образ travellist будет основан на php:7.4-fpm, официальном образе PHP из Docker Hub. Поверх базовой среды PHP-мы установим несколько дополнительных модулей PHP и инструмент Composer для управления зависимостями.

      Также мы создадим нового пользователя системы, что необходимо для выполнения команд artisan и composer при разработке приложения. Параметр uid обеспечивает соответствие uid пользователя внутри контейнера и системного пользователя на хосте, где работает Docker. Любые файлы, созданные этими командами, воспроизводятся на хосте с соответствующими разрешениями. Также это означает, что вы можете использовать предпочитаемый редактор кода на хосте для разработки приложения, работающего внутри контейнеров.

      Создайте новый файл Dockerfile:

      Скопируйте следующие строки в файл Dockerfile:

      Dockerfile

      FROM php:7.4-fpm
      
      # Arguments defined in docker-compose.yml
      ARG user
      ARG uid
      
      # Install system dependencies
      RUN apt-get update && apt-get install -y 
          git 
          curl 
          libpng-dev 
          libonig-dev 
          libxml2-dev 
          zip 
          unzip
      
      # Clear cache
      RUN apt-get clean && rm -rf /var/lib/apt/lists/*
      
      # Install PHP extensions
      RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
      
      # Get latest Composer
      COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
      
      # Create system user to run Composer and Artisan Commands
      RUN useradd -G www-data,root -u $uid -d /home/$user $user
      RUN mkdir -p /home/$user/.composer && 
          chown -R $user:$user /home/$user
      
      # Set working directory
      WORKDIR /var/www
      
      USER $user
      
      

      Не забудьте сохранить файл после завершения работы.

      Вначале наш файл Dockerfile определяет базовый образ, который мы используем: php:7.4-fpm.

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

      При этом создается новый пользователь системы и выполняется настройка его параметров с помощью аргументов user и uid в начале файла Dockerfile. Эти значения вставляются Docker Compose во время сборки.

      В заключение мы зададим рабочую директорию по умолчанию /var/www и переключимся на созданного пользователя. Это гарантирует, что вы будете подключаться как обычный пользователь и находиться в правильной директории при выполнении команд composer и artisan в контейнере приложения.

      Шаг 4 — Настройка конфигурации Nginx и файлов дампа базы данных

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

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

      Для настройки Nginx мы будем использовать файл travellist.conf, настраивающий обслуживание приложения. Создайте папку docker-compose/nginx с помощью следующей команды:

      • mkdir -p docker-compose/nginx

      Откройте в этой директории новый файл с именем travellist.conf:

      • nano docker-compose/nginx/travellist.conf

      Скопируйте следующую конфигурацию Nginx в этот файл:

      docker-compose/nginx/travellist.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 для прослушивания порта 80 и использования index.php в качестве страницы индекса по умолчанию. Это задаст корневую директорию документа /var/www/public, а затем Nginx будет настроен для использования службы app на порту 9000 для обработки файлов *.php.

      Сохраните и закройте файл после завершения редактирования.

      Чтобы настроить базу данных MySQL, мы откроем для общего доступа дамп базы данных, который будет импортирован при инициализации контейнера. Эта возможность обеспечивается образом MySQL 5.7, который мы будем использовать в этом контейнере.

      Создайте новую папку для файлов инициализации MySQL в папке docker-compose:

      • mkdir docker-compose/mysql

      Откройте новый файл .sql:

      • nano docker-compose/mysql/init_db.sql

      Следующий дамп MySQL основан на базе данных, которую мы настроили в обучающем руководстве по Laravel на LEMP. Она создаст новую таблицу с именем places. Затем таблица будет заполнена местами на основе образца.

      Добавьте в файл следующий код:

      docker-compose/mysql/db_init.sql

      DROP TABLE IF EXISTS `places`;
      
      CREATE TABLE `places` (
        `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
        `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
        `visited` tinyint(1) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
      
      INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
      

      Таблица places содержит три поля: id, name и visited. Поле visited — это флаг, используемый для отметки мест со статусом to go. Вы можете свободно изменять или добавлять места в образец. Сохраните и закройте файл после завершения.

      Мы завершили настройку файла Dockerfile приложения и файлов конфигурации служб. Далее мы выполним настройку Docker Compose для использования этих файлов при создании наших служб.

      Шаг 5 — Создание мультиконтейнерной среды с Docker Compose

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

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

      Мы определим в файле docker-compose.yml три разные службы: app, db и nginx.

      Служба app построит образ с именем travellist на базе ранее созданного файла Dockerfile. Определяемый этой службой контейнер запустит сервер php-fpm для синтаксической проверки кода PHP и возврата результатов в службу nginx, которая будет работать в отдельном контейнере. Служба mysql определяет контейнер, где запущен сервер MySQL 5.7. Наши службы будут использовать общую соединительную сеть с именем travellist.

      Файлы приложения будут синхронизироваться в службах app и nginx посредством монтирования привязок. Монтирование привязок — это полезный инструмент в средах разработки, позволяющий организовать эффективную двустороннюю синхронизацию между хостом и контейнерами.

      Создайте новый файл docker-compose.yml в корневой папке приложения:

      Обычно файл docker-compose.yml начинается с определения версии, после которого идет узел services, где определяются все службы. Общие сети обычно определяются в конце этого файла.

      Для начала скопируйте этот шаблонный код в файл docker-compose.yml:

      docker-compose.yml

      version: "3.7"
      services:
      
      
      networks:
        travellist:
          driver: bridge
      

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

      Служба app

      Служба app настраивает контейнер с именем travellist-app. Она строит новый образ Docker на базе файла Dockerfile в той же директории, что и файл docker-compose.yml. Новый образ сохраняется на локальном компьютере с именем travellist.

      Хотя корневая директория документов выдается приложением в контейнере nginx, нам нужно, чтобы файлы приложения находились внутри контейнера app, поскольку мы хотим выполнять задачи командной строки с помощью инструмента Laravel Artisan.

      Скопируйте следующее определение службы в узел services в файле docker-compose.yml:

      docker-compose.yml

        app:
          build:
            args:
              user: sammy
              uid: 1000
            context: ./
            dockerfile: Dockerfile
          image: travellist
          container_name: travellist-app
          restart: unless-stopped
          working_dir: /var/www/
          volumes:
            - ./:/var/www
          networks:
            - travellist
      

      Эти параметры имеют следующее назначение:

      • build: данная конфигурация предписывает Docker Compose построить локальный образ службы app с использованием заданного пути (контекста) и указаний из файла Dockerfile. Аргументы user и uid вставляются в файл Dockerfile для настройки команд создания пользователя во время сборки.
      • image: имя, которое будет использоваться для создаваемого образа.
      • container_name: задает имя контейнера для этой службы.
      • restart: всегда выполнять перезапуск, если служба не остановлена.
      • working_dir: задает для этой службы директорию по умолчанию /var/www.
      • volumes: создает общий том, который будет синхронизировать содержимое текущей директории с директорией /var/www внутри контейнера. Следует отметить, что это не корневая директория документов, поскольку она находится в контейнере nginx.
      • networks: настраивает службу для использования сети с именем travellist.

      Служба db

      Служба db использует готовый образ MySQL 5.7 из Docker Hub. Поскольку Docker Compose автоматически загружает файлы переменных .env, находящиеся в той же директории, что и файл docker-compose.yml, мы можем получить параметры базы данных из файла Laravel .env, созданного на предыдущем шаге.

      Добавьте следующее определение служб в узел services сразу же после определения службы app:

      docker-compose.yml

        db:
          image: mysql:5.7
          container_name: travellist-db
          restart: unless-stopped
          environment:
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
            MYSQL_PASSWORD: ${DB_PASSWORD}
            MYSQL_USER: ${DB_USERNAME}
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
          volumes:
            - ./docker-compose/mysql:/docker-entrypoint-initdb.d
          networks:
            - travellist
      

      Эти параметры имеют следующее назначение:

      • image: определяет образ Docker, который следует использовать для этого контейнера. В данном случае мы используем образ MySQL 5.7 из Docker Hub.
      • container_name: задает имя контейнера для этой службы: travellist-db.
      • restart: всегда перезапускать службу, если она явно не остановлена.
      • environment: определяет переменные среды в новом контейнере. Мы используем полученные из файла Laravel .env значения для настройки нашей службы MySQL, которая автоматически создаст новую базу данных и пользователя на базе заданных переменных среды.
      • volumes: создает том для общего доступа к дампу базы данных .sql, который будет использоваться для инициализации базы данных приложения. Образ MySQL будет автоматически импортировать файлы .sql, расположенные в директории /docker-entrypoint-initdb.d внутри контейнера.
      • networks: предписывает службе использовать сеть с именем travellist.

      Служба nginx

      Служба nginx использует готовый образ Nginx на базе облегченного дистрибутива Linux под названием Alpine. Она создает контейнер с именем travellist-nginx, и он использует определение ports для создания переадресации с порта 8000 системы хоста на порт 80 внутри контейнера.

      Добавьте следующее определение службы в узел services сразу после службы db:

      docker-compose.yml

        nginx:
          image: nginx:1.17-alpine
          container_name: travellist-nginx
          restart: unless-stopped
          ports:
            - 8000:80
          volumes:
            - ./:/var/www
            - ./docker-compose/nginx:/etc/nginx/conf.d
          networks:
            - travellist
      

      Эти параметры имеют следующее назначение:

      • image: определяет образ Docker, который следует использовать для этого контейнера. В данном случае мы используем образ Alpine Nginx 1.17.
      • container_name: задает имя контейнера для этой службы: travellist-nginx.
      • restart: всегда перезапускать эту службу, если она явно не остановлена.
      • ports: задает переадресацию портов, разрешающую внешний доступ через порт 8000 к веб-серверу на порту 80 внутри контейнера.
      • volumes: создает два общих тома. Первый из них синхронизирует содержимое текущей директории с директорией /var/www внутри контейнера. При внесении локальных изменений в файлы приложения эти изменения быстро отражаются в приложении, обслуживаемом Nginx внутри контейнера. Второй том обеспечивает копирование нашего файла конфигурации Nginx docker-compose/nginx/travellist.conf в папку конфигурации Nginx контейнера.
      • networks: предписывает этой службе использовать сеть с именем travellist.

      Готовый файл docker-compose.yml

      Так выглядит готовый файл docker-compose.yml:

      docker-compose.yml

      version: "3.7"
      services:
        app:
          build:
            args:
              user: sammy
              uid: 1000
            context: ./
            dockerfile: Dockerfile
          image: travellist
          container_name: travellist-app
          restart: unless-stopped
          working_dir: /var/www/
          volumes:
            - ./:/var/www
          networks:
            - travellist
      
        db:
          image: mysql:5.7
          container_name: travellist-db
          restart: unless-stopped
          environment:
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
            MYSQL_PASSWORD: ${DB_PASSWORD}
            MYSQL_USER: ${DB_USERNAME}
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
          volumes:
            - ./docker-compose/mysql:/docker-entrypoint-initdb.d
          networks:
            - travellist
      
        nginx:
          image: nginx:alpine
          container_name: travellist-nginx
          restart: unless-stopped
          ports:
            - 8000:80
          volumes:
            - ./:/var/www
            - ./docker-compose/nginx:/etc/nginx/conf.d/
          networks:
            - travellist
      
      networks:
        travellist:
          driver: bridge
      

      Обязательно сохраните файл после завершения.

      Шаг 6 — Запуск приложения с помощью Docker Compose

      Теперь мы используем команды docker-compose для сборки образа приложения и запуска заданных нами служб.

      Выполните сборку образа app с помощью следующей команды:

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

      Output

      Building app Step 1/11 : FROM php:7.4-fpm ---> fa37bd6db22a Step 2/11 : ARG user ---> Running in f71eb33b7459 Removing intermediate container f71eb33b7459 ---> 533c30216f34 Step 3/11 : ARG uid ---> Running in 60d2d2a84cda Removing intermediate container 60d2d2a84cda ---> 497fbf904605 Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev ... Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> e499f74896e3 Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user ---> Running in 232ef9c7dbd1 Removing intermediate container 232ef9c7dbd1 ---> 870fa3220ffa Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user ---> Running in 7ca8c0cb7f09 Removing intermediate container 7ca8c0cb7f09 ---> 3d2ef9519a8e Step 10/11 : WORKDIR /var/www ---> Running in 4a964f91edfa Removing intermediate container 4a964f91edfa ---> 00ada639da21 Step 11/11 : USER $user ---> Running in 9f8e874fede9 Removing intermediate container 9f8e874fede9 ---> fe176ff4702b Successfully built fe176ff4702b Successfully tagged travellist:latest

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

      Output

      Creating travellist-db ... done Creating travellist-app ... done Creating travellist-nginx ... done

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

      Вывод будет выглядеть следующим образом:

      Output

      Name Command State Ports ------------------------------------------------------------------------------- travellist-app docker-php-entrypoint php-fpm Up 9000/tcp travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp travellist-nginx nginx -g daemon off; Up 0.0.0.0:8000->80/tcp

      Теперь ваша среда работает, но для завершения настройки приложения нам нужно выполнить еще несколько команд. Вы можете использовать команду docker-compose exec для выполнения команд в контейнерах служб, например ls -l для отображения подробной информации о файлах в директории приложения:

      • docker-compose exec app ls -l

      Output

      total 256 -rw-rw-r-- 1 sammy 1001 738 Jan 15 16:46 Dockerfile -rw-rw-r-- 1 sammy 1001 101 Jan 7 08:05 README.md drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 app -rwxr-xr-x 1 sammy 1001 1686 Jan 7 08:05 artisan drwxrwxr-x 3 sammy 1001 4096 Jan 7 08:05 bootstrap -rw-rw-r-- 1 sammy 1001 1501 Jan 7 08:05 composer.json -rw-rw-r-- 1 sammy 1001 179071 Jan 7 08:05 composer.lock drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 config drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 database drwxrwxr-x 4 sammy 1001 4096 Jan 15 16:46 docker-compose -rw-rw-r-- 1 sammy 1001 1015 Jan 15 16:45 docker-compose.yml -rw-rw-r-- 1 sammy 1001 1013 Jan 7 08:05 package.json -rw-rw-r-- 1 sammy 1001 1405 Jan 7 08:05 phpunit.xml drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 public -rw-rw-r-- 1 sammy 1001 273 Jan 7 08:05 readme.md drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 resources drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 routes -rw-rw-r-- 1 sammy 1001 563 Jan 7 08:05 server.php drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 storage drwxrwxr-x 4 sammy 1001 4096 Jan 7 08:05 tests -rw-rw-r-- 1 sammy 1001 538 Jan 7 08:05 webpack.mix.js

      Теперь мы выполним команду composer install для установки зависимостей приложения:

      • docker-compose exec app composer install

      Вывод будет выглядеть следующим образом:

      Output

      Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 85 installs, 0 updates, 0 removals - Installing doctrine/inflector (1.3.1): Downloading (100%) - Installing doctrine/lexer (1.2.0): Downloading (100%) - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) - Installing erusev/parsedown (1.7.4): Downloading (100%) - Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%) - Installing phpoption/phpoption (1.7.2): Downloading (100%) - Installing vlucas/phpdotenv (v3.6.0): Downloading (100%) - Installing symfony/css-selector (v5.0.2): Downloading (100%) … Generating optimized autoload files > IlluminateFoundationComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully.

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

      • docker-compose exec app php artisan key:generate

      Output

      Application key set successfully.

      Откройте браузер и введите в адресную строку доменное имя вашего сервера или IP-адрес с портом 8000:

      http://server_domain_or_IP:8000
      

      Страница будет выглядеть следующим образом:

      Демонстрационное приложение Laravel

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

      • docker-compose logs nginx
      Attaching to travellist-nginx
      travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:25 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
      travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:26 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
      travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:42 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
      …
      

      Если вы хотите приостановить среду Docker Compose, сохраняя состояние всех служб, используйте команду:

      Output

      Pausing travellist-db ... done Pausing travellist-nginx ... done Pausing travellist-app ... done

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

      Output

      Unpausing travellist-app ... done Unpausing travellist-nginx ... done Unpausing travellist-db ... done

      Чтобы закрыть среду Docker Compose и удалить все ее контейнеры, сети и тома, используйте команду:

      Output

      Stopping travellist-nginx ... done Stopping travellist-db ... done Stopping travellist-app ... done Removing travellist-nginx ... done Removing travellist-db ... done Removing travellist-app ... done Removing network travellist-laravel-demo_travellist

      Обзор всех команд Docker Compose можно найти в справочном материале по командной строке Docker Compose.

      Заключение

      В этом обучающем руководстве мы настроили среду Docker с тремя контейнерами, используя Docker Compose для определения инфраструктуры в файле YAML.

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



      Source link