Docker для локальной PHP разработки
В этой статье вы узнаете, что такое Docker и как использовать его для создания переносимого образа для ваших PHP-приложений. Вы узнаете, как использовать непрерывную интеграцию и развертывание (CI/CD) для создания и развертывания образа на Heroku.
Докеризация вашего PHP-приложения полезна, потому что:
- Контейнеры портативны и могут быть мгновенно развернуты в любом месте.
- Контейнеры обеспечивают разработчикам единообразную и оптимизированную рабочую среду, которой можно легко обмениваться.
- Контейнеры — это первый шаг к запуску приложения с высокой доступностью с помощью DockerSwarm или Kubernetes.
Прочитав статью, вы узнаете, что такое Docker и как он работает. Изучите все тонкости объединения Docker с PHP, а также о том, как использовать непрерывную интеграцию и доставку для тестирования приложения, создания контейнера и его развертывания.
Что такое Докер?
Большинство разработчиков используют стек усилителей (W|L|M)в качестве отправной точки, но эта среда может очень быстро стать подавляющей. Как только вы начнете чувствовать эту боль, вы начнете использовать виртуальную среду для обмена и воспроизведения с легкостью.
Docker предоставляет нам контейнеры, которые обладают всеми необходимыми возможностями виртуализации, а также являются более легкими, чем традиционные виртуальные машины.
Что нужно для начала работы
Докер может быть установлен на большинстве платформ. Вы можете установить его из двоичного исполняемого файла или с помощью официального установщика. Если вы используете современные версии Windows или Mac, установите DockerDesktop, и все готово.
Если вы являетесь пользователем Linux, пакеты Docker популярны и обычно включены в репозиторий вашего дистрибутива. Например, установить его на Ubuntu или Debian так же просто, как:
$ apt-get update && apt-get install docker
Изображения докера
Docker основан на концепции создания образов, содержащих необходимое программное обеспечение и конфигурацию для приложений. Мы также можем создавать распространяемые образы, содержащие предварительно настроенное программное обеспечение, такое как сервер Apache, сервер кэширования, база данных MySQL и т. Д. Мы можем поделиться нашим окончательным изображением на DockerHub, чтобы сделать его доступным для всех.
Работа с изображениями Docker
Мы можем перечислить доступные изображения на нашем компьютере, выполнив команду dockerimages.
Контейнеры Docker
Мы можем сравнить изображение Docker с определением класса. Мы определяем его свойства и поведение. Контейнеры-это экземпляры, созданные из этого класса. Мы можем создать несколько экземпляров одного и того же изображения. Команда dockerps выводит список контейнеров, запущенных на компьютере. На данный момент у нас нет никаких контейнеров, поэтому давайте создадим новый:
Из выходных данных видно, что контейнер имеет идентификатор и имя. Давайте создадим еще один контейнер и назовем его:
Теперь мы можем получить доступ к нашему контейнеру, выполнив команду bash и прикрепив ее к нашему терминалу:
Чтобы избежать загрязнения нашего компьютера неиспользуемыми контейнерами, обязательно удалите старые:
Поскольку наш контейнер является сервером Apache, имеет смысл иметь доступ к нему через браузер. При создании образа нам нужно убедиться, что он открыт через определенный порт, мы рассмотрим это более подробно в разделе Dockerfiles.
Мы можем получить IP-адрес нашего контейнера с помощью dockerinspect:
Последняя часть состоит в том, чтобы сопоставить сервер Apache для запуска нашего приложения вместо домашней страницы Apache по умолчанию. Это означает, что нам нужно синхронизировать папку приложения с корневой папкой сервера (/var/www/html). Мы можем сделать это, используя опцию-v. Вы можете прочитать больше о томах контейнеров в документации Docker:
Всегда полезно взглянуть на описание изображения в DockerHub и прочитать инструкции о том, как правильно создавать контейнеры из изображения.
Работа с файлами Dockerfiles
Ранее мы упоминали, что каждый может создать образ Docker и поделиться им в центре Docker, и что файлы Docker являются основным инструментом для достижения этой цели. Мы посмотрим, как мы можем настроить наш собственный образ и сделать его соответствующим нашим потребностям. Список доступных команд можно найти в документации.
Измените один каталог на корневой каталог репозитория:
$ cd ..
Образ php:7.4-apache устанавливает общий каталог Apache в /var/www/html. Однако в этом случае, следуя соглашениям Laravel, нам нужно установить его в /var/www/public. Одним из способов достижения этой цели является настройка конфигурации виртуального хоста. Создайте файл 000-default.conf со следующим содержимым:
Apache по умолчанию прослушивает порт 80 (HTTP), это не проблема при запуске сервера на вашем компьютере. Но некоторые облачные провайдеры требуют, чтобы контейнеры использовали разные порты.
Мы создадим скрипт для динамического переопределения порта Apache при запуске контейнера. Создайте файл с именем start-apache со следующим содержимым:
И убедитесь, что файл является исполняемым:
Мы собираемся создать готовый к производству образ. Создайте файл с именем Dockerfile. Мы будем использовать предложение FROM для использования официальных изображений phpapache в качестве отправной точки:
Теперь нам нужно СКОПИРОВАТЬ файл в изображение:
…
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
…
Laravel требует, чтобы плагин mod_rewriteApache был включен, мы можем сделать это с помощью утилиты a2enmod. С помощью RUN мы запускаем команды внутри контейнера:
…
RUN a2enmod rewrite
…
Чтобы получить исходные файлы внутри контейнера, мы можем снова использовать команду КОПИРОВАНИЯ:
…
COPYsrc /var/www/
RUNchown-R www-data:www-data /var/www…
Последнее, что нам нужно сделать, это запустить сервер Apache в фоновом режиме. Команда CMD должна использоваться только один раз в файле Dockerfile, и она должна иметь следующую форму:
CMD [«executable»,»param1″,»param2″]
Мы вызовем сценарий запуска, который мы создали ранее:
…
CMD [«start-apache»]
Окончательный файл Dockerfile должен выглядеть следующим образом:
Полезные команды
Хотя наш образ готов, мы рассмотрим некоторые команды, которые могут быть полезны для многих проектов. Что, если бы мы хотели установить Node.js чтобы управлять нашими передними активами?
Это позволит установить Node.js и менеджер npm в нашем образе. Мы можем использовать команду RUN много раз в одном и том же файле Dockerfile, потому что Docker хранит историю создания нашего образа. Каждая команда ЗАПУСКА хранится как фиксация в истории управления версиями.
Еще одна полезная команда-ENV. Он позволяет нам установить переменную среды в процессе сборки, а также будет присутствовать при создании контейнера. Обязательно ознакомьтесь с полным списком поддерживаемых команд в документации.
Построение образа
Если вы ранее извлекли базовый образ, он будет загружен с вашего компьютера вместо повторной загрузки. Это означает, что процесс сборки не займет много времени. Наша папка содержит файл Dockerfile, файл 000-default.conf и файл start-apache. Команда dockerbuild создаст файл Docker внутри текущего каталога:
Если мы сейчас перечислим наши образы Docker, мы увидим наш новый встроенный образ:
В настоящее время у нашего изображения нет имени, опция-t позволяет нам указать хранилище изображений и тег. Давайте пометим изображение собственным именем. Синтаксис таков:
$ dockertagSOURCE_IMAGE:TAGTARGET_IMAGE:TAG
Для изображения, которое мы только что создали, мы можем использовать:
$ dockertag 19c684978566 YOUR_DOCKERHUB_USER/semaphore-demo-php-unsplash
Использование имени пользователя DockerHub необязательно. Мы должны использовать его только при переносе изображения в реестр. Поскольку мы сделаем это в следующий раз, мы можем также пометить изображение окончательным именем прямо сейчас.
Наше изображение теперь помечено и помечено:
DockerCompose
Использование терминалов и запоминание команд не очень практично для создания контейнеров приложений и быстрого начала работы. DockerCompose использует файлы YAML для настройки и запуска контейнеров. Это означает, что мы можем отправить файл Dockerfile нашего приложения для создания среды и использовать файл docker-compose.yml для запуска контейнеров.
Первым шагом является установка DockerComposer на нашу машину. Следуйте инструкциям в документации Docker, прежде чем выполнять следующие действия.
Мы будем использовать docker-compose для запуска приложения внутри контейнера. Это ускорит разработку, поскольку мы сможем настроить нашу рабочую среду без необходимости установки или настройки сервера Apache.
Мы сопоставим файлы исходного кода с www-корнем контейнера, таким образом, нам не придется перестраивать образ Docker во время кода.
Создайте файл docker-compose.yml со следующим содержимым:
Это позволит создать наш образ, используя другой файл Dockerfile, предназначенный только для разработки, называемый Dockerfile.развитие. Если у вас уже есть образ, созданный локально или на концентраторе Docker, вы можете использовать вместо этого свойство image:
В службе webapp мы определим открытые порты, тома и, возможно, некоторые переменные среды.
Окончательный docker-compose.yml выглядит следующим образом:
В дополнение к переменным Laravel и Apache мы устанавливаем ключ доступа Unsplash из переменных среды, поэтому наше приложение запускается с правильными маркерами API.
Создайте новый файл с именем Dockerfile.development:
Основное отличие заключается в том, что Apache запускается с теми же идентификаторами пользователей и групп, что и ваш собственный—если разрешения не совпадают, приложение не будет запущено. Проверьте идентификатор пользователя и идентификатор группы на вашем компьютере ($UID) и идентификатор ГРУППЫ ($GID) и при необходимости замените номера.
Теперь мы можем запустить docker-composer для создания нашего контейнера. Команда прикрепит вывод контейнера к терминалу, и нам нужно будет нажать ctrl+c, чтобы выйти. Мы можем избежать этого, используя опцию-d (docker-composerup-d). Если у нас есть несколько служб, мы можем указать, какая из них (сервер docker-composerup). Наконец, добавьте все новые файлы в свой репозиторий:
























