В нашем недавнем конкурсе мы получили много отличных работ, чтобы найти лучший совет, позволяющий максимально использовать облачные сервисы Alibaba. Для наших судей было забавно, но сложно выбрать победителей среди множества полезных и интересных работ. Но, увы, после ожесточенных обсуждений и жарких споров они решили, что первый приз конкурса достанется Мадьяру Андрасу, который представил этот совет о развертывании приложения Laravel в Alibaba Cloud Container Service с помощью Docker. Это всестороннее руководство, демонстрирующее использование нескольких соответствующих технологий — Docker, Laravel, Apache, Redis, Git и связывающее службу облачных контейнеров Alibaba, реестр контейнеров , виртуальное частное облако Alibaba и управление доступом к ресурсам .
В этом руководстве мы развернем приложение Laravel, используя Docker и Alibaba Cloud Container Service .
Предпосылки
Прежде чем начать это руководство, вам понадобится следующее:
- Docker установлен на вашем локальном компьютере (если вы не можете установить последнюю версию, вы можете использовать Docker Toolbox )
- Композитор установлен на вашем компьютере
Подготовка приложения к развертыванию
Прежде всего, вам нужно приложение Laravel, которое вы можете Dockerize. Вы можете просто скопировать мой пример из GitHub и отправить его в свой собственный репозиторий git или создать новое приложение Laravel, используя Composer, с помощью следующей команды: composer create-project --prefer-dist laravel/laravel appname
Нам нужно добавить несколько файлов в корень приложения Laravel.
Вы должны создать файл конфигурации среды для производственной среды, назовем его .env.prod. Вы можете скопировать свой существующий файл .env, но не забудьте изменить значения (например, установить APP_ENV в рабочий режим).
Нам также понадобится файл конфигурации для веб-сервера (мы будем использовать Apache), создайте файл vhost.conf для нашего виртуального хоста.
<VirtualHost *:80>
DocumentRoot /app/public
<Directory "/app/public">
AllowOverride all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Для сборки нашего контейнера нам нужен Dockerfile, мы будем использовать многоэтапную сборку:
#Install the dependencies using composer
FROM composer:1.7 as build
WORKDIR /app
COPY . /app
RUN composer install
COPY .env.prod .env
#Application
FROM php:7.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
EXPOSE 80
COPY --from=build /app /app
COPY vhost.conf /etc/apache2/sites-available/000-default.conf
RUN chown -R www-data:www-data /app \
&& a2enmod rewrite
Нам также необходимо исключить некоторые файлы и папки из контейнера, поэтому вы должны создать файл .dockerignore (вы можете расширить этот список, если хотите):
.git/
vendor/
node_modules/
yarn-error.log
Создание репозитория в реестре облачных контейнеров Alibaba
В облачной консоли Alibaba выберите «Продукты»> «Эластичные вычисления»> «Реестр контейнеров» .
Во-первых, вам нужно установить пароль для входа в реестр.
Мы должны создать пространство имен, затем мы можем создать репозиторий для приложения.
Убедитесь, что вы установили тип репозитория Private, в противном случае репозиторий будет доступен без пароля. Вы также можете выбрать регион вашего хранилища.
Реестр контейнеров поддерживает GitHub, GitLab и Bitbucket в качестве исходного кода, который действительно полезен. Если вы используете один из них, вы можете выбрать его, но для простоты мы будем использовать опцию Локальный репозиторий в этом руководстве.
Вам нужно собрать контейнер на локальном компьютере и перенести его в реестр (если вы выберете Git-хостинг, Registry Container автоматически создаст контейнеры, поэтому вы можете пропустить эти шаги).
Запустите следующую команду в корне вашего приложения Laravel, чтобы построить контейнер (вы можете заменить тег test / laravel: 1.0 своим собственным).
docker build -t test/laravel:1.0 .
Если вы нажмете «Управление» справа от своего хранилища в Реестре контейнеров, вы сможете найти адрес своего хранилища и руководство о том, как войти в реестр и отправить изображение в хранилище.
Таким образом, вы должны выполнить следующие команды, но с вашим собственным регионом, пространством имен и хранилищем:
docker login --username=[email protected] registry-intl.eu-central-1.aliyuncs.com
docker tag test/laravel:1.0 registry-intl.eu-central-1.aliyuncs.com/ma_test/laravel1:1.0
docker push registry-intl.eu-central-1.aliyuncs.com/ma_test/laravel1:1.0
После успешного нажатия на изображение вы увидите его на вкладке «Теги».
Создание VPC
На консоли Alibaba Cloud Console выберите Продукты> Сеть> Виртуальное частное облако и активируйте VPC.
Выберите свой регион в верхнем меню и создайте VPC и VSwitch.
Создание кластера
Сначала необходимо активировать ОЗУ (« Продукты»> «Мониторинг и управление»> «Управление доступом к ресурсам» ), затем перейдите к « Продукты»> «Эластичные вычисления»> «Служба контейнеров» .
Контейнерный сервис поддерживает как Swarm, так и Kubernetes. Теперь мы будем использовать Swarm, поэтому вы должны выбрать Swarm в левом меню.
Нажмите кнопку «Создать кластер» и настройте свой кластер (не забудьте выбрать тот же регион, который вы выбрали для своего VPC).
Для демонстрации я выбрал 2x (2 узла) 1 Core 1GB ECS , но вы можете выбрать другую конфигурацию, если хотите.
В разделе «Вход» необходимо создать ключи SSH или установить пароль. Я настоятельно рекомендую ключи SSH, но для простоты вы можете сейчас использовать пароли.
Закончив настройку, вы можете нажать кнопку «Создать» (откроется диалоговое окно подтверждения с информацией о ценах).
Когда создание кластера завершится, и вы увидите свой кластер в списке кластеров, нажмите «Управление».
Вам необходимо войти в свой личный репозиторий, чтобы получить доступ к изображениям, поэтому нажмите кнопку «Войти в концентратор». Если вы не знаете, что такое доменное имя репозитория, перейдите на панель управления «Реестр контейнеров» и нажмите «Управление» справа от вашего репозитория. Скопируйте адрес VPC (например: registry-intl-vpc.eu-central-1.aliyuncs.com/ma_test/laravel1
Ваше имя пользователя и пароль — это имя пользователя и пароль вашего реестра.
Теперь узлы кластера могут получить ваш образ из частного хранилища.
Развертывание приложения
На панели управления «Контейнерная служба» нажмите «Приложения» в левом меню, затем нажмите «Создать приложение».
Установите имя и версию, проверьте Pull Docker Image (это гарантирует, что вы обязательно получите последнюю версию), затем нажмите кнопку «Создать с изображением».
Выберите ваше изображение (во всплывающем окне вы можете найти ваши изображения на вкладке «Пользователь») и версию. В разделе «Сеть» в разделе «Веб-маршрутизация» нажмите на синий символ «плюс». Для порта контейнера введите 80. Для Домена введите, как бы вы его называли. Вы также можете установить количество экземпляров (Scale).
Нажмите «Создать», затем нажмите «Просмотреть список приложений». В разделе Приложения вы должны увидеть свой новый контейнер. Нажмите на контейнер, во вкладке сервисов снова нажмите на название контейнера. Теперь вы увидите некоторую информацию о вашем контейнере. Нажмите на URL-адрес конечной точки доступа, и вы увидите домашнюю страницу приложения Laravel.
Подключение приложения к MySQL и Redis
Нам понадобится база данных SQL и база данных сеансов (мы будем использовать Redis), поэтому нам нужно настроить эти службы и настроить соединения.
Перейдите в Продукты> ApsaraDB> ApsaraDB для Redis . В верхнем меню выберите регион, где находится ваш VPC. Создайте экземпляр, который соответствует вашим потребностям (вы можете использовать экземпляр 4G Master-Slave бесплатно в течение одного месяца). После того, как ваш экземпляр создан и вы можете увидеть его в списке экземпляров, нажмите «Управление». В левом меню выберите «Настройки белого списка» и измените значение по умолчанию на 0.0.0.0/0, чтобы разрешить подключения со всех компьютеров в VPC, или вы можете добавить диапазон частных IP / IP ваших экземпляров ECS.
В левом меню выберите «Информация об экземпляре» и скопируйте адрес подключения. На вашем локальном компьютере откройте файл .env.prod и установите хост и пароль для Redis.
Аналогично этому:
REDIS_HOST=r-4xoba5b097200b94.redis.germany.rds.aliyuncs.com
REDIS_PASSWORD=my-password
REDIS_PORT=6379
You should set the cache and session drivers to redis:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
Laravel нужен пакет с именем predis для взаимодействия с Redis.
На вашем локальном компьютере выполните следующую команду, это установит predis и добавит его в список зависимостей:
composer require predis/predis
Мы настроили соединение Redis, но перед развертыванием нового контейнера мы также настроим соединение MySQL.
Перейдите в Продукты> ApsraraDB> ApsaraDB для RDS . В верхнем меню выберите регион, где находится ваш VPC. Создайте экземпляр, который соответствует вашим потребностям (вы можете использовать бесплатный экземпляр на один месяц с 1-ядерным процессором, 1 ГБ памяти, 20 ГБ памяти).
После того, как ваш экземпляр создан, и вы можете увидеть его в списке экземпляров, нажмите «Управление». В левом меню выберите Security и измените белый список аналогично тому, как мы делали это с Redis. Вы должны создать учетную запись базы данных и базу данных, предоставить пользователю право на чтение и запись.
В левом меню выберите «Параметры подключения» и скопируйте адрес интрасети (хост).
На вашем локальном компьютере вы должны отредактировать настройки подключения к базе данных в вашем файле .env.prod. Аналогично этому:
DB_CONNECTION=mysql
DB_HOST=rm-4xo3wjj1wh2nwi7yn.mysql.germany.rds.aliyuncs.com
DB_PORT=3306
DB_DATABASE=laravel1
DB_USERNAME=laravel1
DB_PASSWORD=my-password
Развертывание новой версии приложения
Создайте контейнер и отправьте его в реестр:
Вы должны запустить команды, подобные этим (заменить регион и т. Д.):
docker build -t test/laravel:1.1 .
docker tag test/laravel:1.1 registry-intl.eu-central-1.aliyuncs.com/ma_test/laravel1:1.1
docker push registry-intl.eu-central-1.aliyuncs.com/ma_test/laravel1:1.1
Перейдите в « Служба контейнеров»> «Приложения» , вы должны увидеть свое приложение в списке и нажать «Обновить». Измените значение поля версии и в файле (шаблоне) yaml измените изображение.
Например, замените registry-intl-vpc.eu-central-1.aliyuncs.com/ma_test/laravel1:1.0
registry-intl-vpc.eu-central-1.aliyuncs.com/ma_test/laravel1:1.1
Нажмите кнопку ОК, и контейнер будет заменен на новый. Вы можете использовать сине-зеленую политику выпуска, если хотите.
Теперь ваше приложение может подключаться к Redis и MySQL. Если вы хотите запустить миграцию базы данных, вы можете нажать на приложение, на вкладке «Сервисы» снова нажать на название приложения, выбрать контейнер и нажать «Веб-терминал». Вы должны выполнить следующие команды:
cd /app
php artisan migrate
Примечание. Если при попытке выполнить миграцию вы получили указанный ключ слишком долго , вы можете найти решение здесь .
Добавьте свое доменное имя в кластер
Перейдите в Приложения на панели управления Контейнерной службой и нажмите на обновление справа от вашего приложения. В файле yaml добавьте свой домен в aliyun.routing.port_80
Вы можете разделять значения точками с запятой, например: aliyun.routing.port_80: laravel1;yourdomain.com
Перейти к списку кластеров в панели управления службы контейнера. Нажмите на управление в правой части кластера. Нажмите на Настройки балансировки нагрузки, теперь вы можете увидеть идентификатор балансировщика нагрузки. Перейдите в Продукты> Сеть> Балансировщик нагрузки сервера , скопируйте IP-адрес своего балансировщика нагрузки и добавьте в свои записи DNS.
Вы также можете добавить сертификат TLS в балансировщик нагрузки.
Использовать сервис хранения объектов
Вы, вероятно, хотите хранить файлы, поэтому вам нужна Alibaba Cloud Object Storage Service. Вы можете создать корзину и подключить свое приложение к сервису, используя следующие официальные библиотеки:
Вывод
Вы успешно контейнировали и развернули приложение Laravel в службе контейнеров и настроили несколько облачных служб Alibaba для совместной работы, чтобы обеспечить масштабируемую и надежную инфраструктуру для вашего приложения. Я надеюсь, что этот урок был полезен для вас!